CTF伪协议+preg_replace()函数的代码执行
一道学习中所遇到的ctf
步骤:
我们点击题目链接,然后在页面先点击”云平台后台管理中心“
然后url后面跟了参数page,题目提示了一个文件包含,我们试试index.php
看到了输出了ok,应该是进行了当前目录下的文件读取,也就造成了文件包含,我们在试试用file读取windows的固定文件
c:/windows/win.ini
但是现在我们并不知道路径以及当前目录下的flag文件的文件名,输入index.php不能打开文件内容,但是输出了ok,那么出题者思路应该 是让我们把index.php打开来审计。既然存在了文件包含,可以成功执行file伪协议,那么我们尝试一下php伪协议,有一个用法是读取php文件内容
payload是:?page=php://filter/read=convert.base64-encode/resource=xxx.php,将xxx.php换成index.php
成功执行了此协议,此php协议的用法是将index.php文件读取并以base64显示出来,直接拿去base64解码
解出来还有很多html代码,但是php的就这一段,首先要让请求头里面的x-forwarded-for的值为”127.0.0.1“
那么我们先用burp抓个包并发送到repeater,
发现并没有x-forwarded-for服务,那么我们加上”x-forwarded-for: 127.0.0.1“,如果成功则返回:
”Welcome My Admin ! Please include me in!“字样
发现成功回显,那么我们在看看下面的代码,先让if生效,将所需的get参数全部加上,然后看到了preg_replace()函数,就是php中匹配正则表达式的函数,函数里面的参数值分别由三个get参数传参。
而preg_replace()函数里面的第一个和第二个参数存在一个代码执行漏洞,第一个参数的值是一个正则表达式,只要这个值等于:/(.*)/e,那么第二个参数就可以进行代码执行,且第三个参数可以是任意值。
这就是preg_replace的"/e"漏洞
这三个参数可以 通过get请求的参数传参,因此我们对三个get请求参数的值改成这样:?pat=/(.*)/e&rep=phpinfo()&sub=ab
成功代码执行
现在我们读目录文件,直接用system()函数
这就知道了隐藏flag的文件的路径和文件名了,原来整个这么复杂的文件名,猜是肯定猜不到的
接下来直接利用此题的文件包含漏洞读取文件,可以用file协议加文件的整个路径,也可以page后面直接跟文件名读取,txt文件应该可以直接读出内容,因为刚刚试了page后面跟的文件是对当前目录下的文件读取。
成功读取出flag!
本篇贴子只为记录学习而写,总结的思路如果有问题请指明,谢谢各位大佬!