代码审计思路
文章目录
审计方式
以下描述均基于人工审计(Java代码审计)
- 底层逆向跟踪:从底层根据敏感函数、敏感关键字回溯到最外层的参数入口,如果整个调用链没有防护,则存在漏洞。
- 入口正向跟踪:从参数入口分析参数的传递过程,通过层层调用链,分析是否存在漏洞。
- 特定功能追踪:基于方法2,但是从特定功能入手;当项目庞大,且方法1找不到漏洞时,建议采用此种方式,往往可以找到系统中的逻辑漏洞。
- 通读代码:建议审计项目前,先大概通读一下项目代码,了解整个项目的组织结构,运作模式,有利于审计中进行参数的追踪。
下面给将详细记录一下比较常用的方式。
底层逆向追踪
一个项目,往往是将一些功能函数封装在底层,甚至是直接打包成jar包供外层调用。所以我们可以直接搜索底层的敏感函数或者敏感关键字,进行逆向的回溯追踪。例如要查SSRF,我们可以搜索关键字: new URL( 等。一下是一些常见漏洞关键字速查表,需要具体分析到底是否含有漏洞:
SSRF
以下关键字中包括 Http 的,均只支持HTTP协议,只能用作内网ip和端口探测 。
| 关键字 | 是否支持全协议 |
|---|---|
| HttpClient | 否 |
| Request(对HttpClient封装后的类) | 否 |
| HttpURLConnection | 否 |
| okhttp | 否 |
| URLConnection | 是 |
| URL | 是 |
| ImageIO | 是 |
| get( | 看具体实现 |
| post( | 看具体实现 |
XXE
XXE目前(2021/1/16 14:42:36 )还是比较常见的,危害主要是可以读取系统文件。
| 关键字 | 默认配置是否触发 |
|---|---|
| DocumentBuilderFactory | 是 |
| SAXBuilder | 是 |
| SAXParserFactory | 是 |
| SAXReader | 是 |
| SAXTransformerFactory | 是 |
| SchemaFactory | 是 |
| TransformerFactory | 是 |
| ValidatorSample | 是 |
| XMLReader | 是 |
| XMLDecoder | 是 |
| xml | 否,得看具体实现 |
| Poi | 否,得看具体版本 |
| dom4j | 否,得看具体版本 |
SQLI
现代社会SQLI已经很少了,非框架下,基本SQLI都出现在 order by 位置和 like 位置等。
| 关键字 | 是否在框架下 |
|---|---|
| $ | 是,mybatis框架下 |
| append( | 否 |
| order by | 否 |
| like | 否 |
| limit | 否 |
| in( | 否 |
| select | 否 |
| sql或hql | 否 |
| ‘"+ | 否 |
文件上传
文件上传也比较常见,得具体分析是否采用白名单、或者黑名单是否严谨。此外,利用解压进行文件上传也十分常见。
| 关键字 | 是否在框架下 |
|---|---|
| MultipartFile | 是,springMVC下 |
| ZipEntry | 否 |
| FileUtil或者FileUtils | 否 |
| .write | 否 |
| upload | 否 |
| ServletFileUpload | 是,apache-fileupload框架 |
| SmartUpload | 是,SmartUpload框架 |
文件下载
任意文件下载主要是没有路径穿越防护,也比较常见。
| 关键字 | 是否在框架下 |
|---|---|
| .write | 否 |
| .read | 否 |
| download | 否 |
| content-disposition | 否 |
开放重定向
属于中低危漏洞,但是也挺常见的。可以用来钓鱼啥的。
| 关键字 | 是否在框架下 |
|---|---|
| sendRedirect | 否 |
| redirect: | 是,SpringMVC框架 |
| RedirectView | 是,SpringMVC框架 |
命令注入
比较少见,因为关键字比较少,所以很好查。
| 关键字 | 是否在框架下 |
|---|---|
| getRuntime | 否 |
| ProcessBuilder | 否 |
| GroovyShell | 否 |
| exec | 否,看具体实现 |
反序列化
除了类似fastjson、jackson和shiro等常见第三方组件,外,查找原生程序可能存在的反序列化关键字如下:
| 关键字 | 是否在框架下 |
|---|---|
| .readObject( | 否 |
| .readUnshared | 否 |
| Yaml.load | 是,snakeyaml框架 |
| XStream.fromXML | 是,XStream框架 |
全局过滤器/拦截器
主要是为了审计项目中使用的过滤器/拦截器是否存在安全隐患,比如是否存在被绕过的风险,查找过滤器的关键字如下:
| 关键字 | 是否在框架下 |
|---|---|
| Filter | 否 |
| @WebFilter | 否 |
| Interceptor | 是,依赖于框架 |
特定功能追踪
当常见功能找不到时,可以试试找找如下功能或服务,可能有惊喜:
- WebDav
- Graphql
- WebService
文章作者 P1n93r
上次更新 2021-01-16