当前位置: 首页 > news >正文

生命在于学习——代码审计基础

在这里插入图片描述
图片来源于安全客。
注意:本篇文章仅用于自我学习与交流,不会过多或不涉及具体操作,不得用于其他用途。

一、代码审计简介

顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。——来自百度百科
代码审计就是从安全角度对代码进行的安全测试评估,结合丰富的安全知识、编程经验、测试技术、利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷,在代码形成软件产品前将业务软件的安全风险降到最低。
实际上感觉就是真正的给你一个网站源码,从网站去找漏洞,而不是按照漏洞去找网站。

二、代码审计测试方法

代码审计采用人工审计和静态分析工具辅助的方式进行。
人工审计:既能解决内部问题也能解决外部问题,这也是目前最有效率的解决方案,并且在理论上手工代码审计是非常有效的,但人工审计的效率不高,所以我们会采用自动化分析工具辅助人工的方式来提高审计的效率。
静态分析工具(也可以叫代码审计工具):通过一组全面规则,测试机制(里面是已经编写好的程序)和方针在软件开发过程、测试中发现软件的安全缺陷。
人工审计和工具最好是结合使用。

三、代码审计的通用思路

1、逆向追踪

逆向追踪,或叫回溯变量,一般是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。
优点:只需要搜索相应敏感关键字,即可以快速的挖掘想要的漏洞,具有可定向挖掘和高效优点。
缺点:由于没有通读代码,对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。

2、正向追踪

正向追踪,或叫跟踪变量
先找出那些文件在接收外部传入的参数,然后跟踪变量的传递过程,观察是否有变量传入到高危函数里面,或者传递的过程中是否有代码逻辑漏洞,这是一种正向追踪的方式。
优点:挖掘方式比逆向挖掘更全。
缺点:可能没有逆向追踪快

3、直接挖掘功能点

根据自身的经验判断该类应用通常在哪些功能中会出现漏洞,直接阅读该部分功能代码。
优点:比较快速,准确
缺点:需要一定的经验,且可能会因为经验遗漏一点漏洞

4、通读全文

一般MVC设计的网站 , 或者一些框架 适合这种审计方法 , 可能还需要结合一下断点调试技术
index 文件, index是一个程序的入口文件, 所以通常我们只要读一读index文件就可以大致了解整个程序的架构, 运行的流程, 包含的文件, 建议最好先将几个核心目录的index文件都简单读一遍
函数集文件, 一般在index文件中都会包含函数集文件, 通常命名为functions, common等关键字, 这些文件里面都是一些公共的函数, 提供给其他文件统一调用。
配置文件, 通常命名中包括 config 关键字,里面包含一些功能性配置选项以及数据库配置信息, 还可以注意下参数值是用单引号还是双引号, 如果是双引号, 则很可能会存在代码执行漏洞; 还需要关注以下数据库编码。
安全过滤文件, 文件过滤文件对我们做代码审计至关重要, 关系到我们挖掘到的可疑点能不能利用, 通常命名中有 filter, safe, check 等关键字, 这类文件主要是对参数进行过滤。
优点:可以更好的了解程序的架构以及业务逻辑,能够挖掘到更多,更高质量的逻辑漏洞。
缺点:花费的时间比较多,如果程序比较大,读起来会比较累。
个人更喜欢通读一下,但前提是对基础代码运行和架构框架有一定的的基础。

四、漏洞产生的原因

1、配置不当,很多中间件框架都会有自己的配置文件,当配置文件中的某些设置配置不当时,很容易产生漏洞。
2、变量控制不严格 ,对前端传入的数据没有严格的过滤和限制。
3、变量到达有利用价值的函数,用户可以接触到这些变量并会被带入执行。

五、漏洞关键字

这就很多了。
SQL:简单的增删改查关键词。
文件上传漏洞:$_FILES 、move_uploaded_file
命令执行漏洞关键字: shell_exec、exec、passthru , system 、popen
包含漏洞关键字: include、include_once、require、require_once
xss漏洞关键字: echo、print、print_r、var_dump、var_export
ssrf漏洞关键字: curl_exec 、file_get_contents、fsockopen
代码执行:主要由 eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()、array_map()等函数的参数过滤不严格导致
命令执行:shell_exec、exec、passthru , system 、popen

相关文章:

  • 【第十四篇】- Maven 自动化构建
  • c++中如何利用VA_LIST 和单体模式,构建自己的log小系统
  • 【Django】开发日报_4_Day:手机号码管理系统(1)
  • Oracle中含替换变量的查询(二)
  • 论文解读:Sadeepcry:使用自我注意和自动编码器网络的蛋白质结晶倾向预测的深度学习框架
  • Android Framework 框架层 | AMS 定义与知识点梳理
  • 工业场景全流程!机器学习开发并部署服务到云端
  • 真无线耳机哪个好?真无线耳机性价比排行榜
  • IDL学习:语法基础-程序控制
  • 市场调研团体怎么使用无人系统生产更安全
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • 百度校园招聘历年经典面试题汇总:测试开发
  • 支撑Java NIO 与 NodeJS的底层技术
  • vue2+element 通用表格组件封装
  • Symbol Table
  • [nginx文档翻译系列] 控制nginx
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 3.7、@ResponseBody 和 @RestController
  • css系列之关于字体的事
  • golang 发送GET和POST示例
  • JavaScript类型识别
  • Java编程基础24——递归练习
  • Linux CTF 逆向入门
  • MySQL-事务管理(基础)
  • Python socket服务器端、客户端传送信息
  • Redash本地开发环境搭建
  • redis学习笔记(三):列表、集合、有序集合
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • text-decoration与color属性
  • ViewService——一种保证客户端与服务端同步的方法
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 程序员最讨厌的9句话,你可有补充?
  • 强力优化Rancher k8s中国区的使用体验
  • 如何优雅地使用 Sublime Text
  • 通过git安装npm私有模块
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 赢得Docker挑战最佳实践
  • 智能网联汽车信息安全
  • 终端用户监控:真实用户监控还是模拟监控?
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 【干货分享】dos命令大全
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • $.ajax()
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (6)设计一个TimeMap
  • (阿里云万网)-域名注册购买实名流程
  • (待修改)PyG安装步骤
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)可以带来幸福的一本书