山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(八)


前言:

自项目开始到现在,除了 docker 相关内容的学习与实践测试外,完成了 SQL 注入漏洞的数字型注入和字符型注入以及带有括号的字符型注入的漏洞环境的代码编写与环境搭建。接下来的任务是完成 RCE 漏洞环境的构思与代码编写、测试运行。

1、RCE 漏洞简介

1.1、简介

RCE (Remote Code/Command Execute) :远程代码/命令执行

漏洞产生原因:在 Web 应用中开发者为了灵活性,简洁性等会让应用调用代码或者系统命令执行函数去处理,同时没有考虑用户的输入是否可以被控制,造成代码/系统命令执行漏洞。

比如我们常见的路由器、防火墙入侵检测等设备的web管理界面上,一般会给用户提供一个 ping 操作的 web 界面,用户从 web 界面输入目标,提交后,后台会对该 iP 地址进行一次 ping 测试,并返回测试结果,而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交意想不到的命令,从而让后台进行执行,从而控制整个后台服务器。

其实这个漏洞也是像大多数漏洞一样,即没有检查或者没有严格的过滤用户所输入内容,而是直接带入执行,导致了远程代码执行漏洞的产生。

相较于使用 php 而言,使用 java 搭建的网站出现远程代码执行漏洞的几率较小些,因为 php 有很多内置的函数,可以执行相关命令,但是仍然会出现这种漏洞。

这个漏洞一经发现,几乎就是高危漏洞。


1.2、危害

高危:直接获取服务器权限,获取敏感数据,文件,写入恶意文件 getshell

继承Web服务器程序的权限,去执行系统命令

继承Web服务器程序的权限,读写文件

反弹shell

控制整个网站

甚至控制整个服务器

微信 PC 版曾经曝出过 RCE 漏洞,起源主要是因为 chrome 浏览器在无沙箱模式下,会触发 RCE 执行漏洞,但是 chrome 默认开启了沙箱模式。

微信 pc 版(3.2.1.141)之前的版本,在利用微信默认的内置浏览器打开链接时会调用 chrome 内核,默认使用 --no-sandbox 可导致命令执行。

影响版本:微信 Windows 版 < 3.1.2.141


1.3、利用

1.3.1、漏洞挖掘

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

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

php 中命令执行函数:system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()

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

使用管道符对该漏洞进行利用,针对不同的服务器系统,有不同的管道符利用方法。


1.3.2、windows下管道符

“;”:执行完前面的语句再执行后面的语句。

“|”:显示后面语句的执行结果。

“||”:当前面的语句执行出错时,执行后面的语句。

“&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。

“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。


1.3.3、linux下管道符

“;”:执行完前面的语句再执行后面的语句。

“|”:显示后面语句的执行结果。

“||”:当前面的语句执行出错时,执行后面的语句。

“&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。

“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真


1.4、防范

  1. 防范这类漏洞,首先要从对用户输入,即前端传回的数据在进入危险函数前进行严格的检测和过滤。

  2. 尽量不要使用命令执行函数


2、相关配置

编写 application.properties

spring.thymeleaf.prefix = classpath:/templates/

pom.xml 导入相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>sqli</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sqli</name>
    <description>sqli</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


3、编写“RCE 漏洞”后端代码

创建 springboot 框架的项目,相关设置与前面的 SQL 注入相同。

首先编写 controller 层,配置请求匹配跳转。

indexController.java

package com.example.sqli.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class indexController {
    
    
    @RequestMapping(value={
    
    "/","/index.html"})
    public String index(){
    
    
        return "index";
    }

    @RequestMapping(value={
    
    "RCE_ping"})
    public String RCE_ping_index(){
    
    
        return "RCE_ping";
    }
}

接下来编写 RCE 漏洞后端代码,构造 RCE 漏洞执行环境,我想到的是构造一个提供 ping 服务的环境场景,前端是一个输入框,用户可以输入 ip 地址,然后后端服务器将会调用函数执行 ping 命令,返回结果给前端。这样的一个服务场景,如果没有对用户输入的内容进行过滤检查的话,可以构成一个 RCE 漏洞。

根据以上思路,编写 RCE.java

package com.example.sqli.controller;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLException;

@Controller
@RequestMapping("/RCE/")//接口注解
public class RCE {
    
    
    //RCE-ping漏洞(测试payload:127.0.0.1 | whoami 或者 127.0.0.1 && whoami)
    @RequestMapping("ping")
    public String RCE_ping(@RequestParam(value = "ip",required = false) String ip, Model model) throws SQLException, IOException {
    
    
//        Runtime rt = Runtime.getRuntime();
//        Process p = rt.exec("cmd.exe /c ping "+ip);
//        System.out.println(p.toString());
//        return "RCE_ping";
          Runtime runtime = Runtime.getRuntime();
          try {
    
    
                String cmd = "cmd /c ping "+ip;

                Process process = Runtime.getRuntime().exec(cmd);
                BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
                process.waitFor();
                process.exitValue() ;
                //BufferedReader br = new BufferedReader(new InputStreamReader(runtime.exec("ping "+ip).getInputStream(),"GBK"));
                String line=null;
                System.out.println(cmd);
                StringBuffer b=new StringBuffer();
                while ((line=br.readLine())!=null) {
    
    
                   b.append(line+"\n");
                }
                System.out.println("ping输出结果:"+b.toString());
          } catch (Exception e) {
    
    
                e.printStackTrace();
          }
          return "RCE_ping";
    }

}


4、编写“RCE 漏洞”前端代码

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SQL注入</title>
</head>
<body>


<input type="button" value="RCE-ping"
       onclick="javascrtpt:window.location.href='http://localhost:8080/RCE_ping'" />
</body>
</html>

RCE 漏洞,前端简易环境,ping 服务

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>RCE-ping</title>
</head>
<body>

<form action="http://localhost:8080/RCE/ping" method="get">
    请输入ip地址: <input type="text" name="ip" />
    <input type="submit" value="ping" />
</form>

</body>
</html>

5、运行测试

首先,我们靶场的服务器是 Linux 系统,应该使用 Linux 的管道符进行测试,这里我在编写完成后,是直接在 Windows 环境下进行测试的,如果部署到 Linux 服务器上,payload 可能会有变化。

启动项目

访问 RCE 漏洞模拟环境,ping 服务

测试输入 127.0.0.1

![]](https://img-blog.csdnimg.cn/33e5d898071a461db63f2f7773ab4ee9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZmM5YWuXw==,size_20,color_FFFFFF,t_70,g_se,x_16)

payload:127.0.0.1 && whoami

回显:

![[]](https://img-blog.csdnimg.cn/9930b090b4284cdaae3aa6f89f39d68c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZmM5YWuXw==,size_20,color_FFFFFF,t_70,g_se,x_16)

可以看到,执行了命令whoami

RCE 漏洞环境搭建完成



参考文章

https://www.cnblogs.com/mrob0t/p/14750795.html

https://www.icode9.com/content-4-812303.html

https://www.jianshu.com/p/1010fb8d9597

https://www.cnblogs.com/zzb228/articles/15440327.html

https://jingyan.baidu.com/article/c275f6ba6b7985e33d756789.html

https://blog.csdn.net/nigo134/article/details/118462599

https://www.zhihu.com/question/474360592/answer/2017267949


猜你喜欢

转载自blog.csdn.net/m0_47470899/article/details/123693869