Tuuu Nya's Blog

截断在文件包含和上传中的利用

字数统计: 1.1k阅读时长: 4 min
2016/06/16 Share

本文转自http://www.joychou.org/index.php/web/truncated.html

截断大概可以在以下情况适用

  • include(require)
  • file_get_contents
  • file_exists
  • 所有url中参数可以用%00控制

0x01. 本地文件包含

1.1 截断类型:php %00截断

截断条件:

php版本小于5.3.4 详情关注CVE-2006-7243
php的magic_quotes_gpc为OFF状态
漏洞文件lfi.php

要include的password文件

Password

利用代码:lfi.php?action=password%00
注意:url正宗%00是被会url解码成0x00,所以可能导致截断。

password文件被成功包含并且执行phpinfo()函数。

如果没有截断条件,lfi.php就只能包含php扩展名的文件。
相反,如果有截断条件,lfi.php可以包含任意文件的扩展名。

当把magic_quotes_gpc打开,php版本依然是5.2.9时,再测试,结果%00被转义成了0两个单体字符,不再具有截断功能。

2571962794

原因是:当打开magic_quotes_gpc时,所有的 ‘(单引号),”(双引号),(反斜线)和 NULL字符(%00)都会被自动加上一个反斜线进行转义。还有很多函数有类似的作用 如:addslashes()mysql_escape_string()mysql_real_escape_string()

当把magic_quotes_gpc关闭,php版本依然是5.3.10时,依然不能截断。所以证明,php版本和gpc两个条件都必须满足,才能截断。

除了上面的include、require、include_once、require_once还有file_get_contents也能配合php %00利用。

FileGetContents.php

利用方式:
http://www.victim.com/FileGetContents.php?file=password%00

此时可以看到当前目录put.txt是上面password中的内容。

Password

1.2 文件路径长度截断

除了1.1说的%00可以截断,还可以用字符.或者/.,或者./(注意顺序)来截断,不能纯用/,至于为什么,不能用其他字符,想必应该和php实现有关。

系统文件路径长度限制:

windows 259个bytes
linux 4096个bytes
具体可以看这篇文章:http://joychou.org/index.php/Misc/filename-length-limit-on-windows-linux.html

截断条件:

php版本为5.3.4以下(具体哪个版本不是很清楚,乌云上kukki写的5.2.8以下,这明显是不对的,因为我测试用的5.2.9)
GPC是否开启没关系
漏洞代码lfi.php,和1.1中的lfi.php一样

在windows下需要.字符最少的利用POC:

lfi.php?action=password..............................................................................................................................................................................................................................................

成功包含,执行password里面的phpinfo函数

3658959734

加上根目录路径一共为258个字节。所以需要的最少的.数为
258 - (lfi.php文件的路径长度即C:/wamp/www/+strlen(‘password’))

2602540178

或者用./截断,最短的POC为,并且最短路径长度为258

lfi.php?action=password./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

将password文件名改为password123后,最短的POC为,最短路径长度依然为258

lfi.php?password123/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

注意这两者一个是/开始,一个是.开始,这和路径长度的奇偶有关系,真正遇到这样的情况,就丢很长的/.,最后再跳整下第一个/或者.即可。

linux就自行测试吧。

0x02. 文件上传

截断类型:php的%00截断。所以截断的条件依然是php %00截断的条件

  • php版本5.3.4以下
  • gpc关闭

测试环境:

  • php版本5.2.9
  • gpc关闭
  • 漏洞代码 upload.php
 File Upload Vulnerability 

文件:

这个漏洞代码是我YY的,可能实际情况不一定能够用上。只是证明截断可以达到上传的功能。

先将一个php木马重命名为上面扩展名为白名单的后缀,比如.jpg

访问:http://www.victim.com/upload.php?jieduan=xxoo.php%00

点击submit按钮,就在server上生成了一个xxoo.php的马。

4104828080

0x03. file_exists判断文件是否存在

file_exists在判断文件存在的时候也有被截断的现象。

截断条件:

  • php版本小于5.3.4
  • GPC关闭状态
  • 漏洞代码如下,和CVE-2014-8959 phpmyadmin的这个漏洞一样。

当前目录存在一个shell.jpg文件,此时访问?file=shell.jpg%00,返回结果是文件存在。

有一个小技巧:

当上面文件第五行变成$filename = 'xxoo' . $file . '.php';,如果仍然要用shell.jpg,那么只需这样构造:?file=/../shell.jpg%00,利用/../回到当前目录。

在php中一些目录切换

  • ../表示上一层目录
  • ./表示当前目录
  • /单独使用不能表示当前目录,只用xx/这样才能表示xx这个目录

参考文章

原文作者:Tuuu Nya

原文链接:http://www.hackersb.cn/code/145.html

发表日期:June 16th 2016, 5:41:00 pm

更新日期:May 15th 2019, 4:31:49 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 0x01. 本地文件包含
    1. 1.1. 1.1 截断类型:php %00截断
    2. 1.2. 1.2 文件路径长度截断
    3. 1.3. 0x02. 文件上传
    4. 1.4. 0x03. file_exists判断文件是否存在