随着WEB应用的日益丰富,越来越多的传统企业开始使用WEB应用来开展在线业务,与此同时,黑客也将攻击技术研究的重点转到了WEB应用方面,从而加剧了WEB应用的安全风险。
同时有数据显示,有约98%的网站曾经遭受黑客攻击,黑客的袭击一直是行业性的问题,从互联网发展至今从未间断过。
本次将分享基于业务安全的Web测试,将分为6个板块来进行演示介绍。分别为:基于业务的安全测试,暴力破解,篡改登录用户名信息,截包篡改手机短信/E-mail验证码、横向越权—查看与修改、删除、CSRF token。
举个例子:在一个电商企业的系统中,假设现有库存货品20个,单价为30元,买家现有资金100元,购1个,那么当前库存为19个,买家所剩资金为70元。若在代码编写阶段没有控制购买数量只能大于0的话,可能会出现一种情况,客户可以在购买数量栏填写负数,如-3,就会出现剩余数量为22,客户剩余资金为160的情况。该漏洞产生的根本原因是没有控制用户输入的购买数量必须大于0,这就是所谓的基于业务安全的漏洞。
在《性能之巅》一书中的阐述了这么一个观点:知识可以分为已知的已知的知识;已知的未知的知识和未知的未知的知识。我们把已知的未知改为未知的已知。根据业务安全测试可一一对应:
已知的已知=已知的已经出现的BUG,即该BUG已经出现过,已有应对方法,只需实施修改即可;
未知的已知=未知的已经出现的BUG,即已经出现在程序的BUG,但还没有找到,可通过脚本式测试或者探索式测试来应对;
未知的未知=未知的没有验证的模块,即未出现的BUG,但有出现的可能性。
通过已知的bug可预知新的bug的出现,可通过探索式测试,找到并在软件开发测试之前进行以预防为主的测试。例如要基于Python的Djiango内的Web应用框架编写代码,那么已经可知当访问数据库时,不要使用传统的Python访问数据库的方式,而要采用Djiango自带的MTV的结构去访问数据库,就可避免SQL注入的缺陷。
对于TDD概念,是现代软件开发中非常重要的概念之一,以测试用例为驱动的测试方法,要求开发人员,开发出符合测试用例的程序,然后通过测试用例对程序进行验收,这被叫做“测试先行的开发”。
但并不一定都是自动化测试,可以根据脚本来进行测试,也可以基于word或者Excel格式的文本化的用例来进行测试,只需要将事先写好的测试用例供开发人员参考,可以在开发阶段进行就避免了,这样争取做到测试用例中出现的bug不出程序中发现。
但是如何发现BUG主要看传统安全测试与基于安全的测试的区别,而传统的安全测试是以预防为主的,业务安全测试是以测试为主的。
暴力破解——Burp suite测试工具。
步骤:
1、设置internet网络代理:在浏览器中设置代理经常会遇见一些bug,因此不建议使用浏览器设置。使用控制面板设置网络代理,首先打开控制面板,点击网络和internet,再点击INTERNET选型,点击局域网设置,勾中代理服务器下的两个设置,并设置地址为127.0.0.1,端口为8888;取消自动配置下的两个设置,即可点击确认,确认后再检查一遍确认无误之后代理设置即完成。
2、启用Burp suite:安装Burp suite后,Burp suite需要安装JAVA环境才可以运行 需要先安装JDK1.8版本,再通过汉化启动,启动进入Burp suite。
3、禁用拦截请求:在代理工具下的截断功能中关闭拦截请求,变为拦截禁用。
4、修改代理监控器:在代理工具下的选项功能中改变默认端口,默认端口为8080端口,与Tomcat是冲突的,因此把监听端口改为8888,并选择指定地址。
5、启动被测程序:打开被测程序,并用浏览器进入该程序。
6、进入登录页面:通过Command(命令提示符号)窗口,输入IP config,将IP config中显示无线局域网适配地址复制,到登录页面上将地址127.0.0.1改为该登录地址,再次登录,由于传输过程中,使用了SHA256进行传输,所以选择用户名与密码时可发现,密码会变得很长。
7、启用拦截:成功登录后就可以开始抓包,将拦截禁用改为拦截请求,启用后开始拦包。
8、登录操作:返回登录页面输入用户名密码登录,发现页面不变。
9、拦截包:因为包已被Burp suite直接拦截。
10、发往测试器:将拦截的包发送至intruder,在测试器中会对默认选项进行标记,成为参数,我们只需要针对用户名和密码进行暴力破解,将不需要进行参数化的选项前的§删除,由于存在CSRF token,需要把值保持一致,最后剩下两个参数:用户名与密码。
11、设置攻击类型:这里选用集束炸弹攻击,攻击类型有两种:音叉攻击与集束炸弹。音叉攻击是用户名与密码一一对应的,需要两组字典,每组字典中的一行对应另一组的对应行;集束炸弹是在账号密码均未知的情况下,对他们同时进行暴力破解,需要两组字典,每组字典的账号,密码都会去匹配另一组的账号所有的密码。
12、载入攻击字典:再点击有效负荷,清屏后载入事先设置好的用户名和密码。
13、设置有效负载处理:密码传输过程中需要进行SHA256加密处理,所以在有效负载处理中选择合适的Hash算法。
14、开始攻击:以上步骤设置完毕,就可以开始攻击。若破解不成功,在“响应”的body里会看到“用户名或者密码错误”,若破解成功,则响应代码是直接302反向跳转。使用Burp suite进行暴力破解,就这个案例,可参考字节长度或者状态来判断是否成功,没有成功破解的是直接返回登录页面,因此字节数较长,而破解成功的字节数不需要跳转,因此字节数比较短。
暴力破解的注意事项:
1、 不要使用浏览器自带的代理设置,选择 “控制面板”中的internet-连接中的设置。
2、 不用勾选“使用自动配置脚本”。
3、 打开Burp suite,先禁用拦截,配置环境,环境配置完毕,再启用拦截。
4、 如下图,“起动中”前的√一定要勾上。
5、 截包必须使用真实IP地址,不要使用127.0.0.1或localhost,用Command里面的用IP config。
6、 破解字典是区分大小写的。
暴力破解——JMeter测试工具
打开控制面板,启动程序,用网页打开测试程序能否使用,确认能使用后,打开JMeter,在登录界面打开事先准备好的脚本,由于JMeter无法使用集束炸弹,因此使用音叉方法来进行,需要一个用户名对应一个密码,然后进行发包。
在登录验证界面可查看,登录验证字体是绿色的即是破解成功,红色的则是失败。找到成功破解的绿色登录验证,再通过Debug Sampler找到用户名与密码。
注意所有通过Burp suite进行测试的工作均可以通过JMeter实现。
暴力破解看似对白帽黑客并无用处,实际上并非如此,一般程序都是由用户自行设置用户名与密码的,企业可以先行对产品进行一次暴力破解,筛选出过于简单易被破解的密码,用邮件或者短信的方式通知用户修改用户名与密码,甚至可以设定强制性修改密码。若能提供这样的服务,则能给用户带来更好的体验感,这种情况下,测试可以作为一项增值业务。
测试步骤:
1、 设置internet网络代理
2、 启动Burp suite
3、 进入登录页面
4、 输入用户名、密码
5、 拦截请求包
6、 修改cookies用户名为未注册用户
7、 发送请求包
8、 观察情况
输入已注册过的A的用户名密码进行登录,打开Burp suite,登录后抓包模块会被截取,在此输入登录信息,会看见A的用户名与密码的信息,用户名是放在username的cookie中的,点击“行动”选择发送到repeater中,在repeater里,可以改cookie-username为已有的另一用户名B,最终登录的是A的账号,而显示的是B的用户名。点击发送,可进入商品列表,若我们把用户名改为一个未注册过的用户,cookie中显示的是该新用户,发送后仍可进入商品列表。这就是存在的一个缺陷,对于此缺陷,可采用以下方法防御:
从正常的修改密码流程中使用Burp suite拦截发送用户名和手机号请求信息,修改手机号,并再次发送,然后观察它的表现。
用手机、短信或者邮件找回密码的方式都是类似的。在数据库中存有已注册用户的用户名、密码、邮箱、电话等信息,而且密码是通过SHA256进行加密的,是一个长字符串。当用户使用短信验证输入用户名与手机号时,若与数据库中信息一致,则会通过手机发回验证码,重设密码;若是在传输过程中,手机号码被截取,收到验证码后会在输入新密码时提示信息被截取,验证码错误。
再打开代理,Burp suite启用拦截,在网页中再次点击获取验证码,包就已被Burp suite拦截。点击“行动”选择发送给repeater,在repeater里,改变手机号码,再发送请求,在响应包中并没有显示用户名与密码,而是显示“注册的用户名和手机不匹配”请重新输入。这样就已经成功篡改用户名与密码,黑客可将验证码发送至自己手机,在通过这个页面获取密码,输入验证码,而后修改用户名与密码,手机、短信或者邮箱都可通过截取传送的信息进行篡改。
横向越权指的是攻击者尝试访问或修改与他拥有相同权限的用户的资源。以上述电商网站为例:
查看:当登录A用户的账号后,我们可以查看该用户的各类信息,建立订单,拷贝订单URL地址,再登录B用户账号,逐一粘贴订单信息URL地址,查看是否有权限查看。
修改与删除:在A用户登录后拷贝修改用户配货信息地址后,建立订单,拷贝删除用户订单信息,再登录B用户账号,试图删除前面拷贝所得的A用户的信息。
破解CSRF token
为了防止DDoS攻击,一个用户一天只允许输入用户名密码3次,若是超过3次输入,则存在一个暴力破解的可能性,账号就会被封掉。黑客应对这一情况最常用的方法就是在本地复制地址,将action改为绝对路径,再通过Burp suite进行暴力破解,获取相应内容。
该方法采用的是通过一个token,在地址里加一个hidden字段,设置100个随机长度的字符串,此方法为Djiango的解决方案。
当我们往服务器或客户端发送请求时,带有一个middle ware hidden的字段,并其名为CSRF token的这么COOKIE的字段,发送至服务器后,服务器自动检测两个值是否相等,若相等,则返回Web匹配,否则返回403不匹配。
在这种情况下,可以人为在form表单中加一个hidden字段,但是在cookie中无法加,因此cookie中没有hidden字段,与100长度的字段不匹配,故而报403错误。
比如在JMeter中,可以通过正则表达式获得参数,将100长度的字符串的token值取代,获取到token里的字段后,通过建立一个cookie manager,往CSRF token中发送该字段,同时往csrfmiddleware里发送COOKIE token的值。这样两个值肯定是一样的,CSRF token被破解。
若使用python中的requests类来写接口测试,则可以将这100个字符串放在一个变量中,设在cookie里通过request post 传输,同时触发body里的username、password和一个hidden字段,此时两个值是相等的,CSRF token就能被破解。
Web的安全测试是一个很大的题目,在如今web应用发展越来越蓬勃的时刻,随着手机技术、html5带来了许多新的挑战和机遇,Web安全技术也应该紧跟时势的发展,不断演变地更好。