在本书上卷中介绍了软件安全测试,本章介绍软件安全测试工具。软件安全测试工具不像性能测试工具,类型比较多,由于每个产品的功能比较多,本书仅对关键用法进行介绍,进一步的使用方法请读者参考产品的官方文档或网站。
1 安全扫描工具
1.1 Burp Suite
Burp Suite 用于攻击WEB应用程序的集成平台,包含了许多工具。Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程。所有工具都共享一个请求,并能处理对应的HTTP 消息、持久性、认证、代理、日志、警报。
它主要包括以下模块。
- 代理:拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许拦截,查看,修改在两个方向上的原始数据流。
- 测试器:应用智能感应的网络爬虫,它能完整的枚举应用程序的内容和功能。
- 扫描器:一款高级的工具,执行后,它能自动地发现WEB应用程序的安全漏洞。
- 测试器:定制的高度可配置的工具,对web应用程序进行自动化攻击,如:枚举标识符,收集有用的数据,以及使用fuzzing技术探测常规漏洞。
- 重发器:靠手动操作来补发单独的HTTP 请求,并分析应用程序响应的工具。
- 定序器:用来分析那些不可预知的应用程序会话令牌和重要数据项的随机性的工具。
- 编解码器:进行手动执行或对应用程序数据者智能解码编码的工具。
- 比较器:一款实用的工具,通常是通过一些相关的请求和响应得到两项数据的一个可视化的“差异”。
Burp Suite是用JAVA开发的,使用之前务必安装及配置好JDK环境变量。本书介绍的BurpSuite版本为V2.011Beat。
1. 目标和扫描
启动Burp Suite,进入“目标->网站地图”标签,点击1红框部分,即可看见扫描过滤器。
1设置扫描目标过滤器
然后进入“目标->范围”标签,设置扫描范围,包括需要扫描的范围和不需要扫描的范围,如2所示。
2添加扫描目标范围
接下来进入“仪表盘”标签,点击“新扫描”,在弹出窗口中显示上一步配置的扫描范围,如3所示。
3设置扫描
在这个页面中设置“爬行和诊断”或者“爬行”。
- 爬行:爬行扫描范围内的内容,扫描完毕将展示范围内的目录结构。
- 诊断:在爬行的基础上,检查每个页面是不是存在安全漏洞,如果有安全漏洞,则在相应的地方展示告知。
接下来点击蓝色的三角形,启动扫描。扫描完毕,在“目标->网站地图”标签中展示爬行结果,如4所示;在“仪表盘”右侧显示诊断结果,如5所示。
4爬行结果
5扫描结果
2. 代理
通过代理,可以拦截HTTP/S,为其他工具,比如重发器,测试器提供前序工作。进入“代理->选项”标签,设置代理监听器,如6所示。
6设置代理监听器
然后在浏览器中设置代理,IP地址与端口同上面保持一致,如7所示。
7设置对应的浏览器代理
进入“代理->截断”标签,注意先确认8红框部分为【拦截禁用】,即禁用拦截。
8禁用拦截
在浏览器中进行操作,在需要拦截页面之前,点击【拦截禁用】按键,变为【拦截请求】,启用拦截。接下来在浏览器中进入所需页面,这个时候HTTP(S)请求没有发送到服务器端,而是被Burp Suite拦截,见9所示。
9请求被Burp Suite拦截
3.重发器
在“代理->截断”标签拦截成功后,点击【行动】,然后点击【发送给Repeater】,如10所示。
10发送给Repeater
进入“重发器”标签,HTTP(S)被复制到“重发器”标签中。
案例1:使用重发器增加Cookies内容。
在这里,仍旧使用附录A电子商务系统的登录模块,假设某个黑客模拟了一个登录提交页面,在这个页面中存在csrfmiddlewaretoken字段,value值拷贝于真正的电子商务系统的登录网页,由于没有cookies,现在利用Burp Suite的重发功能来模拟实现CSRF攻击。HTML主体代码如下。
<body> <formmethod="post"action="http://192.168.1.122:8000/login_action/" enctype="multipart/form-data"> <input type="hidden"name="csrfmiddlewaretoken"value="CFfTFIlQMgPtwhmXXOQBMaAxFlxLNbD1GavbiG4iLVv2usI3D3eGWaOtHLwHhX8F">
用户名:
密码 :
requiredid="id_password"></p> <button class="btn btn-lg btn-primarybtn-block" type="submit">登录</button><br> </form> </body>
首先通过代理模块拦截通过黑客本地页面提交的登录HTTP请求,并且发送给了重发器功能,如11所示。
11电子商务系统的登录请求
然后点击右上方的
图标,IP地址修改成127.0.0.1,然后点击【发送】按钮,发现响应页面为403错误页面,如12所示。
12修改请求之前,出现403错误
接下来在请求头部中加入“Cookie:csrftoken=CFfTFIlQMgPtwhmXXOQBMaAxFlxLNbD1GavbiG4iLVv2usI3D3eGWaOtHLwHhX8F;”,其中CFfTFIlQMgPtwhmXXOQBMaAxFlxLNbD1GavbiG4iLVv2usI3D3eGWaOtHLwHhX8F为CSRF令牌,与csrfmiddlewaretoken hidden中的值保持一致,再次点击【发送】按钮,发送成功。
案例2:使用重发器修改上传文件后缀。
进入一个具有上传文件功能的模块,这个模块只允许上传jpg、png、gif三种格式的图片文件。黑客编辑了一个名为test.jsp的文件,把文件名改为1.jpg。提交后通过代理模块拦截并且发送给了重发器功能,见13所示。
13修改上传文件名后缀
在这里把1.jpg改为test.jsp。发送,到服务器上传文件的目录下查看,文件名为test.jsp。
4. 测试器
测试器主要对拦截下来的请求进行暴力破解的工具。
案例3:登录功能暴力破解。
在本地建立一个登录页面,代码如下。
<html> <head> <meta http-equiv="Content-Type"content="text/html; charset=gb2312"> <title>演示十九:SQL注入的测试探索(一),显示所有字段</title> </head> <form method="post"action="http://www.domain.com/login.jsp"> 姓名:<input type="text" name="username"maxlength="50"><br> 密码:<input type="text" name="password"maxlength="50"><br> <inputtype="submit" value="登录"> </form> </body> </html>
action=http://www.domain.com/login.jsp为远端服务器的登录验证页面。任意输入用户名和密码提交表单,用BurpSuite工具进行拦截,然后点击【行动】发送到Intruder中,如14所示。
14发送到Intruder操作
发送完毕,进入标签“测试器->位置”,如15所示。
15发送到Intruder后显示结果
在15中,对于用户名和密码已经被两个§符号括起来作为参数。可以通过右面的如16所示,修改、添加和删除参数。
16 修改、添加和删除Intruder参数
攻击类型四个参数如1所示。
1 Intruder参数类型
攻击类型 |
说明 |
狙击手模式(Sniper) |
单参数爆破,多参数时同一个字典按顺序替换各参数,总之初始值有一个参数不变。它使用一组Payload集合,依次替换Payload位置上被§标志的文本,对服务器端进行请求,用于测试被请求的参数是否存在漏洞。 |
攻城锤模式(Battering ram) |
多参数同时爆破,但用的是同一个字典。它使用单一的Payload集合,依次替换Payload位置上被标志§的文本,对服务器端进行请求,与狙击手模式的不同之处在于,如果有多个参数并且都是Payload位置标志时,使用Payload值是相同的,而狙击手模式仅能使用一个Payload位置标志。 |
草叉模式(Pitchfork ) |
多参数同时爆破,但用的是不同的字典。它可以使用多组Payload集合,在每一个不同的(最多20个)Payload标志位置上,遍历所有的Payload。如果有两个Payload标志位置,第1个Payload值为username1和username2,第二个Payload值为password1和password2,则发起攻击时,将共发起两次攻击,第一次使用的Payload分别为username1和password1,第二次使用的Payload分别为username2和password2。 |
集束炸弹模式(Cluster bomb) |
多参数做笛卡尔乘积模式爆破。可以使用多组Payload集合,在每一个不同的(最多20个)Payload标志位置上,依次遍历所有的Payload。它与草叉模式的主要区别在于,执行的Payload数据Payload组的乘积。如果有两个Payload标志位置,第一个Payload值为username1和username2,第二个Payload值为password1和password2,则发起攻击时,将共发起四次攻击,第一次使用的Payload分别为username1和password1,第二次使用的Payload分别为username1和password2,第三次使用的Payload分别为username2和password1,第四次使用的Payload分别为username2和password2。 |
在这里,选择Cluster bomb。进入标签“测试器->有效负载”,配置参数列表。在“有效负载集”选择“1”,为配置第一个参数,即username的有效负载;在有效负荷类型选择相应的类型。有效负荷类型介绍如下。
- 简单列表(Simple list):这是最简单的Payload类型,通过配置一个字符串列表作为Payload,也可以通过手工的方式添加字符串列表或从文件中加载字符串列表。
- 运行时文件(Runtime file):通过指定的文件,作为相对应Payload位置上的Payload列表。
- 自定义迭代器(Custom iterator):这是一款功能非常强大的Payload,它共有8个占位,每一个占位可以指定简单列表的Payload类型,然后根据占位的多少,与每一个简单列表的Payload进行笛卡尔积,生成最终的Payload列表。
- 字符串替换(Character substitution):这种Payload的类型是对预定义的字符串进行替换后生成新的Payload。
- 大小写替换(Case modification):对预定义的字符串,按照大小写规则,进行替换。
- 递归grep (Recursive grep):这种Payload类型用于从服务器端提取有效数据的情形,它需要先从服务器的响应中提取数据作为Payload,然后替换Payload的位置,从而进行攻击。它的数据来源于原始的响应消息,是基于原始的响应,在Payload的可选项设置(Options)中配置grep规则,然后根据grep去提取数据才可以发起攻击。
- 不合法的Unicode编码(Illegal Unicode):在payloads里用指定的不合法的Unicode 编码替换字符本身,从这些Payload列表里产生出一到多个有效负荷。
- 字符块(Character blocks):这种类型的Payload是指使用一个给定的输入字符串,然后根据指定的设置产生出一个指定大小的字符块,表现形式为生成指定长度的字符串。它通常使用边界测试或缓冲区溢出。
- 数字类型(Number):这种类型的Payload是指根据配置,生成一系列的数字作为Payload。
- 日期类型(Dates):这种类型的Payload是指根据配置,生成一系列的日期类型的Payload。
- 暴力字典(Brute forcer):这种类型的Payload生成包含一个指定的字符集的所有排列特定长度的有效载荷,通常用于枚举字典的生成。
- 空类型(Null payloads):这种负载类型产生其值是一个空字符串的Payload。在攻击时,需要同样的请求且被反复执行,在没有任何修改原始请求的情况下此Payload是非常有用的。它可用于各种攻击,比如Cookie的序列分析、应用层DDoS、或保持会话令牌是在其它的间歇试验中使用。
- 字符frobber(Character frobber):这种类型的Payload的生成规律是:依次修改指定字符串在每个字符位置上的值,每次修改都是在原字符上递增一个该字符的ASCII码。它通常用于测试系统使用了复杂的会话令牌的组件来跟踪会话状态。如果修改会话令牌中的单个字符的值之后,其会话还是进行了处理,那么很可能是这个令牌实际上没有被用来追踪的会话。
- Bit翻转(Bit flipper):这种类型的Payload的生成规律是:对预设的Payload原始值,按照比特位,依次进行修改。
- 用户名生成器(Username generator):这种类型的Payload主要用于用户名和email账号的自动生成。
- ECB 加密块洗牌(ECB block shuffler):这种类型的Payload是基于ECB加密模式的Payload生成器,关于加密模式可以点击阅读相关文章做进一步的了解。其原理是因为ECB加密模式中每组64位的数据之间相互独立,通过改变分组数据的位置方式来验证应用程序是否易受到攻击。
- Burp Payload生成插件(Extension-generated):这种类型的Payload是基于Burp插件来生成Payload值,因此使用前必须安装配置Burp插件,在插件里注册一个Intruder payload生成器,供此处调用。
- Payload复制(Copy other payload):这种类型的Payload是将其他位置的参数复制到Payload位置上,作为新的Payload值,通常适用于多个参数的请求消息中,它的使用场景可能是。
1. 两个不同的参数需要使用相同的值,比如说,用户注册时,密码要求输入两遍,其值也完全一样,可以使用此Payload类型。
2. 在一次请求中,一个参数的值是基于另一个参数的值在前端通过脚本来生成的值,也可以使用此Payload类型。
选择第一个简单列表(Simple list),点击【Add From List】下拉条里面选择Usernames。如17所示。
17 添加系统默认的Usernames参数
接下来Payload Sets 选择2,配置password参数,同样选择第一个简单列表(Simple list),如16选择Passwords。再通过Add加入一些想设置的暴力登录用户名和密码参数。最后点击开始攻击,即可进行登录功能暴力破解。破解完毕通过查看响应消息来查看哪些参数破解成功。
对于两个小工具:Decoder编解码器和比较器,相对比较简单,本书就不进行介绍。
星云测试
奇林软件
联合通测
顾翔凡言:
k=(p+m)t
其中:
k为常数。
p:团队人员质量水平,为单位小时内产生的有效质量,单位为/h;
m:团队方法质量水平,为单位小时内产生的有效质量,单位为/h;
t:为单位质量产品的交付时间,单位为h。
在团队方法质量水平不变,团队人员质量水平提高的情况下,交付时间变短;
在团队人员质量水平不变,团队方法质量水平提高的情况下,交付时间变短;
团队人员质量水平与方法质量水平乘积决定了软件的质量水平,如果这个值变小,则t变大;反之t变小。
例如,当k=4时:
当人员质量水平为1/小时、方法水平为1/小时时,交付时间为2小时。
当人员质量水平为2/小时、方法水平为1/小时时,交付时间为4/3小时。
当人员质量水平为1/小时、方法水平为2/小时时,交付时间为4/3小时。
当人员质量水平为0.5/小时、方法水平为0.5/小时时,交付时间为4小时