~# n0tr00t Security Team

非主流Fuzzing - 模糊测试在非内存型漏洞挖掘中的应用

06 Jul 2016 - superhei

[+] Author: superhei
[+] Team: n0tr00t security team
[+] From: http://www.n0tr00t.com
[+] Create: 2016-07-06

该内容由 heige 2016年6月23日于 《中国网络安全大会 2016》演讲内容整理。

PDF 下载:非主流Fuzzing.pdf

什么是 Fuzzing

Fuzzing是一种常用漏洞挖掘的方法,通过向应用程序提供非预期的输入并监控输出中的异常来发现软件中的故障(faults)的方法,模糊测试利用自动化或半自动化的方法重复地向有用程序输入。

Fuzzing 的结构及流程

1、构造非预期的输入

构造非预期的输入(生成模糊测试的数据)是找到漏洞的关键,也是Fuzzing框架设计的一个关键点。数据的构造一般包括:基本数据(结构)模板及对应值:

需要前期分析总结准备,自动化随机构造数据样本:

2、应用程序解析执行

把“构造非预期的输入”提交给应用程序执行。需要自动化、持续不间断的执行。如:应用程序出现崩溃后能重新启动并执行。这是Fuzzing框架稳定性最关键的步骤,这个点如果中断整个Fuzzing流程就没办法持续。

3、监控异常输出

提供记录异常输出信息及对应的“非预期的输入”内容。需要根据异常信息做好分类,比如重复的crash归类等。排除不稳定的异常输出,比如不能复现的。

主流 Fuzzing 的历史和现状

现状

目前内存型漏洞的主要挖掘手段,竞争激烈。

⾼度定制化、私有化、复杂化

问题来了!?

非主流 Fuzzing

Fuzzing不只是一种方法,更是一种思想!漏洞挖掘的“方法论” 到 Fuzzing :

根据不同的漏洞类型设计简单的Fuzzing

输入数据构造:

异常输出:

XSS Fuzzing

在xss攻防对抗了有一个很关键点就是:新的xss策略

原型:<script/src=‘1.js’></script> 使用了/替带了空格

那么我们可以设计一个简单的Fuzzing:

http://docs.google.com/Doc?id=dd7x5smw_16hdd34ggz

SQL 注入 Fuzzing

对于常见SQL注入来说,非预期的数据直接给参数提交’ 或者”,异常输出直接取错误信息

ORACLE”存储过程”注入Fuzzing,这种场景的关键是需要自动遍历所有”存储过程”及参数 自动提交非预期数据进行测试。

SELECT SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TA BLES(‘FOO','BAR','DBMS_OUTPUT".PUT(:P1);SYS.DBMS_OUT PUT.PUT_LINE(''KJ021320'');END;--','SYS',0,'1',0) FROM DUAL

ORACLE ”存储过程”注入 Fuzzing

a.根据object_name得到package的object_id

SQL> select object_id,object_type from all_objects where object_name='DRILOAD';

OBJECT_ID OBJECT_TYPE

---------- ------------------

30192 PACKAGE

30243 PACKAGE BODY

b.根据object_id得到函数/过程名

SQL> SELECT DISTINCT PROCEDURE$ FROM SYS.ARGUMENT$ WHERE

OBJ#=30192;

PROCEDURE$

------------------------------

BUILD_DML

RESOLVE_SQE

VALIDATE_POL

VALIDATE_STMT

c.得到具体PROCEDURE$的参数个数及类型

SQL> select distinct position#,argument,pls_type from sys.argument$ where obj#=30192

and PROCEDURE$='VALIDATE_STMT';

POSITION# ARGUMENT PLS_TYPE

---------- ------------------------------ ------------------------------

1 SQLSTMT VARCHAR2

d.构造fuzz数据

SQL> CALL CTXSYS.DRILOAD.VALIDATE_STMT('''');

CALL CTXSYS.DRILOAD.VALIDATE_STMT('''')

*

ERROR 位于第 1 行:

ORA-06510: PL/SQL: ⽆法处理的用户自定义异常事件

ORA-06512: 在"CTXSYS.DRILOAD", line 42

ORA-01756: 括号内的字符串没有正确结束

iis6 文件名解析 Fuzzing

iis6下 1.asp;.jpg 可以解析asp

渗透测试中的 Fuzzing

渗透测试常见的暴力破解其实就是一种“朴素”的Fuzzing,如果加入“变异”、“智能”的概念可能大大提升成功率。

《自动化攻击背景下的过去现在与将来 》 — 猪猪侠

“相似的业务必然带来相似的漏洞”—漏洞的相似性之一

2012年 发现报告TSRC的漏洞:

http://tel.exmail.qq.com/domain.html#aa|a|a&&b<script>/*///*/alert(1);</script>bb|ccc

2014年 通过“Fuzzing”我又找到并报告了腾讯业务“48个domain.html dom xss”:

实现:

非主流 Fuzzing 的秘籍

Fuzzing不只是的一种漏洞挖掘的方法,更是一种思想可以应用于各种场景

Fuzzing的秘籍:“Just Do it” 中文知乎版:“整就牛”

“跨维思维”:不要局限在原有的漏洞模型上,要多发散思维

Bypass :

原始漏洞模型:http://drops.wooyun.org[fuzz].360.cn—>对比new URL(str_1).getHost() 及 浏览器访问的结果

基于原漏洞模型的Fuzzing 异常记录:python -mSimpleHTTPServer 80

结果:还是只有 \

再总结思考:

  1. 首先这个是一个典型的“标准不一致”带来的安全问题
  2. 那么除了“new URL(str_1).getHost()”外还有没有其他的可能的攻击面?如js里的“document.domain”

于是继续设计了新的Fuzzing

sudo python f.py 80

结果:

结果:

全平台下的Firefox UXSS漏洞

poc: