提示
- 利用nmap上传文件
首先进行代码分析:
首先是进行判断http信息头里是否在HTTP_X_FORWARDED_FOR并且是否有参数 $_SERVER[“HTTP_X_FORWARDED_FOR”] 的值才是客户端真正的IP(如果是多层代理,该值可能是由客户端真正IP和多个代理服务器的IP组成,由逗号“,”分隔)
例如:user_agent:******这样的
这里首先判断是否存在host(这里使用的是!isset()),存在host则进入下一步escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。 反斜线(\)会在以下字符之前插入:
&#;`|*?~<>^()[]{}$\
、\x0A
和\xFF
。'
和"
仅在不配对儿的时候被转义。在 Windows 平台上,所有这些字符以及%
和!
字符前面都有一个插入符号(^
)。 escapeshellarg() 将给字符串增加一个单引号并且能引用或者转义任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含exec()、system() 和执行运算符 。 在 Windows 上,escapeshellarg() 用空格替换了百分号、感叹号(延迟变量替换)和双引号,并在字符串两边加上双引号。此外,每条连续的反斜线(\
)都会被一个额外的反斜线所转义。 这里用的两个函数其实就是确保命令到system或者exec里执行时是安全的然后这里会用刚开始获取的http头信息和密匙(glzjin作为密匙)一起md5加密
然后会把出来的MD5值作为名字创建文件夹然后改变目录到此文件夹
将全部解读一遍后我们的解题思路就出来了
- 刚开始HTTP_X_FORWARDED_FOR的会获取真实的客户端ip值会和glzjin一起md5加密作为我们后续上传webshell的路径
- 传入host参数通过此传参点来利用nmap上传文件(文件内容 -oG 文件名.文件后缀)
应为到最后会将"nmap -T5 -sT -Pn --host-timeout 2 -F "和host直接连起来执行
所以最后的payload应该是:' <?php eval($_POST["a"]);?> -oG 1.php '
通过host传入后还返回了这个sandbox的值
直接蚁剑去连