sqlmap用法

sqlmap平时使用得非常的多,但命令也是十分的多。每次用的时候,都要去网上搜索。于是决定自己总结一下sqlmap常见的用法,方便自己使用。

特殊参数

-v

-v表示显示sqlmap在进行注入时的详细信息,一共有七个等级,默认为1

  • 0,只显示python错误以及严重的信息
  • 1,同时显示基本信息和警告信息
  • 2,同时显示debug信息
  • 3,同时显示注入的payload
  • 4,同时显示HTTP请求
  • 5,同时显示HTTP响应头
  • 6,同时显示HTTP响应页面

–level

默认情况下SQLMAP只支持GET/POST参数的注入测试,但是当使用–level参数且数值>=2的时候会进行cookie注入测试;当>=3时,会进行User-Agent和Referer的注入测试。

–risk

risk设定风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR测试语句。

-f或者–fingerprint

执行检查广泛的DBMS版本指纹,这个参数用得不多。

获取URL

-u或者–url

-u是最常见、常用的用法

1
python sqlmap.py -u "http://www.example.com/index.php?id=1"

-l

从burpsuite或者WebScarab代理日志中去测试每个URL是否存在SQL注入

-r

从文本文件中获取HTTP请求(这就要求此文本文件保存的信息是HTTP请求的),这样HTTP就可以利用HTTP请求中的参数。
例如文本文件中的内容为:

1
2
3
4
5
POST /index.php HTTP/1.1
Hos: www.example.com
User-Agent: Mozilla/4.0

id=1

那么使用sqlmap进行注入时,sqlmap自动将HOST和User-Agent设置为文本文件中的值
当处理的请求是HTTPS的时候,则需要使用–forc-ssl参数来使用,或者在HOST头后面加上:443

请求

POST请求

参数:–data
–data主要适用于POST方式提交。用法如下:

1
python sqlmap.py -u "http://www.example.com/index.php" --data="id=1"

cookie相关

参数:-cookie,–load-cookies,–drops-set-cookie
cookie参数在sqlmap中的应用主要是有2个方面:

  • Web应用需要进行登陆的时候
  • 测试cookie注入
    如果需要使用cookie进行登陆,则需要通过–cookie将cookie进行赋值。在HTTP请求中,遇到Set-cookie时,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。
    当–level>=2时,则会尝试进行cookie的注入测试。

User-Agent相关

参数:–user-agent,–random-agent
默认情况下sqlmap的HTTP请求头中的User-Agent是:

1
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

可以使用–user-agent参数来进行修改,同时也可以使用–random-agent参数来随机化的从./txt/user-agents.txt中获取。
当–level参数设定为3或者是3以上时,会尝试对User-Agent进行注入测试。

Referer头

参数:–referer
sqlmap可以在请求中伪造HTTP中的referer,用法与user-agent的用法相同。当–level参数设定为3或者3以上的时候会尝试对referer注入。

请求设置

设定请求间隔

参数:–delay
设定两次请求间的时间间隔。若设定为0.5则表示间隔时间是半秒,默认是没有延迟

设定超时时间

参数:–tiemout
设定超时时间,主要是设定一个请求超过多久被判定为超市。弱设定为10.5表示是10.5秒,默认是30秒。

设定超时重试

参数:–retries
当请求超时时,设定重新尝试连接次数,默认是3次。

关掉URL参数编码

参数:–skip-urlencode
关闭URL编码,这个参数一般用得比较少。目前几乎所有的web服务器都支持RFC标准。

执行自定义Python代码

参数:–eval
在有些时候,需要根据一个参数的变化而修改另一个参数,才能形成正常的请求。此时就需要使用到--eval。例子如下

1
python sqlmap.py -u "http://www.example.com?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

上面的请求参数中的hash值就是id值的md5,这时就需要使用到自定义Python代码了。

注入

测试参数

参数:-p,–skip
-p,表示的就是需要进行注入测试的参数。例如,-p “id,user-agent”
–skip,表示不不需要进行测试的参数,例如–skip=”user-agent”

伪静态注入

很多框架会使用URL重写技术,此时sqlmap就无法使用参数注入,但是可以在需要测试的参数后面加上*
例子如下

1
python sqlmap.py -u "http://blog.spoock.com/2016/09/04*/sqli-bypass/"

绕WAF

参数:–tamper
很多时候有WAF设备会拦截sqlmap的注入,此时就需要使用--tamper对注入的SQL语句进行变形来进行绕过。所有的tamper脚本都是在sqlmap中的tamper中的脚本有定义的,可以进入到tamper目录下进行查看。

1
python sqlmap.py - u"http://www.example.com?id=1" --tamper tamper/between.py,tamper/randomcase.py

提取数据

标志

参数:-b,–banner
检索数据库管理系统的标识

用户

参数:–current-user
返回当前数据库的管理用户

当前数据库

参数:–current-db
返回当前连接的数据库

DBA检测

参数:–is-dba
检测当前的管理用户是否是DBA

数据库枚举

参数:–dbs
如果当前的用户可以读取所有的数据库的信息,即可列出所有的数据库

数据库表枚举

参数:–tables -D someDatabase
列出某个数据库(someDatabase)中所有的表名,例子如下:

1
python sqlmap.py -u "http://www.example.com?id=1" --tables -D cms

字段枚举

参数:–columns -D someDatabase -T someTable
列出someDatabase数据库中的someTable表中的所有的字段信息。如果没有使用-D参数指定某个数据库的时候,则默认使用当前数据库

1
Python sqlamp.py -u "http://www.example.com?id=1" --columns -D cms -T users

获取表中数据的数目

参数:–count
使用–count就可以获取表中数据的个数

1
python sqlmap.py -u"http://www.example.com?id=1" --count -D cms

上述的sqlmap的语句会列出在cms数据库中所有的表的数据

下载表中的数据

参数:–dump -D someDatabase -T someTable -C someColumns
使用–dump就可以将某个表中的数据下载到本地。指定-C的值表示是下载某一列所有的数据,如果没有指定则是下载表中所有的数据。

1
python sqlmap.py -u "http://www.example.com?id=1" --dump -D cms - T users

MISC

自定义SQL语句

参数:–sql-query,–sql-shell
虽然sqlmap会自行选择sql语句进行测试,但是也可以选择执行自定义的SQL语句。

1
python sqlmap.py -u"http://www.example.com?id=1" --sql-query "select database()"

获取shell

参数:–os-cmd,–os-shell
使用–os-shell参数可以模拟一个真实的shell,在此shell上可以输入任何想执行的命令。
这个命令平时使用得较少,等有一定的使用体会再来进行详细的补充说明。

参考

sqlmap学习视频:https://www.youtube.com/user/inquisb/videos
sql中文参数说明:http://blog.csdn.net/ghosttzs/article/details/7362359
sql进阶使用:http://www.evil0x.com/posts/11377.html
sqlmap使用手册:http://drops.cnbraid.com/index.php/drops/view_drops/492