一种绕过AppScan未加密漏洞的简单方法(附代码)

AppScan能检测出你的web应用未经加密就传输了confidential信息,如password,并将其报告为高危漏洞,如下所示:

已解密的登录请求
严重性:
CVSS
分数: 8.5
URL
http://192.168.1.1/cgi-bin/check_auth.json
实体:
password (Parameter)
风险:
可能会窃取诸如用户名和密码等未经加密即发送了的用户登录信息
原因:
SSL (安全套接字层)可为 HTTP 提供数据机密性和完整性。通过加密 HTTP 消息, SSL 可防止攻击者窃听或更改消息内容。登
录页应始终采用 SSL 来保护从客户机传输到服务器的用户名和密码。如果不使用 SSL ,会使用户凭证在传输到服务器期间作为
明文公开,从而易被窃听。
固定值:
发送敏感信息时,始终使用 SSL POST (主体)参数。
POST /cgi-bin/check_auth.json HTTP/1.1
Content-Length: 92
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
Host: 192.168.1.1
Cookie: loginRight=1; loginTimes=0
X-Requested-With: XMLHttpRequest
Connection: keep-alive
Referer: http://192.168.1.1/cgi-bin/login.asp
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Language: en-US
frashnum=&action=login&Frm_Logintoken=1&username=user&password=**CONFIDENTIAL 0**&Username2=&Password2=

 

原因是我的web server还是采用http协议,没有采用https协议。解决该问题最彻底的方法当然是采用https,即通过SSL对传输的所有内容进行加密。但是由于我项目中的web server是由供应商提供的,是一款很古老的web server,如果要支持ssl需要进行再开发,供应商暂时不愿意。那么有没有一种方法,在http下也能实现加密传输呢?或者至少不会被appscan发现?

1. 我先尝试对password进行加密。

我的加密方法蛮简单,就是在前端加上时间戳信息,即在传输password时前面加上时间信息,然后用$把它和后面的password原值分隔开。在服务器侧再把时间戳剥离,校验时间是否在某个范围之内,再校验password原值。这里的时间戳就是各个操作系统都广泛采用的,从1970年某一天到现在的时间间隔,精确到秒即可。

这样做了以后,发现appscan还是报告password没有进行加密传输。但是这样做的好处是,appscan是没法通过分析你录入的Login或者其它手动探索的内容,拿到密码并在后续自动化扫描中登录进你的系统中。因为(1)如果appscan是记录你在password输入框中的手动输入,则仅有该数据是无法登录的;(2)如果appscan是通过截取网络包,因为每次带的时间戳不一样,依然无效;(3)web server会首先校验时间戳,这样的话appscan如果发送恶意代码,则第一时间会被拒收。appscan不能自动登录,则系统的攻击面就会少一些,虽然通过手动探索依然可以触达。

但是这种加密方式对于真正的黑客是没有用的,因为前端的javascript代码是对用户透明的,可以简单地通过浏览器的开发工具获取。只是appscan还没有智能到这个地步。

2. 我尝试修改password的name属性的值

在html的源码中,password这个input field是这样描述的

<li><input type="password" class="password"  id="Frm_password" name="password" maxlength="256" size="14" autocomplete="off"></li>

把这个值改为yourcode

<li><input type="password" class="password"  id="Frm_password" name="yourcode" maxlength="256" size="14" autocomplete="off"></li>

从chrome浏览器的F12出现的开发工具窗口观察,发送的数据里确实从password切换到了yourcode。但是appscan还是识别出来yourcode是密码,并且没有经过加密就传输。

那么我认为,appscan是通过识别type="password"这样的关键字来确定该input是否是密码了。name属性是提交form时必须,否则就不会发送到网络。详情见我另一篇博客 如何在html的form提交时排除某些input field的内容. 那我是否可以不提交这个input field,另外创建一个input field,把值传给它呢?

3. 创建hidden input field,把password的值传给它

(1)把password input field中的name属性去除,这样它就不会出现在网络发送中,自然也就不会被appscan捕捉到

<li><input type="password" class="password"  id="Frm_password" maxlength="256" size="14" autocomplete="off"></li>

(2)但是password的值还是Login需要的,所以创建另一个hidden input field,

<input type="hidden" name="yourcode" id="Frm_yourcode" value="">

注意,这一条必须放在和真正的password同一个form区域里。否则提交form的时候它不会发送到网络上。

在点击提交的javascript函数里,增加赋值的代码

$('#Frm_yourcode').val(function(n, c){
      let currentDateTime = new Date();
      let resultInSeconds=parseInt(currentDateTime.getTime()/1000);
	  //console.log("currenttime is "+resultInSeconds);
      return resultInSeconds+"$"+ $('#Frm_password').val();
    });

这是jquery代码,需要在调用文件中加入该库的引用,如:

<script language='javascript' src='/JS/jquery.js'></script>

上面那段javascript代码就是从password的输入框(id=Frm_password)中取数,前面加上时戳和‘$’,返回给id=Frm_yourcode的value。

改完后,提交form,从 从chrome浏览器的开发工具窗口观察network,发送的数据中type="password" 的那个input field没有了,而新增的hidden的yourcode出现了,值就是时戳+$+原始密码。

用appscan进行扫描,它再也无法识别出通过这种途径提交的密码。也就没有未加密高危漏洞了。

需要指出的是,本文介绍的方法并没有从根本上堵住漏洞,只是绕过了appscan的检查。之所以我敢这么做,是因为我这个项目的web server是运行在一个家庭终端,必须要通过网线直连或者wifi直连192.168.1.1才能连上,进行修改终端配置等操作。可以说基本上没有黑客攻击的风险,既可操作性差,也无价值。 客户之所以坚持要做这样一个安全扫描,完全是集团高层的统一要求,没有实际意义。

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值