代码审计 ======================================== 简介 ---------------------------------------- 代码审计是找到应用缺陷的过程。其通常有白盒、黑盒、灰盒等方式。白盒指通过对源代码的分析找到应用缺陷,黑盒通常不涉及到源代码,多使用模糊测试的方式,而灰盒则是黑白结合的方式。 常用概念 ---------------------------------------- 输入 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 应用的输入,可以是请求的参数(GET、POST等)、上传的文件、网络、数据库等用户可控或者间接可控的地方。 处理函数 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 处理数据的函数,可能是过滤,也可能是编解码。 危险函数 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 又常叫做Sink Call、漏洞点,是可能触发危险行为如文件操作、命令执行、数据库操作等行为的函数。 自动化审计 ---------------------------------------- 一般认为一个漏洞的触发过程是从输入经过过滤到危险函数的过程,而审计就是寻找这个链条的过程。 危险函数匹配 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 白盒审计最常见的方式是通过搜寻危险函数与危险参数定位漏洞,比较有代表性的工具是Seay开发的审计工具。这种方法误报率相当高,这是因为这种方法没有对程序的流程进行深入分析,另一方面,这种方式通常是孤立地分析每一个文件,忽略了文件之间复杂的调用关系。 具体的说,这种方式在一些环境下能做到几乎无误报,只要审计者有耐心,可以发现大部分的漏洞,但是在高度框架化的代码中,能找到的漏洞相对有限。 控制流分析 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在后来的系统中,考虑到一定程度引入AST作为分析的依据,在一定程度上减少了误报,但是仍存在很多缺陷。 而后,Dahse J等人设计了RIPS,该工具进行数据流与控制流分析,结合过程内与过程间的分析得到审计结果,相对危险函数匹配的方式来说误报率少了很多,但是同样的也增加了开销。 灰盒分析 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 国内安全研究员fate0提出了基于运行时的分析方式,解决了控制流分析实现复杂、计算路径开销大的问题。 手工审计方式 ---------------------------------------- - 拿到代码,确定版本,确定能否正常运行 - 找历史漏洞 - 找应用该系统的实例 - 简单审计,运行审计工具看是否有漏洞 - 大概看懂整个程序是如何运行的 - 文件如何加载 - 类库依赖 - 有没有加载waf - 数据库如何连接 - mysql/mysqli/pdo - 有没有用预编译 - 视图如何形成 - 能不能xss - 能不能模版注入 - SESSION如何处理 - 文件 - 数据库 - 内存 - Cache如何处理 - 文件cache可能写shell - 数据库cache可能注入 - memcache - 看账户体系 - 管理员账户的密码 - 加密方式 - 泄漏数据后能不能爆破密码 - 重置漏洞 - 修改密码漏洞 - 修改其他人密码 - 普通用户的帐号 - 能否拿到普通用户权限 - 普通用户帐号能否盗号 - 重点找没有帐号的情况下可以访问的页面 - 是不是OAuth - 攻击 - SQLi - 看全局过滤能否bypass - 看是否有直接执行sql的地方 - 看是用的什么驱动,mysql/mysqli/pdo - 如果使用PDO,看是否是直接执行的地方 - XSS - 全局bypass - 直接echo - 看视图是怎么加载的 - FILE - 上传下载覆盖删除 - 包含 - LFI - RFI - 全局找include, require - 正常上传 - 看上传是如何确定能否上传文件的 - RCE - call_user_func - eval - assert - preg_replace /e - XXE - CSRF - SSRF - 反序列化 - 变量覆盖 - extract - parse_str - array_map - LDAP - XPath - Cookie伪造 - 过滤 - 找WAF - 看waf怎么过滤的,相应的如何绕过 参考链接 ---------------------------------------- - `rips `_ - `prvd `_ - `PHP运行时漏洞检测 `_