[ 代码审计篇 ] 代码审计思路 详解

源代码审计是网络安全技术工作的重要内容,是安全岗位必备技能。

渗透测试岗几乎都会问道代码审计,这篇文章就来聊一聊代码审计的思路。

这篇文章就来聊一聊什么是代码审计,什么是静态测试 ?

重点部分:代码审计工具介绍,代码审计的思路介绍。

不要觉得代码审计很容易,也不要觉得代码审计很难,重在坚持,重在分析。

文中出现的细节在后续中都会有详细解读!!!

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

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

3. 寻找敏感功能点,通读功能点代码  -->

4. 直接通读全文代码


目录

一、代码审计和静态测试介绍

1. 什么是代码审计 (代码审计)

2. 什么是静态测试(静态测试)

3. 静态测试和代码审计的关系

二、代码审计对象和内容介绍

1. 代码审计对象:

2. 代码审计内容包括

三、代码审计要熟悉的技术

1. 编程语言  

2. 渗透技巧  

1. 为什么要懂渗透技巧

1. 工具渗透:

2.  手工渗透

3. 辅助技术

1. 熟悉常见协议

2. 程序搭建

3. URL链接构造或者URL路由  

4. 了解SQL语句及数据库特性

5. 了解中间件及服务器特性

6. 审计辅助工具

3. 漏洞挖掘

1. 必备知识:

2. 技能提高过程

三、代码审计工具

2. PHP

1. Seay

2. RIPS

3. Fortify SCA

2. JAVA

1. FindBugs IDEA

2. Android Lint

3. C++

1.  Flawfinder

4. JS

5. Go

6. Python

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

8. 商业代码审计工具

1. 静态分析工具

2. 动态分析工具

四、代码审计思路:1. 根据敏感关键字回溯参数传递过程

1. PHP代码审计敏感函数

1. 预定义的变量[常规外部提交的变量]

2. regist_globle=on(未初始化的变量)

3. 变量覆盖(未被初始化的覆盖的前定义的变量)

4. 变量的传递存储(中转的变量)

5. 文件包含漏洞(包含任意文件)

6. 代码执行(执行任意代码)

7. 命令执行(执行任意命令漏洞)

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

1. SQL注入漏洞

2. XSS漏洞关键字

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

1. 命令执行函数

2. 文件上传函数

3. SSRF函数

4. CORS跨域漏洞CORS跨域设置

5. Jsonp劫持

6. 反序列化

7. XSS漏洞

8. session失效时间问题

9. 用户退出,session未销毁问题

五、代码审计思路:2. 查找可控变量,正向追踪变量传递过程

六、代码审计思路:3. 寻找敏感功能点,通读功能点代码

1. 文件上传功能

2. 文件管理功能

3. 登录认证功能

3. 找回密码功能

七、代码审计思路:4. 直接通读全文代码

1. 逻辑性

2. 目的性

1. 函数集文件

2. 配置文件

3. 安全过滤文件

4. index文件

八、专栏分享


一、代码审计和静态测试介绍

1. 什么是代码审计 (代码审计

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

说白了:代码审计检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。

2. 什么是静态测试(静态测试

静态测试是指不运行被测程序本身,仅通过分析或检查源程序的文法、结构、过程、接口等来检查程序的正确性,找出程序中存在的风险,例如不匹配的参数、不适当的循环嵌套和分支嵌套、不允许的递归、未使用过的变量、空指针的引用和可疑的计算等。静态测试结果可用于进一步的查错,并为测试用例选取提供指导。

3. 静态测试和代码审计的关系

静态测试包括代码检查、静态结构分析、代码质量度量等。静态测试主要由人工进行,充分发挥人的逻辑思维优势,同时借助软件工具自动进行。其中代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性、代码对标准的遵循、可读性,代码的逻辑表达的正确性、代码结构的合理性等方面。

二、代码审计对象和内容介绍

1. 代码审计对象:

代码审计对象包括并不限于对Windows和Linux系统环境下的以下语言进行审核:

php,java,JavaScript、C/C++,C#,jsp,asp,net。

2. 代码审计内容包括

1. 前后台分离的运行架构

2. WEB服务的目录权限分类

3. 认证会话与应用平台的结合

4. 数据库的配置规范

5. SQL语句的编写规范

6. WEB服务的权限配置

7. 对抗爬虫引擎的处理措施

三、代码审计要熟悉的技术

1. 编程语言  

1. 前端语言 html/javascript/dom 元素使用主要是为了挖掘xss漏洞 jquery 主要写一些涉及到CSRF脚本使用的或者DOM型XSS,JSON劫持等。

2. 后端语言也要熟悉,基础语法要知道。例如:

变量类型,常量,数组(python 是列表,元组,字典),对象,类的调用,引用等, MVC设计模式要清楚,因为大部分目标程序都是基于MVC写的,包括不限于php,python,java。

3. 不用会写,但是一定能看懂,而且要看懂逻辑,知道哪些功能点会用什么方式去写,可能会出现什么类型漏洞,方便挖掘常规类型漏洞,更方便挖掘逻辑漏洞。

2. 渗透技巧  

1. 为什么要懂渗透技巧

1. 在于你找到漏洞的时候,通常的开发功底是不足以构造 payload 的,需要一些特殊的 payload 构造方式。

2. 你在找漏洞时,可以辅助你更快的去挖掘漏洞。

1. 工具渗透:

例如 sqlmap,awvs,burpsuite 等,能用工具挖掘到,就没必要人工审计了,你要做的只是辅助调试。

2.  手工渗透

手工渗透的情况下,如果有源代码,那我们就可以去配合一些代码审计,以便于漏洞的挖掘。

3. 辅助技术

1. 熟悉常见协议

例如:HTTP,HTTPS,TCP,dict://,file://等等

懂得 Header 头如何伪造,比如:

XFF注入时的x-forward-for,cookie注入,CRLF身份请求伪造等。

2. 程序搭建

代码审计的时候要学会程序搭建,不然静态审计时,无法进行动态调试。

方便你更快更高效挖掘漏洞。

3. URL链接构造或者URL路由  

后续详解

4. 了解SQL语句及数据库特性

这个主要涉及到SQL注入及sql注入的payload构造绕过。

5. 了解中间件及服务器特性

有的代码漏洞 是基于中间件及服务器特性造成的。例如:

IIS6.0的解析漏洞,nginx的解析漏洞等。

6. 审计辅助工具

(后面有详解)

1. IDE,phpstrom 审计工具追踪代码时用到,可与xdebug绑定使用方便调试。

2. 源代码审计工具 rips,seay审计工具,辅助你更快的找到漏洞产生点。

3. 漏洞挖掘

1. 必备知识:

1. 懂得漏洞类型产生原理

2. 懂得危险函数的参数不当使用可造成的漏洞威胁。例如:

        涉及到命令执行代码执行的eval,assert,array_map,usort等

         本身函数的脆弱性,is_numeric,md5等。

3. 晓得php函数的脆弱性。例如:

==与===

===并不是强大无比不可绕过的,也要结合代码设计逻辑。
4. php的淫技技巧。

5. php版本及配置不当结合函数不当利用造成的漏洞威胁。

......

2. 技能提高过程

1. demo案例练习  -->

2. 已出漏洞代码审计案例分析  -->

3. 小型cms单一漏洞实例练习  -->

4. 小型cms漏洞多种类型漏洞实例挖掘练习  -->

5. 框架漏洞挖掘实例练习  -->

6. 技巧挖掘

三、代码审计工具

想做好代码审计,好的代码审计辅助工具是必不可少的,可让代码审计事半功倍。

下面介绍一些代码审计辅助工具。(后续详细介绍工具的使用)

2. PHP

1. Seay

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

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

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

4. 自定义插件及规则

2. RIPS

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

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

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

4. 对变量高亮显示。

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

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

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

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

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

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

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

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

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

14. 正则搜索功能。

3. Fortify SCA

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

2. JAVA

1. FindBugs IDEA

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

2. Android Lint

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

3. C++

1. Flawfinder

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

4. JS

eslint、NodeJsScan

5. Go

goint、go tool vet、gas

6. Python

pylint、bandit、py-find-injection、pyt

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

sonar

8. 商业代码审计工具

1. 静态分析工具

RISP,VCG,Fortify SCA

2. 动态分析工具

​360的sky wolf,鸟哥的taint

四、代码审计思路:1. 根据敏感关键字回溯参数传递过程

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

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

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

1. PHP代码审计敏感函数

1. 预定义的变量[常规外部提交的变量]

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

2. regist_globle=on(未初始化的变量)

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

3. 变量覆盖(未被初始化的覆盖的前定义的变量)

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

4. 变量的传递存储(中转的变量)

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

5. 文件包含漏洞(包含任意文件)

require,include,require_once,include_once

6. 代码执行(执行任意代码)

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

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

preg_replace()(preg_replace(/“xxxx”/e)) 执行正则表达式,实现搜索和替换功能。

/e修正符使preg_replace()将其中的replacement参数当作PHP代码

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

7. 命令执行(执行任意命令漏洞)

exec() 执行一个外部程序

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

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

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

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

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

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

1. SQL注入漏洞

1. 出现位置

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

2. 普通注入​关键字

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

3. 宽字节注入出现位置

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

4. 宽字节注入关键字

SET NAMES、character_set_client=gbk、mysql_set_charset('gbk’)

5. 二次urldecode注入关键字

urldecode、rawurldecode

2. XSS漏洞关键字

print、print_r、echo、printf、sprintf、die、var_dump、var_export等。

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

1. 命令执行函数

GroovyShell.evaluate()、Runtime.getRuntime()、.exec()、ProcessBuilder()、.start()等。

2. 文件上传函数

ServletFileUpload()、FileItemStream()、MultipartFile()等。

3. 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()

4. CORS跨域漏洞CORS跨域设置

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

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

5. Jsonp劫持

jsonp跨域设置

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

callback

6. 反序列化

readObject

7. XSS漏洞

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

Requests

Response

Session

8. session失效时间问题

session.setMaxInactiveInterval();

9. 用户退出,session未销毁问题

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

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

sessionapplication

pageContent

五、代码审计思路:2. 查找可控变量,正向追踪变量传递过程

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

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

六、代码审计思路:3. 寻找敏感功能点,通读功能点代码

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

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

1. 文件上传功能

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

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

2. 文件管理功能

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

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

3. 登录认证功能

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

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

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

3. 找回密码功能

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

七、代码审计思路:4. 直接通读全文代码

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

1. 逻辑性

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

2. 目的性

特别关注函数集文件、配置文件、安全过滤文件、index文件等重要文件。

1. 函数集文件

常见命名:fuctions、common

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

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

2. 配置文件

常见命名:coming

配置文件包括web程序运行必须的功能性配置选项以及数据库等配置信息。

从这个文件可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数值是用单引号还是用双引号括起来,如果用双引号,则很可能会存在代码执行漏洞。

3. 安全过滤文件

常见命名:filter、safe、check

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

4. index文件

常见命名:index

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

八、专栏分享

每个专栏都在持续更新中~~~

渗透测试自学篇

网络基础

web基础知识点

操作系统篇

python爬虫

闲聊

面试总结

python

通讯安全

靶场

系列文章:[ 渗透入门篇 ] 渗透行业必备术语大集合(一)

                  [ linux ] 文件系统和目录结构详解

                  [ 网络协议篇 ] 一篇文章让你掌握神秘的 DHCP(一)

                  [ 应急响应 ]服务器(电脑)受到攻击该如何处理?(一)

本文到这里就结束了,相信你对 代码审计 有了更深的理解。

下篇文章开始就会具体分享代码审计的细节部分。

我们下篇文章见 !^.^ 

  • 52
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
classcms是一款常见的内容管理系统,其代码审计是对其源代码进行逐行检查和分析的过程。通过代码审计,我们可以评估classcms的安全性和漏洞风险,并提供相应的修复建议。 首先,代码审计可以检查classcms的输入验证和过滤机制是否健全。这包括用户输入的数据是否被适当地过滤和转义,以防止SQL注入、跨站脚本攻击等常见的漏洞。 其次,代码审计可以查看classcms是否存在任何明显的安全漏洞。例如,是否有未经验证的文件上传功能,是否在用户身份验证过程中使用了弱密码加密算法,是否以明文存储敏感信息等。如果发现这些问题,就需要及时修复以提升系统的安全性。 此外,代码审计还可以识别潜在的业务逻辑漏洞。例如,classcms是否存在会话固定、越权访问等安全问题,是否正确实现了用户权限控制,以及用户身份验证是否完整和准确。这些问题的存在可能会导致未授权的用户访问敏感数据或执行特权操作。 最后,代码审计还可以检查classcms是否使用最新的安全修复程序。定期更新classcms以及相关的第三方库和插件是保持系统安全的重要措施之一。通过代码审计,可以排查是否有遗漏的安全补丁,以保障classcms处于一个相对安全的状态。 总之,通过代码审计,我们可以全面了解classcms的安全性,并提供相关的修复建议,以帮助系统管理者和开发者提升classcms的安全性水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_PowerShell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值