代码审计思路详解

代码审计概念

代码审计定义

代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。

代码审计对象

php,java,C/C++,C#,jsp,asp,net等等

代码审计工具

所谓“工欲善其事,必先利其器”,好的代码审计辅助工具可能让我的的代码审计事半功倍。

PHP

Seay

代码审计思路详解_第1张图片

  1. 一键自动化白盒审计,当发现可以漏洞后,会在下方列表框显示漏洞信息。

  2. 代码调试,方便审计过程中测试代码。

  3. 正则编码,支持MD5、UR1、Base64、Hex、ASCII、Unicode等多种编码解码转换功能。

  4. 自定义插件及规则

RIPS

在这里插入图片描述

  1. 能够检测XSS、SQL注入、文件泄露、本地/远程文件包含、远程命令执行以及更多种类型的漏洞。

  2. 有5种级别选项用于显示以及辅助调试扫描结果。

  3. 标记存在漏洞的代码行。

  4. 对变量高亮显示。

  5. 在用户定义函数上悬停光标可以显示函数调用。

  6. 在函数定义和调用之间灵活跳转。

  7. 详细列出所有用户定义函数(包括定义和调用)、所有程序入口点(用户输入)和所有扫描过文件(包括include的文件)。

  8. 以可视化的图表展示源代码文件、包含文件、函数及其调用。

  9. 仅用几个鼠标点击就可以使用CURL创建针对检测到漏洞的EXP实例。

  10. 详细列出每个漏洞的描述、举例、PoC、补丁和安全函数。

  11. 7种不同的语法高亮显示模式。

  12. 使用自顶向下或者自底向上的方式追溯显示扫描结果。

  13. 一个支持PHP的本地服务器和浏览器即可满足使用需求。

  14. 正则搜索功能。

Fortify SCA

代码审计思路详解_第2张图片

分析过程中与它特有的软件安全漏洞规则进行全面的匹配、搜索,在最终的漏洞结果中,包括详细的漏洞心理,以及漏洞相关的安全知识说明

JAVA

FindBugs IDEA

代码审计思路详解_第3张图片

能发现规范和bug的,只能静态分析

Android Lint

代码审计思路详解_第4张图片

它会给出所有在这个项目中不规范的编码、多余的资源、可能的bug、或者其它的一些问题,然后会给出修改的建议供我们参考。

C++

Flawfinder

代码审计思路详解_第5张图片

Flawfinder是一个C/C代码的开源安全审查工具,采用内建语法缺陷数据库,能够标记类似缓冲溢出、格式字符串、竞争条件、随机数获取方面的问题。Flawfinder是一个非常简单的工具,采用的算法也不复杂,可以看做是一个基于词典的源代码静态分析器。

其他语言

JS

eslint、NodeJsScan

Go

goint、go tool vet、gas

Python

pylint、bandit、py-find-injection、pyt

多种语言的安全代码检查工具

sonar

商业代码审计工具

静态分析工具

​ RISP,VCG,Fortify SCA

动态分析工具

​ 360的sky wolf,鸟哥的taint

代码审计思路

1)根据敏感关键字回溯参数传递过程

根据敏感函数来你想追踪参数的传递过程,是目前使用的最多的一种方式,因为大多数漏洞是由于函数的使用不当造成的。

优点:只需要搜索相应的敏感关键字,即可快速地挖掘想要的漏洞,可定向挖掘、高效、高质量。

缺点:由于没有通读代码,对程序的整体,对程序的整体框架了解不够深入,在挖掘漏洞时定位需要花费一定时间、无法挖掘逻辑漏洞

PHP代码审计----敏感函数

一,预定义的变量[常规外部提交的变量]

除$_GET $_POST $_COOKIE的提交外,还来源于 $_SERVER $_ENV $_SESSION等

二,regist_globle=on(未初始化的变量)

当on的时候,传递的值会被直接注册为全局变量直接使用。而off时,我们需要到特定的数组 得到他,php>4.2.0 default 关闭。

三,变量覆盖(未被初始化的覆盖的前定义的变量)

如 $$ 使用不当,遍历初始化变量,extract() ,parse_str() 等

四,变量的传递存储(中转的变量)

存储于数据库,文件,(如配置,缓存文件等)

1,文件包含漏洞(包含任意文件)

require,include,require_once,include_once

2,代码执行(执行任意代码)

eval() 字符串当作代码来执行

assert() 调试函数,检查第一个断言是否为FALSE。(把传入的字符串作为php代码执行)

preg_replace()(preg_replace(/“xxxx”/e)) 执行正则表达式,实现搜索和替换功能。/e修正符使preg_replace()将其中的replacement参数当作PHP代码

create_function() 创建一个匿名函数,并返回都独一无二的函数名。

3,命令执行(执行任意命令漏洞)

exec() 执行一个外部程序

passthru() 执行外部程序并显示原始输出

proc_open() 执行一个命令,并且打开用来输入/输出的文件指针

shell_exec() 通过shell环境执行命令,并且将完整的输出以字符串的方式返回

system() 执行外部程序,并且显示输出

popen() 通过popen()的参数传递一条命令,并且对popen()所打开的文件进行执行

4.漏洞挖掘时SQL注入漏洞和XSS漏洞需注意的关键字
SQL注入漏洞

出现位置

登录界面、获取HTTP开头(user-agent/client-ip)、订单处理等

普通注入

关键字

​ select from
​ mysql_connect
​ mysql_query
​ mysql_fetch_row
​ update
​ insert
​ delete

宽字节注入

出现位置

文章发表、评论回复、留言、资料设置等

关键字

SET NAMES
character_set_client=gbk
mysql_set_charset('gbk’)

二次urldecode注入

关键字

urldecode
rawurldecode

XSS漏洞

关键字

print
print_r
echo
printf
sprintf
die
var_dump
var_export

Java代码审计----敏感函数

命令执行函数

GroovyShell.evaluate()

Runtime.getRuntime()

.exec()

ProcessBuilder()

.start()

文件上传函数

ServletFileUpload()

FileItemStream()

MultipartFile()

SSRF函数

在Java中分为两类:

一类只支持http,https协议,如HttpURLConnection、HttpClient、Request、okhttp;一类支持所有协议如URLConnection、URL。

HttpURLConnection.getInputStream()

URLConnection.getInputStream()

Request.Get.execute()

Request.Post.execute()

URL.openStream()

ImageIO.read()

OkHttpClient.newCall.execute()

HttpClents.execute()

HttpClent.execute()

CORS跨域漏洞CORS跨域设置

response.setHeader(“Access-Control-Allow-Origin”,“*”);

response.setHeader(“Access-Control-Allow-Credentials”,“true”);

或者

@CrossOrigin(“*”)

Jsonp劫持

jsonp跨域设置

response.setHeader(“Access-Control-Allow-Origin”,“*”);

callback

反序列化

readObject

杂项

out

XSS漏洞

当out.print(“”);可控的时候,就会导致XSS漏洞。Requests

Response

Session

session失效时间问题

session.setMaxInactiveInterval();

用户退出,session未销毁问题

session.invalidate(); //销毁所有的Web应用

sessionsession.removeAttribute(); //移除指定的Web应用

sessionapplication

pageContent

2)查找可控变量,正向追踪变量传递过程

查找可控变量,正向追踪变量传递的过程,查找可能存在安全漏洞的变量,从变量处发现安全问题

常见的可操控变量:name、id、password、pwd、select、search等

例如miniCMS中的search处,我们可以看到变量名为search_term

代码审计思路详解_第6张图片

通过追踪,直到后台代码,发现没有进行任何过滤,存在反射型XSS

代码审计思路详解_第7张图片

3)寻找敏感功能点,通读功能点代码

通读功能点的代码,尤其关注于易出现漏洞的功能点

如:文件上传、留言板、登录认证功能、找回密码等通过从敏感功能点入手来查找安全问题。

文件上传功能

​ 若后端程序没有严格地限制上传文件的格式,导致可以直接上传或者存在绕过的情况,除了文件上传漏洞。

​ 还有可能发生sql注入漏洞。因为程序员一般不会注意到对文件名进行过滤,但有需要把文件名存入到数据库内。

文件管理功能

​ 如果程序将文件名把或者文件路径直接在参数中传递,则很有可能存在任意文件操作的漏洞。

​ 还有可能发生xss漏洞,。程序会在页面中国输出文件名,而通常会疏忽对文件名的过滤,导致可能在数据库中存入带有尖括号等特殊 符号的文件名,最后显示在页面上的时候就会被执行。

登录认证功能

​ 登陆功能不是指一个登录过程,而是整个操作过程中的认证。

​ 目前的认证方式大多是基于Cookie和Session。

​ 如果Cookie信息没有加salt一类的东西,就有可能导致任意用户登录漏洞,只要知道用户的部分信息,即可生成认证令牌

找回密码功能

​ 找回密码虽然无法危害到服务器安全,但是可以重置管理员密码,也可以间接控制业务权限甚至拿到服务器权限。

4)直接通读全文代码

通读全文代码并不是逐个读完文件就可以了,而是要有逻辑性、有目的性地选择文件进行审计。

逻辑性

​ 通读全文代码首先要有一定的“开发者思维”,将自己想象为此软件的开发者,如果是我来设计这款软件我要实现什么功能,利用什函数结构,调用哪些接口,根据软件的功能性来分析每一个文件的作用,可以尝试画一个树状图来辅助自己理解软件的设计逻辑。

目的性

​ 特别关注几类重要文件。

函数集文件

常见命名:fuctions、common

​ 这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到其他文件。

​ 寻找这些文件一个比较好用的技巧是打开index.php或者一些功能性文件,在头部一般都能找到

配置文件

常见命名:coming

​ 配置文件包括web程序运行必须的功能性配置选项以及数据库等配置信息。从这个文件可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数值是用单引号还是用双引号括起来,如果用双引号,则很可能会存在代码执行漏洞。

安全过滤文件

常见命名:filter、safe、check

​ 这类文件主要是对参数进行过滤,比较常见的是针对SQL注入和XSS过滤,还有文件路径、执行的系统命令的参数,其他则相对少见

index文件

常见命名:index

index是一个程序的入口文件,所以通常我们只要读一遍index文件就可以大致了解整个程序的架构、运行的流程、包含到的文件,其中核心的文件又有哪些。

参考文献《代码审计》尹毅 著

你可能感兴趣的:(java,php)