【文件包含】速览
【文件包含】学习
关于文件包含漏洞的简略学习
一、引例
首先使用php搭建一个网站,网站目录及包含文件如下:
直接url中访问info.txt:
只能看到info.txt的内容,是phpinfo()函数。
查看test.php内容:
使用GET方法传进了filename,然后使用include方法进行文件包含操作。
在url中传入info.txt参数看看什么效果:
可见info.txt中的代码被执行了。
因此可以初步判断include操作是将文件中的内容当做代码来执行。
二、本地包含和远程包含
-
本地跨目录包含
将Info.txt放在www根目录下,此时如果需要包含该文件则输入url为:
http://127.0.0.1/include/test.php?filename=./info.txt
./为跨越的目录级数,././则跨越两级目录。效果如下:
如果代码中存在文件名限制,比如强制只能包含html文件:
include(filename.'.html');
可以使用截断符%00
?filename=info.txt%00
或者长度截断:
?filename=info.txt.................
其中windows点号需要长于256,linux点号长于4096。
-
远程包含
如果网站支持远程包含:
那么请求的url中可以换成对应远程网站中的txt文件。
三、文件包含+伪协议
-
各种伪协议的用法:
协议的使用条件及用例:
-
file协议:用于直接访问本地文件系统
-
php协议:常用php://filter(读取源码)和php://input(执行php代码)
-
php://filter:
#用法,使用base64编码 php://filter/read=convert.base64-encode/resource=[文件名] #实例 http://127.0.0.1/include/test.php?filename=php://filter/read=convert.base64-encode/resource=test.php
解码后即可看到test.php源码
-
php://input:
#用法 php://input + [POST DATA] #用例 http://127.0.0.1/include/test.php?filename=php://input {POSTDATA部分} <?php system("ver");?>
可以直接执行php代码
-
-
data协议
http://127.0.0.1/include/test.php?filename=data://text/plain,<?php%20phpinfo();?> 或者 http://127.0.0.1/include/test.php?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
四、演示案例
-
南邮CTF签到题
网站地址:http://4.chinalover.sinaapp.com/web7/index.php
因为题目啥条件也没有,观察url之后感觉可能是一个文件包含题目。
直接在url中输入show.php也可以访问:
使用filter协议拿源码看看:
可以拿到,然后进行解码:
flag直接出现了。。
五、防护
- 固定文件后缀
- 固定文件
- 使用WAF
- 直接关闭allow_url_include功能