命令注入

image-20200730205313234

进入题目,题目中给出了源码:

image-20200730205758156

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

image-20200730205859577

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

image-20200730210440289

那如果我们可以让服务器不执行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的结果:

image-20200730210948859

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

image-20200730211234543

过滤cat

image-20200730211439573

对于命令注入的题目,主要考察的就是各种过滤的绕过,这道题就是考察cat过滤的绕过。

首先查看flag文件名:

image-20200730221846743

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

image-20200730222246812

由于后面的题目均考察不同内容的过滤,所以非重点的图片等就不再放上来了。

过滤空格

这次我们要绕过空格,绕过空格有很多种方法。我们可以使用我们可以使用${IFS}来表示空格,IFS是shell中的一个变量,关于IFS的资料,可以看这篇文章(强烈推荐看看):详细解析Shell中的IFS变量

我们在命令中就用IFS来替换空格:

image-20200730223159084

得到flag:

image-20200730223441299

过滤目录分隔符

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

image-20200731173205285

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

image-20200731181313922

首先查看flag位置:

image-20200731172616367

image-20200731172934380

读取flag:

image-20200731181418868

image-20200731181428086

过滤运算符

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

image-20200731181801768

直接cat得到flag:

image-20200731181837629

综合过滤练习

首先看一下过滤的符号有哪些:

image-20200731181939756

过滤了 | & ; 空格 / cat flag ctfhub这些符号

我们可以使用%0a(换行符的url编码)来绕过运算符:

image-20200731182638296

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

image-20200731182804769

读取flag:

image-20200731183029022

image-20200731183037672

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

命令注入绕过姿势

命令执行绕过小技巧

命令注入绕过技巧总结

关于命令执行/注入 以及常见的一些绕过过滤的方法


"Imagination will take you everywhere."