AppScan 常见安全漏洞解决方案

一、 环境准备

测试通常给的是 PDF 文档,动辄几百页,看起来很费劲,看文档的时间可能比解决问题的时间还长。。。所以作为需要解决问题的我们来说,最好安装 AppScan,请测试人员提供类型为 AppScan Scan File 的文件。(图片模糊掉了 URL,不影响问题分析)

二、 如何分析 AppScan 扫描出的安全性问题
AppScan 扫描出的问题会一般按照严重程度分高,危,参三种类型,高危属于必须要解决的问题;低危一般属于 config 配置,或 IIS 配置问题;低的问题,一般也可能是高,低的衍生问题,高危问题造成的衍生问题特别多,故解决问题时,建议从高至低看,并且先易后难,最常见的就是 SQL 盲注,以 SQL 盲注为例分析:
当收到测试的测试文件后,双击打开,以疫苗资审为例:

打开之后,分析和定位问题的话,就是看红框框出的几个地方,SQL 盲注这个问题就是 AppScan 向测试网址发送了一个地址:
/Admin/Agent/PackInfo.aspx?id=61+having+1%3D1–+, 此时是将 id 的值由 61 改成了 61+having+1%3D1–+,就是注入了 +having+1%3D1–+,程式只要能在这个地址请求的时候,提示 User,并终止当前的操作,AppScan 即视为这个这个问题解决,下次扫描的时候就扫描不到了。

三、 高危常见问题解决方案
1. SQL 盲注:
主要就是通过注入 SQL 的关键字,来破坏原有的查询,导致页面报错
a. 看看几种常见的盲注方式:


b. 解决方案
思路:过滤关键字,在 global.asax 文件中的 Application_BeginRequest 方法中校验敏感字符 / 字母组合,具体参考网址 http://www.jb51.net/article/34671.htm,
具体文件在链接地址的 SqlChecker.cs 中,项目具有共性,也有特性,所以,SqlChecker.cs 中的 StrKeyWord,StrRegex 视实际情况而定。
实际解决:从上面的几种注入分析看,都含有 + 字符,最简单最暴力的方法就是过滤掉 + 字符,如果这样与代码冲突的话,可以按照攻击的方式过滤:如过滤掉 +and+,+or+,’+and+’ 等等。。。
2. SQL 注入
a. 看看几种常用的 SQL 注入方式

b. 解决方案
思路:SQL 注入与 SQL 盲注实际的攻入方式不同,但是解决思路都是通过过滤特殊字符,只是过滤的字符稍有差异。
实际解决:从以上几种注入可以看出都含有 %27%3B,开始解析 %27%3B 是什么字符,发现注入 sql 的是 这个字符,在 vs 里面过滤掉 这个字符即可。
备注:SQL 注入的方式很多,这只是其中的一种,还有其它的种类,比如下图,要具体问题具体分析:

3. 基于跨站点的编制
思路与 1,2 相同,解决方法也是根据测试的结果过滤掉特殊字符。

4. 已解密的登录请求

解决方案:安装 SSL 协议,或其它安全加密协议。

5. ASP.NET 表单认证旁路
思路:这个问题看起来很高大上,高大上到上网查都没查到解决方案,看着这个报错也是想了很久。。。。现在我们看下这个问题的相关信息
a. 首先是问题信息:原始响应与测试响应对比,测试响应的 Cookie 中少了 ASP.NET_SessionId,就是测试响应除去了 cookie”ASP.NET_SessionId”(变体标识 675),故猜测可能禁止修改客户端修改此 cookie 就可以了,在 global 文件中加了句代码,开始测试。


b. a 的方法测试结果是问题仍然存在,于是看了下修订建议, 判断此建议并不可行,因为四川九个系统都部署在一个服务器上,如果是环境问题造成的漏洞,那应该是九个报告都有。。。但是,这个问题仅仅出现在两份报告里面。

c. 最后看”请求 / 响应”页(第一幅图),将 GET 后面的地址放到浏览器中测试,地址如下:

这个地址路径在项目中并不存在,所以理论上应该报 404 的错误,但是打开 F12 查看,发现实际的状态是 200,这说明有可能是 StatusCode 错误造成的问题,如果是这个问题的话,只需要在跳转的界面中将状态修改成 404 即可。基于这样的写法,我们开始找跳转的地方,发现是在 Application_Error 方法中(第二幅图),于是去设定跳转界面的 StatusCode:HttpContext.Current.Response.StatusCode = 404;(第三幅图),再次测试,问题解决。



实际解决:在跳转的最终页面设定 StatusCode。
四、 低危常见问题
1. 检测到隐藏目录
这个问题是 AppScan 直接请求项目中存在的文件夹名称,观察项目反馈。反馈分为几种,不作说明,只要配置 IIS,并且代码做管控就可以了。方法如下:
a.1 首先是 IIS 配置:



a.2 相应页面代码设定,请注意这里的无权限设定,StatusCode 也是 404,不要设定成 403。

2. 启用了 Mircrsoft Asp.Net 调试
设定 webconfig 中节点:compilation debug=”false”

3. 已解密的 _ViewStatus 参数
增加节点 machineKey

4. 自动填写未对密码字段禁用的 HTML 属性
对密码栏位增加属性:autocomplete=“off”

5. 发现电子邮件地址模式
删除项目所有注释中涉及到的邮件地址
五、 如何问题归类
项目中加了 check SQL 盲注的代码后,确实 SQL 盲注,SQL 注入,SQL 旁路注入,跨站点脚本编制都没有了,但是出现了这么多新的问题(图一),WHY????

(图一)
仔细分析每个错误,如下几个问题,报的错都是一样的,所以这些应该是一类的问题,只要解决一个地方,就可以消除这些错误。
从四个红色框中的内容,尤其是最下面的一段 script 脚本(项目开发中自定义脚本)可以发现代码已经检测到这个请求是有问题的,也将当前页面跳转,但是 StatusCode 仍然是 200,这显然是错误的,所以修改 StatusCode 状态为 400,或 404 即可。


(图二)

(图三)

(图四)

(图五)
修改之后测试结果如下:状态是 404,问题消除。

六、 处理问题注意点
a. 首先看报告中的修订建议,如果没有明确的建议,则看请求 / 响应部分,目前看来,所有的问题在这里都能找到原因和答案。
b. 设定跳转时,请设定 StatusCode,不管是 global 中的跳转还是代码里面由于某种校验失败而执行的跳转 (非常重要)
c. 不要过分纠结某个问题和标题,AppScan 同一个问题会造成很多的衍生问题,注意看请求 / 响应中的请求地址,响应状态和推理,属于同类问题的一种解决方法即可