代码审计思路
代码审计概念
代码审计定义
代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。
代码审计对象
php,java,C/C++,C#,jsp,asp,net等等
代码审计工具
所谓“工欲善其事,必先利其器”,好的代码审计辅助工具可能让我的的代码审计事半功倍。
PHP
Seay
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
分析过程中与它特有的软件安全漏洞规则进行全面的匹配、搜索,在最终的漏洞结果中,包括详细的漏洞心理,以及漏洞相关的安全知识说明
JAVA
FindBugs IDEA
能发现规范和bug的,只能静态分析
Android Lint
它会给出所有在这个项目中不规范的编码、多余的资源、可能的bug、或者其它的一些问题,然后会给出修改的建议供我们参考。
C++
Flawfinder
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
通过追踪,直到后台代码,发现没有进行任何过滤,存在反射型XSS
3)寻找敏感功能点,通读功能点代码
通读功能点的代码,尤其关注于易出现漏洞的功能点
如:文件上传、留言板、登录认证功能、找回密码等通过从敏感功能点入手来查找安全问题。
文件上传功能
若后端程序没有严格地限制上传文件的格式,导致可以直接上传或者存在绕过的情况,除了文件上传漏洞。
还有可能发生sql注入漏洞。因为程序员一般不会注意到对文件名进行过滤,但有需要把文件名存入到数据库内。
文件管理功能
如果程序将文件名把或者文件路径直接在参数中传递,则很有可能存在任意文件操作的漏洞。
还有可能发生xss漏洞,。程序会在页面中国输出文件名,而通常会疏忽对文件名的过滤,导致可能在数据库中存入带有尖括号等特殊 符号的文件名,最后显示在页面上的时候就会被执行。
登录认证功能
登陆功能不是指一个登录过程,而是整个操作过程中的认证。
目前的认证方式大多是基于Cookie和Session。
如果Cookie信息没有加salt一类的东西,就有可能导致任意用户登录漏洞,只要知道用户的部分信息,即可生成认证令牌
找回密码功能
找回密码虽然无法危害到服务器安全,但是可以重置管理员密码,也可以间接控制业务权限甚至拿到服务器权限。
4)直接通读全文代码
通读全文代码并不是逐个读完文件就可以了,而是要有逻辑性、有目的性地选择文件进行审计。
逻辑性
通读全文代码首先要有一定的“开发者思维”,将自己想象为此软件的开发者,如果是我来设计这款软件我要实现什么功能,利用什函数结构,调用哪些接口,根据软件的功能性来分析每一个文件的作用,可以尝试画一个树状图来辅助自己理解软件的设计逻辑。
目的性
特别关注几类重要文件。
函数集文件
常见命名:fuctions、common
这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到其他文件。
寻找这些文件一个比较好用的技巧是打开index.php或者一些功能性文件,在头部一般都能找到
配置文件
常见命名:coming
配置文件包括web程序运行必须的功能性配置选项以及数据库等配置信息。从这个文件可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数值是用单引号还是用双引号括起来,如果用双引号,则很可能会存在代码执行漏洞。
安全过滤文件
常见命名:filter、safe、check
这类文件主要是对参数进行过滤,比较常见的是针对SQL注入和XSS过滤,还有文件路径、执行的系统命令的参数,其他则相对少见
index文件
常见命名:index
index是一个程序的入口文件,所以通常我们只要读一遍index文件就可以大致了解整个程序的架构、运行的流程、包含到的文件,其中核心的文件又有哪些。