提示
- call_user_func()函数
- 先通过php内置函数来进行代码审计
- 绕过system(##不止一种方法)
拿到题目养成一个好的习惯先抓个包
从抓到的包以及它首页的报错来看,这里死活会post传输两个参数func以及p
func传输函数,而p则是传输参数的内容
这里直接尝试system读取文件列表
从返回页面来看,对func做了防护的测试一下哪些可以用
####这里其实可以通过一个php的特性绕过直接执行命令,但是还是先按着作者的想法来做
随便输了几个函数,他这里就报出了call_user_func()
call_user_func()这里似乎是利用的这个函数然后执行用户输入的然后去调用内部函数
#####本文最后做了简单的讲解
首先应该通过php内置函数来尝试读取index.php页面
这里可以使用highlight_file()高亮显示页面或者file_get_contents()来读取文件
####这里注意,此页面每五秒会刷新一次
这里过滤的还是很完整,基本上所有的命令执行函数都过滤干净了了
这里我的思路是通过反序列化传入参数绕过网站对func的防护,通过反序列化后执行system函数
先随便去找个在线php做一个序列化出来
首先我们知道了他接收参数的变量是func和p那么序列化也得一样,类也得一样(class Test)
这里url编码了一下应为怕有些编码不识别
<?php
class Test {
var $p = "ls /";
var $func = "system";
}
echo urlencode(serialize(new Test()));
?>
到这一步就可以进行的命令执行了
O%3A4%3A%22Test%22%3A2%3A%7Bs%3A1%3A%22p%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A4%3A%22func%22%3Bs%3A6%3A%22system%22%3B%7D
这里直接去找了根目录找flag但是没有
尝试使用find去找
找到flag位置直接去读取
/tmp/flagoefiu4r93
####注意,服务器运行的很慢,使用find函数需要等待服务器查找一会儿
获得flag
现在来说第二种方法
在php里反斜杠\会被认定为特殊字符,如果在system中加上反斜杠例如\system就会绕过验证
通过此方法也可以成功获得shell来获取flag
关于call_user_cunc()
call_user_func函数类似于一种特别的调用函数的方法,它可以调用php内部函数也可以调用用户自定定义的函数
例如:
<?php
function barber($type)
{
echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>以上示例会输出:
You wanted a mushroom haircut, no problem You wanted a shave haircut, no problem
其余更详细内容可自行去参考php官方内容