p师傅前几天的小密圈的一个问题,这是一个经典的配置文件写入问题漏洞:
|
|
config.php的内容:
要求是getshell,这个场景十分的经典,经常用在修改配置文件写入的时候。
首先说说这几个函数:
1、addslashes()
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)
NULL
注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
2、file_get_contents()
file_get_contents() 把整个文件读入一个字符串中。
file_get_contents(path,include_path,context,start,max_length)
3、preg_replace()
preg_replace(),执行一个正则表达式的搜索和替换
4、file_put_contents
file_put_contents() 函数把一个字符串写入文件中。
file_put_contents(file,data,mode,context)
0x01 利用反斜线
输入:\’;phpinfo();//
则config.php文件修改为:
\’经过addslashes()之后变为\\’,随后preg_replace会将两个连续的\合并为一个,也就是将\\’转为\‘,这样我们就成功引入了一个单引号,闭合上文注释下文,中间加入要执行的代码即可。
看来是preg_replace函数特性。经测试,该函数会针对反斜线进行转义,即成对出现的两个反斜线合并为一个。
这是xdebug分析的跳转:
0x02 利用正则匹配缺陷和换行符%0a
分两次进行请求:
1、第一次传入aaa’;phpinfo();%0a//,即:
此时config.php文件变为:
调试过程如下:
2、第二次传入随意的字符
例如bbb正则代码.*会将匹配到的aaa\替换为bbb
调试过程如下:
此时config.php内容变为
0x03 利用%00
仍然分为两步:
1、第一次传入;phpinfo();,即:
调试如下:
config.php的内容变化:
2、第二次传入%00
%00被addslashes()转为\0,而\0在preg_replace函数中会被替换为“匹配到的全部内容”
此时preg_replace要执行的代码如下
或
即执行:
调试过程:
config.php的变化: