cthub技能树_web_RCE之命令注入
命令注入
进入题目,题目中给出了源码:

我们随便输入一个ip看看输出结果:

可以看到返回了执行ping -c 4 127.0.0.1
的结果。同时发现这个网页使用的是get请求:

那如果我们可以让服务器不执行ping命令,而执行我们需要的命令让服务器将结果回显,不就相当于我们有了一个webshell吗!这就是命令注入的意思。我们可以通过管道符来实现。
linux支持多种管道符:
管道符 | 用法 |
---|---|
; | 执行完前面语句再执行后面的。如ping 127.0.0.1; ls |
| | 显示后面语句的执行结果。如ping 127.0.0.1 | ls |
|| | 前面语句出错时执行后面语句。如ping 127.0.0.1 || ls |
& | 前面语句为假则执行后面语句。如ping 127.0.0.1 & ls |
&& | 前面语句为假则报错,为真则执行后面语句。如ping 127.0.0.1 && ls |
我们使用 |
进行注入,可以看到返回了ls的结果:

我们看看那个奇怪的php文件,发现没有回显,看看源码(这个地方坑了我很长时间,后面的题最终都需要查看源码),得到flag:

过滤cat
对于命令注入的题目,主要考察的就是各种过滤的绕过,这道题就是考察cat过滤的绕过。
首先查看flag文件名:

读取文件可以使用more、head等命令。关于linux的文本读取命令,可以看看这篇文章:Linux读取文本常用命令。本题我使用more命令,得到flag

由于后面的题目均考察不同内容的过滤,所以非重点的图片等就不再放上来了。
过滤空格
这次我们要绕过空格,绕过空格有很多种方法。我们可以使用我们可以使用${IFS}
来表示空格,IFS是shell中的一个变量,关于IFS的资料,可以看这篇文章(强烈推荐看看):详细解析Shell中的IFS变量。
我们在命令中就用IFS来替换空格:

得到flag:

过滤目录分隔符
目录分隔符/
我们可以使用$HOME
代替,HOME也是shell中的一个环境变量,表示当前用户的根目录,我们可以看看当前用户的HOME值是什么

可以看到当前用户的根目录是/home/www-data,我们只需要/,所以我们可以用${HOME:0:1}来实现

首先查看flag位置:


读取flag:


过滤运算符
这道题过滤了 | 和 &,我们可以使用 ; 进行注入:

直接cat得到flag:

综合过滤练习
首先看一下过滤的符号有哪些:

过滤了 | & ; 空格 / cat flag ctfhub这些符号
我们可以使用%0a(换行符的url编码)来绕过运算符:

字符串的绕过我们可以使用反斜杠 ,如flag变成fl:

读取flag:


至此,我们就完成了命令注入的技能树,可以看到命令注入主要考察的就是各种绕过姿势,本文主要针对题目来讲,这里再放一些命令注入绕过姿势的总结文章,供大家参考和学习: