社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 453阅读
  • 1回复

[分享]如何打造一款可靠的WAF(Web应用防火墙)

楼层直达
z3960 
级别: 茶馆馆主
发帖
770593
飞翔币
207694
威望
215657
飞扬币
2511651
信誉值
8


 (1) WAF实现WAF包括哪些组件,这些组件如何交互来实现WAF防御功能(2)WAF规则(策略)维护规则(策略)如何维护,包括获取渠道,规则测试方法以及上线效果评测(3) WAF支撑WAF产品的完善需要哪些信息库的支撑
  一、WAF实现
  WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。不管硬件款,软件款,云款,核心都是这个,而接下来围绕这句话来YY WAF的实现。WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成
  1. 配置模块
  设置WAF的检测粒度,按需开启,如图所示

  2. 协议解析模块(重点)
  协议解析的输出就是下一个模块规则检测时的操作对象,解析的粒度直接影响WAF防御效果。对于将WAF模块寄生于web 服务器的云WAF模式,一般依赖于web 服务器的解析能力。

  3. 规则模块(重点)
  重点来了,这块是WAF的核心,我将这块又细分为三个子模块。
  (1) 规则配置模块 (2)规则解析模块
  主要作用是解析具体的规则文件,规则最好采用统一的规则描述语言,便于提供给第三方定制规则,ModSecurity这方面做得非常优秀。
  规则文件由四部分组成,分为变量部分、操作符部分,事务函数部分与动作部分。

  (3)规则检测模块
  上一步我们设置了各种变量,接下来就是按照一定的逻辑来做加减乘除了。

  IP黑白名单配置、 URL黑白名单配置、以及挑选合适的规则套餐。
 4. 动作模块(重点)

  通过规则检测模块,我们识别了请求的好恶,接下来就是做出响应,量刑处理,不仅仅是拦截。

  5. 日志模块(重点)
  日志处理,非常重要,也非常火热,内容丰富到完全可以从WAF独立出来形成单独的安全产品(e.g.日志宝)而采用提供接口的方式来支撑WAF。对于数据量巨大的云WAF,都会有单独的大数据团队来支撑架构这一块,包括数据存储(e.g. hdfs) ,数据传输(kafka),数据离线分析(hadoop/spark),数据实时分析(storm),数据关联分析(elasticsearch)等等,以后另开一篇单独说明。

  6. 错误处理模块
  以上模块运行错误时的异常处理
  二、WAF规则(策略)维护
  WAF需要修炼一图以蔽之

  三、WAF支撑信息库
  WAF需要修炼一图以蔽之

  以上支撑库几乎所有的安全人员都在重复地做,而资源没有共享的原因,一是内部不可说;二是没有采取统一的描述语言无法汇合,唉,安全从业人员的巴别塔。
 
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。
z3960 
级别: 茶馆馆主
发帖
770593
飞翔币
207694
威望
215657
飞扬币
2511651
信誉值
8

只看该作者 1 发表于: 2015-06-14

0x00.概述
  0.1 起因
  前段时间在zone里看到有人问4A的渗透测试,本人正好接触过几款4A和堡垒机产品,今天抽空就总结下个人在渗透中遇到的4A问题。
  0.2 4A
  4A是指:认证Authentication、账号Account、授权Authorization、审计Audit,中文名称为统一安全管理平台解决方案。即将身份认证、授权、审计和账号(即不可否认性及数据完整性)定义为网络安全的四大组成部分,从而确立了身份认证在整个网络安全系统中的地位与作用。(百度百科)。
  0x01.认证Authentication
  认证的方式一般有以下几种:
  静态口令
  动态口令令牌
  USB令牌
  存在的问题有:
  1.1 账号枚举
  这里的账号枚举并不是仅仅知道哪个账号存在,哪个账号不存在。
  String mobileNumber = request.getParameter("mobile");
  if(StringUtiles.isNotEmpty(mobileNumber)){
  PrimaryAccount primaryAccount = new PrimaryAccount();
  primaryAccount.setMobile(mobileNumber);
  List paList = accountService.getPraccList(PrimaryAccount);
  if(CollectionUtils.isNotEmpty(paList)){
  username = paList.get(0).getPracctName();
  }
  }
  ......
  if(StringUtiles.isBlank(errMsg)){
  errMsg = "认证失败"
  }
  String oper = "主账号:" + username + "登录4A认证不成功,原因:" + errMgs;
  ......
  从上面账号可以看到,登录时,如果你输入的是手机号,那么登录失败的时候,就会将手机号对应的username返回,那么我们就可以拿手机号和用户名到密码找回页面等地方做进一步的测试。
  1.2 锁屏绕过
  在某厂商的4A平台上有个锁屏的功能,即点击锁屏时,4A管理界面就会被锁定,重新输入密码后,就可以进入管理平台。
  Ext.Ajax.request({
  url : '../platform/login!lockLogin.do',
  params : {
  name : name,
  lockPwd : lockPwd
  },
  success : function(rsp,opt){
  var responseArray = Ext.util.JSON.decode(rsp.responseText);
  var result = responseArray.resultStr;
  var desc = responseArray.descStr;
  if(result == true){
  $.unblockUI();
  $("#lockPwd").val("");
  times=0;
  }else if......
  }
  })
  从代码可以看到,只要result == 0,就可以解锁,那么我们可以用burp拦截response,也可以修改JS等。
  0x02.账号Account
  4A中账号分为主账号和从账号,一个用户只会有一个主账号,唯一标识了他的身份。这个主账号还会有N个从账号,对不同的系统会有不同的从账号,方便用户访问其可以访问的系统。如下图

  2.1 重置用户密码
  http://wooyun.org/bugs/wooyun-2010-072644
  在这个bug中,可以通过修改密码的功能,重置其他用户的密码。典型的账号管理问题。
  2.2 token
  token在4A中可谓是到处都是,那么如果token验证不严谨,很可能出现戏剧性的结果。接下来这个漏洞给大家展示token失效的时候。

  这个页面不是通过4A登录过来的,而是直接访问网站的登录界面,登录后的页面。

  上面的图是通过4A登录后,访问系统时,将URL和username修改为管理员的页面和用户名,然后可以看到,页面显示的就是管理员的页面了。
  0x03.授权Authorization
  授权一般分为:
  1.基于用户的授权UBAC
  2.基于用户角色的授权RBAC
  3.基于资源的授权ABAC
  存在的问题有:
  3.1 调用cmd
  4A权限分配中有个很重要的功能就是基于资源的授权,比如给主账号A分配一个securecrt,让其可以使用SSH,给主账号B分配一个notepad,让其可以使用记事本。但是大家都知道通过浏览器、记事本等“查找文件”的功能可以调出cmd等功能。
  如下图,是通过分配的IE浏览器,直接调用出cmd窗口,接下来,你想干什么,都OK。

  3.2 访问他人资源
  一般的4A中都集成了“个人文件夹”功能,这个文件夹就是可以上传文件到自己的文件夹里面,但是点击个人文件夹时,可以修改username,然后就看到了其他人的文件。

  3.3 下载文件
  同样是个人文件夹(或者其他提供下载的地方)的问题,可以下载指定的文件,但是没有对文件做限制,可以下载任意文件。
  public String execute() throws FAException{
  ......
  String file = request.getParameter("file");
  String place = request.getParameter("place");
  String fileName = request.getParameter("filename");
  download(file,fileName,request,response,place);
  }
  private void download(String file,String fileName,HttpServletRequest request,HttpServletResponse response,String place) throws FAException{
  ......
  path = (request.getSession().getServletContext().getRealPath("/") + file).replace("/",File.separator).replace("",File.separator);
  }
  FileInputStream fis = new FileInputStream(path);
  ......
  response.setHeader("Content-Disposition","attachment:filename="" + fileName_zh + """);
  从代码中可以看到,通过获取file等参数,然后直接就下载文件了。。
  3.4 前置机
  一些堡垒机具有前置机,意思是某些在堡垒机中实现不了的功能(比如内置pcanywhere,只是比如),那么就需要把pcanywhere放到前置机中,当需要使用pcanywhere时,就会远程登录到前置机上,调用pcanywhere的页面。
  问题是什么呢,既然是远程登录调用pcanywhere的页面,那么我们只要使用windows键或者使用alt+tab就可以切换到其他程序上,进而就控制了前置机。
  大家可以看看这个密钥问题。。
  0x04.审计Audit
  审计主要是对登录、访问等所有的动作记录日志,查看是否有不合规的事件。
  4.1 伪造登录IP
  帕拉迪/华为/江南天安堡垒机伪造WEB登录来源IP漏洞
  在这个bug中通过x-forwarded-for伪造了登录的IP,这就对日志造成了影响,如果以后需要整理日志,或者根据日志找出不合规事件,那就会存在很大的影响。
  0x05. 总结
  以上只是列举了我在测试4A或堡垒机时遇到过的问题,肯定还有许多猥琐的方式我没有观察到,欢迎大家补充。
  元旦在家码字不容易。
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。