- 目录
- 1. 序章
- 2. 计算机网络与协议
- 3. 信息收集
- 4. 常见漏洞攻防
- 5. 语言与框架
- 6. 内网渗透
- 7. 云安全
- 8. 防御技术
- 9. 认证机制
- 10. 工具与资源
- 11. 手册速查
- 12. 其他
12.1. 代码审计
12.1. 代码审计
12.1.1. 简介
代码审计是找到应用缺陷的过程。其通常有白盒审计、黑盒审计、灰盒审计等方式。白盒审计指通过对源代码的分析找到应用缺陷,黑盒审计通常不涉及到源代码,多使用模糊测试的方式,而灰盒审计则是黑白结合的方式。三种不同的测试方法有不同的优缺点。
12.1.2. 常用概念
12.1.2.1. 输入
输入通常也称Source,Web应用的输入可以是请求的参数(GET、POST等)、上传的文件、Cookie、数据库数据等用户可控或者间接可控的地方。
例如PHP中的 $_GET
/ $_POST
/ $_REQUEST
/ $_COOKIE
/ $_FILES
/ $_SERVER
等,都可以作为应用的输入。
12.1.2.2. 处理函数
处理函数是对数据进行过滤或者编解码的函数,通常被称为Clean/Filter/Sanitizer。这些函数会对输入进行安全操作或过滤,为漏洞利用带来不确定性。
同样以PHP为例,这样的函数可能是 mysqli_real_escape_string
/ htmlspecialchars
/ base64_encode
/ str_rot13
等,也可能是应用自定义的过滤函数。
12.1.2.3. 危险函数
危险函数又常叫做Sink Call、漏洞点,是可能触发危险行为如文件操作、命令执行、数据库操作等行为的函数。
在PHP中,可能是 include
/ system
/ echo
等。
12.1.3. 自动化审计
一般认为一个漏洞的触发过程是从输入经过过滤到危险函数的过程(Source To Sink),而审计就是寻找这个链条的过程。常见的自动化审计方案有危险函数匹配、控制流分析等。
12.1.3.1. 危险函数匹配
白盒审计最常见的方式是通过搜寻危险函数与危险参数定位漏洞,比较有代表性的工具是Seay开发的审计工具。这种方法误报率相当高,这是因为这种方法没有对程序的流程进行深入分析,另一方面,这种方式通常是孤立地分析每一个文件,忽略了文件之间复杂的调用关系。
具体的说,这种方式在一些环境下能做到几乎无漏报,只要审计者有耐心,可以发现大部分的漏洞,但是在高度框架化的代码中,能找到的漏洞相对有限。
12.1.3.2. 控制流分析
在后来的系统中,考虑到一定程度引入AST作为分析的依据,在一定程度上减少了误报,但是仍存在很多缺陷。
而后,Dahse J等人设计了RIPS,该工具进行数据流与控制流分析,结合过程内与过程间的分析得到审计结果,相对危险函数匹配的方式来说误报率少了很多,但是同样的也增加了开销。
12.1.3.3. 基于图的分析
基于图的分析是对控制流分析的一个改进,其利用CFG的特性和图计算的算法,一定程度上简化了计算,比较有代表性的是微软的Semmle QL和NDSS 2017年发表的文章Efficient and Flexible Discovery of PHP Application Vulnerabilities。
12.1.3.4. 代码相似性比对
一些开发者会复制其他框架的代码,或者使用各种框架。如果事先有建立对应的漏洞图谱,则可使用相似性方法来找到漏洞。
12.1.3.5. 灰盒分析
基于控制流的分析开销较大,于是有人提出了基于运行时的分析方式,对代码进行Hook,当执行到危险函数时自动回溯输入,找到输入并判断是否可用。
这种方式解决了控制流分析实现复杂、计算路径开销大的问题,在判断过滤函数上也有一定的突破,但是灰盒的方式并不一定会触发所有的漏洞。fate0开发的prvd就是基于这种设计思路。
12.1.4. 手工审计流程
- 获取代码,确定版本,尝试初步分析
- 找历史漏洞信息
- 找应用该系统的实例
- 确定依赖库是否存在漏洞
- 基于审计工具进行初步分析
- 了解程序运行流程
- 文件加载方式
- 类库依赖
- 是否加载waf
- 数据库连接方式
- mysql/mysqli/pdo
- 是否开启预编译
- 视图渲染
- XSS
- 模版注入
- SESSION处理机制
- 文件
- 数据库
- 内存
- Cache处理机制
- 文件cache可能写shell
- 数据库cache可能注入
- memcache
- 账户体系
- Auth方式
- Pre-Auth的情况下可以访问的页面
- 普通用户的帐号
- 能否可获取普通用户权限
- 管理员账户默认密码
- 账号体系
- 加密方式
- 爆破密码
- 重置漏洞
- 修改密码漏洞
- 修改其他账号密码
- 根据漏洞类型查找Sink
- SQLi
- 全局过滤能否bypass
- 是否有直接执行SQL的地方
- SQL使用驱动,mysql/mysqli/pdo
- 如果使用PDO,搜索是否存在直接执行的部分
- XSS
- 全局bypass
- 视图渲染
- FILE
- 查找上传功能点
- 上传下载覆盖删除
- 包含
- LFI
- RFI
- 全局找include, require
- RCE
- XXE
- CSRF
- SSRF
- 反序列化
- 变量覆盖
- LDAP
- XPath
- Cookie伪造
- 过滤
- 找WAF过滤方式,判断是否可以绕过
12.1.5. 参考链接
- rips
- prvd
- PHP运行时漏洞检测
- Backes M , Rieck K , Skoruppa M , et al. Efficient and Flexible Discovery of PHP Application Vulnerabilities[C]// IEEE European Symposium on Security & Privacy. IEEE, 2017.
- Dahse J. RIPS-A static source code analyser for vulnerabilities in PHP scripts[J]. Retrieved: February, 2010, 28: 2012.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论