[BUUCTF 2018]Online Tool

题目链接:[BUUCTF 2018]Online Tool

打开环境,如下所示。

直接得到源码,如下。

<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

if(!isset($_GET['host'])) {
    highlight_file(__FILE__);
} else {
    $host = $_GET['host'];
    $host = escapeshellarg($host);
    $host = escapeshellcmd($host);
    $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
    echo 'you are in sandbox '.$sandbox;
    @mkdir($sandbox);
    chdir($sandbox);
    echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}

可以留意到,源码中,用户可控的变量按顺序经过了 escapeshellarg 函数与 escapeshellcmd 函数处理,这就会出现问题。

即,对于单个的单引号,escapeshellarg 函数转义后,还会在左右各加一个单引号,但 escapeshellcmd 函数是直接加一个转义符。对于成对的单引号,escapeshellcmd 函数默认不转义,但 escapeshellarg 函数转义。当用户单独使用 escapeshellarg 函数或 escapeshellcmd 函数处理变量,都不会发生问题,但同时使用这两个函数时,就可能会出现单引号逃逸的情况,最终让用户可控 shell 的参数。

同时,nmap 存在 -oG 选项,即,将命令及命令的输出写入到文件中。

因此最终 Payload:?host=' <?php echo `cat /flag`;?> -oG test.php '

参考:

posted @ 2024-11-17 23:37  imtaieee  阅读(73)  评论(0编辑  收藏  举报