1.5. 代码审计
1.5.1. 简介
代码审计是找到应用缺陷的过程。其通常有白盒、黑盒、灰盒等方式。白盒指通过对源代码的分析找到应用缺陷,黑盒通常不涉及到源代码,多使用模糊测试的方式,而灰盒则是黑白结合的方式。
1.5.2. 常用概念
1.5.2.1. 输入
应用的输入,可以是请求的参数(GET、POST等)、上传的文件、网络、数据库等用户可控或者间接可控的地方。
1.5.2.2. 处理函数
处理数据的函数,可能是过滤,也可能是编解码。
1.5.2.3. 危险函数
又常叫做Sink Call、漏洞点,是可能触发危险行为如文件操作、命令执行、数据库操作等行为的函数。
1.5.3. 自动化审计
一般认为一个漏洞的触发过程是从输入经过过滤到危险函数的过程,而审计就是寻找这个链条的过程。
1.5.3.1. 危险函数匹配
白盒审计最常见的方式是通过搜寻危险函数与危险参数定位漏洞,比较有代表性的工具是Seay开发的审计工具。这种方法误报率相当高,这是因为这种方法没有对程序的流程进行深入分析,另一方面,这种方式通常是孤立地分析每一个文件,忽略了文件之间复杂的调用关系。
具体的说,这种方式在一些环境下能做到几乎无漏报,只要审计者有耐心,可以发现大部分的漏洞,但是在高度框架化的代码中,能找到的漏洞相对有限。
1.5.3.2. 控制流分析
在后来的系统中,考虑到一定程度引入AST作为分析的依据,在一定程度上减少了误报,但是仍存在很多缺陷。
而后,Dahse J等人设计了RIPS,该工具进行数据流与控制流分析,结合过程内与过程间的分析得到审计结果,相对危险函数匹配的方式来说误报率少了很多,但是同样的也增加了开销。
1.5.3.3. 灰盒分析
国内安全研究员fate0提出了基于运行时的分析方式,解决了控制流分析实现复杂、计算路径开销大的问题。
1.5.4. 手工审计方式
- 拿到代码,确定版本,确定能否正常运行找历史漏洞找应用该系统的实例
- 简单审计,运行审计工具看是否有漏洞
- 大概看懂整个程序是如何运行的文件如何加载类库依赖有没有加载waf
- 数据库如何连接mysql/mysqli/pdo有没有用预编译
- 视图如何形成 能不能xss能不能模版注入
- SESSION如何处理文件数据库内存
- Cache如何处理文件cache可能写shell数据库cache可能注入memcache
- 看账户体系
- 管理员账户的密码加密方式泄漏数据后能不能爆破密码重置漏洞
- 修改密码漏洞修改其他人密码
- 普通用户的帐号能否拿到普通用户权限普通用户帐号能否盗号重点找没有帐号的情况下可以访问的页面是不是OAuth
- 攻击SQLi看全局过滤能否bypass看是否有直接执行sql的地方
- 看是用的什么驱动,mysql/mysqli/pdo如果使用PDO,看是否是直接执行的地方
- XSS全局bypass直接echo看视图是怎么加载的
- FILE上传下载覆盖删除
- 包含LFIRFI全局找include, require
- 正常上传看上传是如何确定能否上传文件的
- RCEcall_user_funcevalassertpreg_replace /eXXECSRFSSRF反序列化
- 变量覆盖extractparse_strarray_mapLDAPXPathCookie伪造
- 过滤
- 找WAF看waf怎么过滤的,相应的如何绕过
1.6. WAF
1.6.1. 简介
1.6.1.1. 概念
WAF(Web Application Firewall,Web应用防火墙)是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供加固的产品。 在市场上,有各种价格各种功能和选项的WAF。在一定程度上,WAF能为Web应用提供安全性,但是不能保证完全的安全。
1.6.1.2. 常见功能
- 检测异常协议,拒绝不符合HTTP标准的请求
- 对状态管理进行会话保护
- Cookies保护
- 信息泄露保护
- DDoS防护
- 禁止某些IP访问
- 可疑IP检查
- 安全HTTP头管理X-XSS-ProtectionX-Frame-Options
- 机制检测CSRF tokenHSTS
1.6.1.3. 布置位置
按布置位置,WAF可以分为云WAF、主机防护软件和硬件防护。云WAF布置在云上,请求先经过云服务器而后流向主机。主机防护软件需要主机预先安装对应软件,如mod_security、ngx-lua-waf等,对主机进行防护。硬件防护指流量流向主机时,先经过设备的清洗和拦截。
1.6.2. 防护方式
WAF常用的方法有关键字检测、正则表达式检测、语法分析、行为分析、声誉分析、机器学习等。
基于正则的保护是最常见的保护方式。开发者用一些设定好的正则规则来检测载荷是否存在攻击性。基于正则的防护较为简单,因此存在一些缺点。例如只能应用于单次请求,而且正则很难应用到一些复杂的协议上。
基于语法的分析相对正则来说更快而且更准确,这种分析会把载荷按照语法解析成的符号组,然后在符号组中寻找危险的关键字。这种方式对一些载荷的变式有较好的效果,但是同样的,对解析器要求较高。
基于行为的分析着眼的范围更广一些,例如攻击者的端口扫描行为、目录爆破、参数测试或者一些其他自动化或者攻击的模式都会被纳入考虑之中。
基于声誉的分析可以比较好的过滤掉一些可疑的来源,例如常用的VPN、匿名代理、Tor节点、僵尸网络节点的IP等。
基于机器学习的WAF涉及到的范围非常广,效果也因具体实现和场景而较为多样化。
除了按具体的方法分,也可以根据白名单和黑名单的使用来分类。基于白名单的WAF适用于稳定的Web应用,而基于黑名单则适合处理已知问题。
1.6.3. 扫描器防御
- 基于User-Agent识别
- 基于攻击载荷识别
- 验证码
1.6.4. WAF指纹
- 额外的Cookie
- 额外的Header
- 被拒绝请求时的返回内容
- 被拒绝请求时的返回响应码
- IP
1.6.5. 绕过方式
1.6.5.1. 基于架构的绕过
- 站点在WAF后,但是站点可直连
- 站点在云服务器中,对同网段服务器无WAF
1.6.5.2. 基于资源的绕过
- 使用消耗大的载荷,耗尽WAF的计算资源
1.6.5.3. 基于解析的绕过
- 字符集解析不同
- 协议覆盖不全
- 协议解析不正确
- 站点和WAF对https有部分不一致
- WAF解析与Web服务解析不一致
- 同一个参数多次出现,取的位置不一样
- HTTP Parameter Pollution (HPP)
- HTTP Parameter Fragmentation (HPF)
1.6.5.4. 基于规则的绕过
- 等价替换等价函数等价变量关键字拆分字符串操作
- 大小写变换 select => sEleCt
- 字符编码URL编码十六进制编码Unicode解析Base64 HTMLJSFuck其他编码格式
- 字符干扰注释
- 空字符NULL (x00)空格回车 (x0d)换行 (x0a)垂直制表 (x0b)水平制表 (x09)换页 (x0c)
- 特殊符号注释符引号(反引号、单引号、双引号)
- 利用服务本身特点
- 替换可疑关键字为空selselectect => select
- 少见特性未在规则列表中
2.1. 域名信息
2.1.1. Whois
Whois 可以查询域名是否被注册,以及注册域名的详细信息的数据库,其中可能会存在一些有用的信息,例如域名所有人、域名注册商、邮箱等。
2.1.2. 搜索引擎搜索
搜索引擎通常会记录域名信息,可以通过 site:agesec.com 的语法来查询。
2.1.3. 第三方查询
网络中有相当多的第三方应用提供了子域的查询功能,下面有一些例子,更多的网站可以在 8.1 工具列表 中查找。
- DNSDumpster
- Virustotal
- CrtSearch
- threatminer
- Censys
2.1.4. ASN信息关联
在网络中一个自治系统(Autonomous System, AS)是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。这个网络单位可以是一个简单的网络也可以是一个由一个或多个普通的网络管理员来控制的网络群体,它是一个单独的可管理的网络单元(例如一所大学,一个企业或者一个公司个体)。
一个自治系统有时也被称为是一个路由选择域(routing domain)。一个自治系统将会分配一个全局的唯一的16位号码,这个号码被称为自治系统号(ASN)。因此可以通过ASN号来查找可能相关的IP,例如:
whois -h whois.radb.net -- '-i origin AS111111' | grep -Eo "([0-9.]+){4}/[0-9]+" | uniq
nmap --script targets-asn --script-args targets-asn.asn=15169
2.1.5. 域名相关性
同一个企业/个人注册的多个域名通常具有一定的相关性,例如使用了同一个邮箱来注册、使用了同一个备案、同一个负责人来注册等,可以使用这种方式来查找关联的域名。一种操作步骤如下:
- 查询域名注册邮箱
- 通过域名查询备案号
- 通过备案号查询域名
- 反查注册邮箱
- 反查注册人
- 通过注册人查询到的域名在查询邮箱
- 通过上一步邮箱去查询域名
- 查询以上获取出的域名的子域名
2.1.6. 网站信息利用
网站中有相当多的信息,网站本身、各项安全策略、设置等都可能暴露出一些信息。
网站本身的交互通常不囿于单个域名,会和其他子域交互。对于这种情况,可以通过爬取网站,收集站点中的其他子域信息。这些信息通常出现在JavaScript文件、资源文件链接等位置。
网站的安全策略如跨域策略、CSP规则等通常也包含相关域名的信息。有时候多个域名为了方便会使用同一个SSL/TLS证书,因此有时可通过证书来获取相关域名信息。
2.1.7. 证书透明度
为了保证HTTPS证书不会被误发或伪造,CA会将证书记录到可公开验证、不可篡改且只能附加内容的日志中,任何感兴趣的相关方都可以查看由授权中心签发的所有证书。因此可以通过查询已授权证书的方式来获得相关域名。
2.1.8. 域传送漏洞
DNS域传送(zone transfer)指的是冗余备份服务器使用来自主服务器的数据刷新自己的域(zone)数据库。这是为了防止主服务器因意外不可用时影响到整个域名的解析。
一般来说,域传送操作应该只允许可信的备用DNS服务器发起,但是如果错误配置了授权,那么任意用户都可以获得整个DNS服务器的域名信息。这种错误授权被称作是DNS域传送漏洞。
2.1.9. Passive DNS
Passive DNS被动的从递归域名服务器记录来自不同域名服务器的响应,形成数据库。利用Passive DNS数据库可以知道域名曾绑定过哪些IP,IP曾关联到哪些域名,域名最早/最近出现的时间,为测试提供较大的帮助。Virustotal、passivetotal、CIRCL等网站都提供了Passive DNS数据库的查询。
2.1.10. SPF记录
SPF(Sender Policy Framework)是为了防止垃圾邮件而提出来的一种DNS记录类型,是一种TXT类型的记录,用于登记某个域名拥有的用来外发邮件的所有IP地址。通过SPF记录可以获取相关的IP信息。
2.1.11. CDN
2.1.11.1. CDN验证
可通过多地ping的方式确定目标是否使用了CDN,常用的网站有
http://ping.chinaz.com/https://asm.ca.com/en/ping.php 等。
2.1.11.2. 域名查找
使用了CDN的域名的父域或者子域名不一定使用了CDN,可以通过这种方式去查找对应的IP。
2.1.11.3. 历史记录查找
CDN可能是在网站上线一段时间后才上线的,可以通过查找域名解析记录的方式去查找真实IP。
2.1.12. 子域爆破
在内网等不易用到以上技巧的环境,或者想监测新域名上线时,可以通过批量尝试的方式,找到有效的域名。
本文转载自 安全时代