Universidad de Shandong Software College Project Training-Innovative Training-Shandong University Software Institute Network Attack and Defense Shooting Range Experimental Platform (8)


Prefacio:

Desde el comienzo del proyecto hasta el presente, además del aprendizaje y las pruebas prácticas del contenido relacionado con Docker, la escritura de código y la construcción del entorno de vulnerabilidad para la inyección numérica y la inyección de caracteres de las vulnerabilidades de inyección SQL y la inyección de caracteres con corchetes han sido completado La siguiente tarea es completar la concepción, la escritura de código y la ejecución de pruebas del entorno de vulnerabilidad de RCE.

1. Introducción a la vulnerabilidad RCE

1.1 Introducción

RCE (código remoto/ejecución de comando): código remoto/ejecución de comando

El motivo de la vulnerabilidad: en una aplicación web, por flexibilidad y simplicidad, los desarrolladores permitirán que la aplicación llame al código o funciones de ejecución de comandos del sistema para su procesamiento, y no considerarán si la entrada del usuario se puede controlar, lo que resultará en la ejecución del código/comando del sistema. vulnerabilidades.

Por ejemplo, en la interfaz de administración web de nuestro enrutador común, detección de intrusión de cortafuegos y otros equipos, generalmente se proporciona al usuario una interfaz web para la operación de ping. El usuario ingresa el objetivo desde la interfaz web y, después de enviarlo, el fondo será realice una prueba de ping en la dirección IP y devuelva los resultados de la prueba, y si el diseñador no implementa un control de seguridad estricto al completar esta función, puede hacer que el atacante envíe comandos inesperados a través de esta interfaz, por lo que se ejecutará el fondo , controlando así todo el servidor de fondo.

De hecho, esta vulnerabilidad es como la mayoría de las vulnerabilidades, es decir, la entrada del usuario no se verifica ni se filtra estrictamente, sino que se ejecuta directamente, lo que da como resultado la generación de vulnerabilidades de ejecución remota de código.

En comparación con el uso de php, es menos probable que los sitios web creados con java tengan vulnerabilidades de ejecución remota de código, porque php tiene muchas funciones integradas que pueden ejecutar comandos relacionados, pero tales vulnerabilidades aún ocurren.

Una vez que se descubre esta vulnerabilidad, es casi una vulnerabilidad de alto riesgo.


1.2 Peligros

Alto riesgo: obtenga permisos de servidor directamente, obtenga datos confidenciales, archivos, escriba archivos maliciosos getshell

Heredar los permisos del programa del servidor web para ejecutar comandos del sistema

Heredar los permisos del programa del servidor web, leer y escribir archivos

concha de rebote

Controla todo el sitio web

incluso controlar todo el servidor

La versión para PC de Wechat ha expuesto la vulnerabilidad de RCE, el origen se debe principalmente a que el navegador Chrome activará la vulnerabilidad de ejecución de RCE sin modo de espacio aislado, pero Chrome tiene el modo de espacio aislado habilitado de forma predeterminada.

Antes de la versión para PC de WeChat (3.2.1.141), se llamará al kernel de Chrome cuando se use el navegador integrado predeterminado de WeChat para abrir un enlace, y --no-sandbox se puede usar de forma predeterminada para hacer que se ejecute el comando.

Versión afectada: WeChat versión de Windows < 3.1.2.141


1.3, uso

1.3.1 Minería de vulnerabilidades

Prueba de caja negra : pruebe los puntos de función especiales del sitio web, como ping, etc.

(recomendado) Pruebas de caja blanca : a través de la auditoría de código, verifique si las funciones peligrosas en la aplicación están estrictamente filtradas

Funciones de ejecución de comandos en php: system(), exec(), shell_exec(), pcntl_exec(), popen(), proc_popen(), passthru()

Funciones de ejecución de código en php: eval(), assert(), preg_replace(), create_function(), array_map(), call_user_func(), call_user_func_array(), array_filter(), uasort()

La vulnerabilidad se aprovecha utilizando el carácter de canalización.Existen diferentes formas de explotar el carácter de canalización para diferentes sistemas de servidor.


1.3.2, el carácter de canalización en Windows

";": después de ejecutar la declaración anterior, ejecute la siguiente declaración.

"|": Muestra el resultado de la ejecución de la siguiente declaración.

"||": cuando se produce un error en la ejecución de la sentencia anterior, se ejecuta la sentencia siguiente.

"&": Ambos comandos se ejecutan. Si la declaración anterior es falsa, se ejecutará la siguiente declaración. La declaración anterior puede ser verdadera o falsa.

"&&": si la declaración anterior es falsa, se producirá un error directamente y no se ejecutará la siguiente declaración. Si la declaración anterior es verdadera, ambos comandos se ejecutarán y la declaración anterior solo puede ser verdadera.


1.3.3, el carácter de canalización en Linux

";": después de ejecutar la declaración anterior, ejecute la siguiente declaración.

"|": Muestra el resultado de la ejecución de la siguiente declaración.

"||": cuando se produce un error en la ejecución de la sentencia anterior, se ejecuta la sentencia siguiente.

"&": Ambos comandos se ejecutan. Si la declaración anterior es falsa, se ejecutará la siguiente declaración. La declaración anterior puede ser verdadera o falsa.

"&&": si la declaración anterior es falsa, se producirá un error directamente y no se ejecutará la siguiente declaración. Si la declaración anterior es verdadera, ambos comandos se ejecutarán. La declaración anterior solo puede ser verdadera.


1.4 Prevención

  1. Para evitar tales lagunas, la entrada del usuario, es decir, los datos devueltos desde el front-end, deben detectarse y filtrarse estrictamente antes de ingresar a la función peligrosa.

  2. Trate de no usar comandos para ejecutar funciones


2. Configuración relacionada

escriba application.properties

spring.thymeleaf.prefix = classpath:/templates/

Dependencias relacionadas con la importación de 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. Escriba el código de back-end de "vulnerabilidad RCE"

Cree un proyecto del marco springboot con la misma configuración que la inyección de SQL anterior.

Primero escriba la capa del controlador y configure el salto de coincidencia de solicitud.

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";
    }
}

A continuación, escriba el código de back-end de la vulnerabilidad RCE y construya el entorno de ejecución de la vulnerabilidad RCE. Lo que pienso es construir un escenario de entorno que proporcione el servicio de ping, el front-end es un cuadro de entrada, el usuario puede ingresar la dirección IP y luego, el servidor back-end llamará a la función para ejecutar el comando ping, devolverá el resultado al front-end. Tal escenario de servicio puede constituir una vulnerabilidad RCE si el contenido ingresado por el usuario no se filtra y verifica.

De acuerdo con las ideas anteriores, escriba 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. Escriba el código de front-end de "vulnerabilidad RCE"

índice.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>

Vulnerabilidad RCE, entorno simple de front-end, servicio de 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. Ejecute la prueba

En primer lugar, el servidor de nuestro campo de tiro es un sistema Linux, que debe probarse utilizando el carácter de canalización de Linux. Aquí lo pruebo directamente en el entorno de Windows después de escribirlo. Si se implementa en un servidor Linux, la carga útil puede cambio.

Proyecto de inicio

Acceder al entorno de simulación de vulnerabilidad RCE, servicio de ping

Entrada de prueba 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)

carga útil:127.0.0.1 && whoami

Circunferencia:

![[]](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)

Como puede ver, el comando se ejecutawhoami

El entorno de vulnerabilidad RCE está construido



Artículo de referencia

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


Supongo que te gusta

Origin blog.csdn.net/m0_47470899/article/details/123693869
Recomendado
Clasificación