文件名截断漏洞原理分析

来源:互联网 发布:淘宝直通车删除计划 编辑:程序博客网 时间:2024/04/29 11:29

文件名截断漏洞原理分析

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版本上测试通过。

0 0