代码审计流程

代码审计流程_第1张图片

 

1.什么是代码审计

代码安全审计是指开发和有安全经验的人员,通过阅读开发文档和源代码,以自动化分析工具或者人工分析为手段,对应用程序进行深入分析,高效全面的发现系统代码的编码缺陷以及开发人员人员不安全的编码习惯,并指导开发人员进行修复,保障应用系统的安全运行。

一般泛指白盒审计

2.为什么需要代码审计

防御性编程的一个组成部分,在软件发布之前减少错误。

能够找到普通安全测试无法发现的漏洞,特别是逻辑漏洞。

3.代码审计的业务场景

即将上线的新系统平台

存在大量用户访问,高可用,高并发请求的网站

存在用户资料等敏感机密信息的企业平台

互联网金融类存在业务逻辑问题的企业平台

开发过程中对重要业务功能需要进行局部安全测试的平台

4.代码审计对人员的要求

了解常用的漏洞的原理和补救措施

了解web项目的组成结构

具备一定的web编程基础和业务分析能力

了解web项目常用的架构模型,例如:MVC模型

5.代码安全审计规范

2021年6月1日正式实施《信息安全技术_代码安全审计规范》

代码审计流程_第2张图片

6.代码审计的流程

代码审计流程_第3张图片

一共分为4个阶段:

1.前期准备阶段:

在前期准备阶段我们需要对测试目标进行一个需求分析,然后对这个测试目标指定一套测试的方案,然后提交给专业的人员进行审核,如果审核不通过的话再次修改方案,再次进行提交。提交通过后我们才会向测试目标的公司要他的开发文档,还有源代码,然后再我们的本地环境下去部署好这些应用。像审计工具的安装是你需要提前做好的,包含在环境部署中。重点是你需要把源码拿到,开发文档拿到,然后要部署一个一模一样的环境。当前这些的前提条件是你的测试方案已经写好了,你要按照你的测试方案一步一步的去开展工作。

2.审核实施阶段:

在审核实施阶段我们就要开展具体的代码审计工作了,在最初我认为的代码审计工作就读代码,把别人的代码拿到之后结合你对这个软件和应用功能的使用,然后一步一步的去读这个代码,分析这个代码。但是如果在代码量大的情况下,像有几万行代码,甚至几十万行代码的情况下,一行一行的读,这种效率是比较低的,因为没有重点。所以在审计实施阶段,我们一方面确实要读代码,但是一方面我们需要通过某种技巧,某种方法去提高代码审计功能的效率,全靠人工肯定工作效率就会比较低的。所以这个时候我们会使用专业的代码安全检查工具,这东西也需要去扫描,也要去使用相关工具。比如说像seay,rips,Fortify SCA等这些工具。所以我们同样也会使用这些工具,而使用工具的目的就是提高代码审计的效率,然后基于工具使用后的结果,我们进行人工的审计,人工的审计就是我们要人工的去做漏洞分析,去做漏洞验证,去做漏洞的定级。这是我们在代码审计中最重要的环节。使用工具扫描,人工审计进行分析,分析完成进行验证,验证完成进行风险的定级,然后提出修复的建议,也就是提交修复方案。

3.审计复查阶段:

当我们提出修改方案后,开发人员会根据我们提交的修改建议,然后去对他的源代码进行修改,当然我们会协助整个修改流程。当开发人员对源代码修改完成后,我们需要在对之前测试过的地方进行复测,看他原先有漏洞的地方是否修补成功,是否还存在漏洞。既然是再次测试我们就称之为回归测试,那么回归测试相当于对我们的审计实施在做了一次小循环。当然我们这个叫复查阶段,复查阶段这个漏洞就会和之前相比少了很多。也就是查漏补缺的,相当于对审计实施的又一个小循环,所以回归测试工具扫描,回归测试人工审计。直到经过测试,经过复查确定不存在了这个漏洞了,特别是逻辑漏洞。这意味着我们回归测试通过了

4.成功汇报阶段:

以上3个阶段都完成之后,我们要进行成果汇报。首先进行报告的编写,编写完成后提交给专业人员,他们会进行审核,专业人员审核完成后,再次把报告提交给甲方。整个代码审计流程结束。

7.代码审计的实施

准备工作

  • 获取源码                                                                                                                            首先获取相应的源码,最好有相关文档等,资料越多越容易理解源码

  • 安装网站                                                                                                                             在本地搭建网站,一边审计一边调试。通过跟踪各种动态变化了解源码的作用

  • 网站结构                                                                                                                             浏览源码文件夹,了解网站目录结构

  • 入口文件                                                                                                                             index,admin文件一般是整个程序的入口,详细阅读入口文件,可以帮助了解程序的架构,运行流程,配置文件,过滤文件以及程序的业务逻辑。                                       

  • 配置文件                                                                                                                             类似config等文件,保存一些数据库相关信息,程序的一些信息。先看看数据库编码 ,如果是gbk则可能存在宽字节注入。如果变量的值用双引号,则可能存在双引号解析代码执行的问题。         

  • 过滤功能                                                                                                                             详细阅读公共函数文件和安全过滤文件等文件,清晰掌握用户输入的数据,哪些被过滤,哪些无过滤,在哪里被过滤了,如何过滤的,是否能绕过过滤数据。过滤的方式是替换还是正则?有没有使用像addslasher()等过滤函数进行处理                                                                  

 8.代码审计的方法

1.通读全文法

通读代码一行一行的读

2.敏感参数回溯法

像10大漏洞,每个函数背后他调用了什么函数,在之前的文章中都有介绍。比如远程命令执行的敏感函数像(eval(),assert(),preg_replace(),call_user_func(),exec(),shell_exec(),system()等),还有像ssrf的敏感函数(curl_exec(),file_get_contents(),fsockopen())等。像这些函数都是属于敏感函数,那么什么是敏感函数呢?也就是他们有可能造成漏洞的产生,他们可能造成漏洞的风险。比如说像在我之前的文章有写过水平越权和逻辑越权的时候,他们同样是文件包含是否有漏洞?那么该怎么分析呢?也就是分析这个函数的参数,他有没有来自用户输入。这就叫做敏感函数回溯法。你要从函数调用的参数往前走,这个参数是不是写死的,是不是经过用户输入。这个参数既然经过了用户输入,那么有没有做验证,验证是否能绕过?来判断你这个地方有没有漏洞。这就叫敏感参数回溯法

3.定向功能分析法

当我们对一个项目做代码审计的时候,可能你首先要 了解他有多少个模板,多少个功能。假如我们做一个新闻的模块,他分前台和后台,前台模块主要是对信息的浏览,我们知道如果仅仅是浏览的话这个基本是没有漏洞的,只是查询出来给你看一下,也没有数据的交互。那么这个漏洞几乎没有,那么这个漏洞你就不用去审计了 。但是如果是某一个模块像用户模块,我们可能需要注册账户,登陆账户,修改用户密码。那么你就会发现可能漏洞的集中地就在这个用户模块上,那么我们就可以做定向功能分析了。如果你仅仅是读新闻的这块你就可以不用分析了。因为我们只分析交互性比较多的用户模块。就好像是定向功能分析,这样的话更有针对性,并不是广撒网,而是分析重点

 8.1通读全文法

优点:

能够对程序框架有整体的认识

深入了解程序的执行流程

挖掘出高质量的漏洞漏洞

缺点:

耗时,工作量大

8.2敏感函数参数回溯法

分析过程:

根据敏感函数,逆向追踪参数传递的过程。敏感函数大部分的漏洞他是来源于函数的参数是用户输入,而且没有做过滤,如果写死的话不存在漏洞。所以我们需要逆向追踪参数的传递过程,如果你找到了这个参数要看这个参数怎么赋值的。如果是直接赋值就没有漏洞,如果是来自用户输入,那么在往上找,来自于哪里的输入。从输入到我用这个参数,中间你有没有过滤和检查。过滤的是否完整,能不能进行绕过,这就是敏感函数回溯法。

优点:

快速,高效

缺点:

没有精读代码,无法深入了解程序的运行流程和业务流程

很难挖到逻辑漏洞

   8.3定向功能分析法

分析过程 :

根据项目的业务逻辑和业务功能进行审计。通过浏览器执行相关的功能,推测可能存在的漏洞,定位相应的代码进行分析。

优点:

高效,具有定向挖掘特点

可以挖到相应功能模块的逻辑漏洞

缺点:

精读部分代码无法深入了解程序所有模块的运行流程

 8.4注意的问题

无论项目规模大小,都应该首先把握整体结构

特别是使用通用模块的程序,要充分了解模块的结构,掌握流行的MVC模型

一切用户的输入都是有害的,一切进入到危害函数的变量都是有害的

动静结合,人工与工具的结构,正向与逆向的结合。

PS:

通读全文和定向功能分析都是属于正向。

敏感参数回溯法属于逆向。

什么是动静结合?

动:调式代码属于动,就是你一步一步的调试

静:我们不跑代码,也不执行代码,就读取代码

 9.代码审计工具

1.RIPS(只支持php)

2.seay(只支持php)

3.Fortify SCA (专业,支持很多流行语言)

 
9.1RIPS下载和安装

rips:下载地址https://rips-scanner.sourceforge.net/

代码审计流程_第4张图片

 访问官网后直接点击here进行下载即可

代码审计流程_第5张图片

 代码审计流程_第6张图片

 把多余的后缀删除掉

代码审计流程_第7张图片

直接去本地访问这个文件夹。

此时就会进入到这个界面

代码审计流程_第8张图片

Path/file: 把需要做代码审计的目录放进去,这里一般写绝对路径

Subdirs:这里是如果扫描到子目录,需要进行递归的操作。默认是勾选的

比如说我这里要对pikachu靶场进行代码审计。我们就需要把pikachu的路径放进去

 

Verbostity:扫描的级别 一般很少设置。我们就选第一个就可以 了

Vuln type:漏洞的类型,支持命令注入、代码执行、SQL注入等十余种漏洞类型,ALL为全部扫描。

Code style:代码的样式

/regex.:正则表达式

Search:是和/regex/进行对应的

Scan:开始扫描

 都配置好后点击scan开始扫描

代码审计流程_第9张图片

 点击continue

代码审计流程_第10张图片

 

扫描之后的结果。

以上显示的就是统计结果图。

Sum:30,意味着一共扫描出39个漏洞。其中(code Execution)远程代码执行是一个,(command Execution)远程命令执行是两个,(FILE Disclosure)文件泄露是两个,(File Inclusion)文件包含是三个,(SQL Injection)SQL注入是6个,(cross-Site scripting)xss攻击是13个等等......

代码审计流程_第11张图片

 

扫描完成后,右侧会出现四个按钮。

Files:就是你扫描了哪些目录

代码审计流程_第12张图片

 User input:用户输入

代码审计流程_第13张图片

 stats:统计的结果

代码审计流程_第14张图片

 Functios:扫描过的函数

代码审计流程_第15张图片

代码审计流程_第16张图片 扫描之后我们就可以一个一个去看了

File: D:\phpStudy\WWW\pikachu/pkxss/xfish/xfish.php

这里他就会存在应该漏洞

代码审计流程_第17张图片

 并且在左侧可以看到有四个按钮。

第一个按钮的作用:查看漏洞产生的地方

代码审计流程_第18张图片

 第二个按钮:用于折叠

 这个是没有折叠前

代码审计流程_第19张图片

折叠后

第三个按钮:帮助文档,他会给你描述这个漏洞的概念,原理。还有会给你poc

代码审计流程_第20张图片

 比如说这个是sql注入漏洞,他所调用的函数是mysqli_query(),接收参数来自$_GET()代码审计流程_第21张图片

 漏洞的描述代码审计流程_第22张图片

 漏洞的poc

第四个按钮:data leak 数据泄露。暂时不知道咋用

第五个按钮:生成攻击,也就是我们说的exp

代码审计流程_第23张图片

 代码审计流程_第24张图片

 

就利用他能做什么攻击。

以上就是工具提供的大概功能。

操作试用过程:给目录->扫描->对扫描结果进行分析->分析的时候我们可以只针对有漏洞的源码部分进行分析,还有可以查询帮助,并且还有攻击也就是exp,针对这个漏洞我们怎么做漏洞利用。怎么试用他去攻击系统。

详情可参考 :静态代码编码安全审计: PHP源代码审计工具RIPS_php代码审计工具_瑶~why的博客-CSDN博客

9.2 seay

下载和安装教程

代码审计Seay工具安装教程_DDosG的博客-CSDN博客

 

开源免费,只能运行在windows操作系统,并且只针对php语言

执行审计常见web安全漏洞,并且能够进行代码调试,函数定位,语法高亮等。

1.seay主界面

代码审计流程_第25张图片

 2.用seay对dvwa对代码审计

代码审计流程_第26张图片

 代码审计流程_第27张图片

 选择dvwa的目录

代码审计流程_第28张图片

 此时他就把dvwa的整个源码载入进去了

代码审计流程_第29张图片

 关闭项目就是把这个dvwa的项目关掉

代码审计流程_第30张图片

 此时就是空白

代码审计流程_第31张图片

 在把dvwa打开,展示的就是整个网站的目录结构

代码审计流程_第32张图片

 选择自动审计

代码审计流程_第33张图片

 当选择自动审计时他会出现这个标签,如果你想关闭这个标签双击就行。

代码审计流程_第34张图片

 双击关闭。此时标签就没有了

代码审计流程_第35张图片

 如果想要自动审计的话,点击开启他就会一键审计了

什么是一键审计?

只要点开始,他就会对dvwa整个靶场目录进行扫描了

点击开始

代码审计流程_第36张图片

扫描后发现 存在189个可疑漏洞!同时我们也可以用他生成报告

 代码审计流程_第37张图片

 点击生成报告

代码审计流程_第38张图片

 随便取个名字。

代码审计流程_第39张图片

 生成成功。

代码审计流程_第40张图片

 找到前面保存报告的地方,查看他

代码审计流程_第41张图片

 就可以看到刚刚审计出来的可以的漏洞了

代码审计流程_第42张图片

 点击全局搜索。

全局搜索他是支持正则的,就和我们在rips里面一样,他里面也有查找。我们一般在进行敏感函数参数回溯的时候可能会使用他去寻找一些敏感函数,比如是我们要在dvwa中看他有没有用到shell_exec()这个函数

代码审计流程_第43张图片

比如说如果这个网站有存在shell_exec这个函数,就有可能存在远程命令执行这个漏洞。

这个是针对于文件内容的查找的,他会去遍历每一个文件去读取内容,在内容里面去查找这个shell_exec的关键词

代码审计流程_第44张图片

 扫描出来的结果。

那么在如下的几个文件中就会出现我们需要寻找的shell_exec,找到函数之后,看参数。我们就可以进行回溯了。所以敏感函数参数回溯是要结合全局搜索的。

以上查找出8个,那么也就意味着在8个地方对shell_exec这个函数进行了调用。

代码审计流程_第45张图片

 在点击函数查询,将要查询的函数输入进去

代码审计流程_第46张图片

 他就会把这个函数的描述功能显示给你。这就是帮助文档。不懂的函数放入里面查一查。

 代码调试

代码审计流程_第47张图片

 就是一个代码调试的功能 。

以上几个功能,自动审计就是扫,全局搜索就是在内容中去搜索一些敏感函数进行回溯,函数查询,自动加载php的手册,不懂的函数去里面搜一下就行,

代码调试相当于给我们内置了一个php的解释器。

回到自动审计界面

代码审计流程_第48张图片

 随机挑选一个出来。双击

代码审计流程_第49张图片

 点击后,他会出现一个高亮显示的位置,意味着这里可能存在一个漏洞。我们想读这个代码。当然这里他只是对这个函数进行了调用,那么这个函数是在哪里放的呢

代码审计流程_第50张图片

 

选择函数->全文追踪

全文追踪:就是在你打开的这个Init.php这个文件里面,有哪些地方用到了这个函数,也就是出现在了什么地方。除了在高亮的部分进行了调用,还在哪些地方进行了调用?当我们选择全文追踪后他就会全部列出来

代码审计流程_第51张图片

 此时在下面的地方会就出现了详细信息,根据信息的显示他只在高亮显示的地方用到了这个函数。他只在当前的文件中进行追踪。

代码审计流程_第52张图片

 此时我们在对setConfigpath这个函数进行全文追踪

代码审计流程_第53张图片

 此时他就在Init.php这个文件中发现了有两个地方对这个函数进行了调用

代码审计流程_第54张图片

 当我们双击详细信息中的第一个,他就会快速的定位到调用的地方。

代码审计流程_第55张图片

 对include_once()这个函数进行查询函数的功能。

代码审计流程_第56张图片

 代码审计流程_第57张图片

 

当点击后他就会自动跳到函数查询的功能,对include_once这个函数的功能进行查询。

Ps:只有系统函数他才可以查找到相应的说明,自定义函数是查找不到的。

那么自定义函数该如何去找呢?

代码审计流程_第58张图片

 对setConfigpath这个函数进行定位->定位函数

代码审计流程_第59张图片

 他就会对这个自定义函数进行搜索。

 当我们双击打开之后,他就会把这个setConfigpath这个自定义函数,这个自定义的方式给你找出来。看他的定义是怎么定义的,源代码是怎么写的。

总结: 1.全文追踪(在指定的文件中,把你需要查询的字符串全部搜索出来,然后列到下面的列里面)

        2.查询函数(会直接跳转到 php手册中,在手册中对函数进行搜索,只能搜索功能函数,也就是自定义函数你是搜索不到的)

        3.定位函数 (对自定义函数进行搜索)

9.3 Fortify SCA(需要收费)

Fortify SCA 是由全国领先的软件安全产品解决方案供应商Fortify Software开发。

支持Windows,Linux,Mac OS 等所有主流平台

内置五大主要分析引擎(数据流、控制流、语义、结构、配置)对源代码进行静态分析。

支持Java,C#,C/C++,PHP等21种语言审计

商业产品

代码审计流程_第60张图片

 要玩的自己去下,破解版的。

Fortify--安装与使用_fortify下载_qq513283439的博客-CSDN博客


#案例演示

一.演示bulecms

了解bulecms的目录结构

代码审计流程_第61张图片

 每个目录的命名都是有规范的

admin:在admin目录下所有文件都是和后台相关的,当然也包括后台的登陆入口也在这个目录下

api:一般放别的网站的函数接口

data:里面一般放数据

images:图片

include:一般放通用的函数目录

js:放JavaScript的代码

Tamplates:一般放模块

index.php:网站的入口

对bulecms进行整体扫描

代码审计流程_第62张图片

扫描发现一共存在306个可疑漏洞

代码审计流程_第63张图片

 

(1).SQL注入演示案例

选择审计结果列表中的第一项,提示为SQL注入漏洞,双击打开读源码

代码审计流程_第64张图片

 代码审计流程_第65张图片

高亮显示的地方,就是存在产生漏洞的代码

分析语句:

这个SQL语句他是使用遍历和字符串拼接的方式,拼接上了这个变量也就是$ad_id,这个是传递进来的值,如果这个传递进来的值没有过滤的话,可能就会存在 SQL注入

查看$ad_id是否存在过滤

代码审计流程_第66张图片

 选择这个变量->全文跟踪

代码审计流程_第67张图片

 

此时他就给我们两处关于$ad_id这个变量出现的地方

选择第一处进行阅读

代码审计流程_第68张图片

12行:使用$_GET[]方式接收用户输入,键名为"ad_id"。判断以$_GET["ad_id"]接收的值是否为空,如果不为空的话对接收到的值,使用trim()函数进行过滤。也就是过滤$_GET['ad_id']接收的值,然后去除左右 两侧的空白。如果为空的话,就取给空的值把" ",也就是把这个空字符串返回会去

代码审计流程_第69张图片

接收$ad_id这个变量,如果是空的话直接 echo “error”。 并且使用exit()函数退出当前的脚本

代码审计流程_第70张图片

这块语句的处理只做了是否为空的判断。

为空的话告诉你错误并且退出。

不为空的话就去左右两侧的空白。

在这里他并没有使用某些过滤的方式,来防止SQL注入。比如说他是整数值的话有没有把他转换为整数值。如果是字符串的话有没有把"双引号'单引号进行过滤,把他屏蔽掉,有没有在前面加上/,对我们输入的特殊字符进行转义处理。这些都是需要考虑的。但是在代码中并没有出现这些防护方式。并且从代码来看他也没有采用预处理这种方式。这样的话就实实在在的存在SQL漏洞

代码审计流程_第71张图片

 在代码中还出现了一个自定义函数 getone()。定位函数。看这个函数中有没有存在过滤

代码审计流程_第72张图片

 双击打开

代码审计流程_第73张图片

 打开后发现在定义getone()这个函数的时候他也没有使用预处理的方式。

总结:根据以上的分析确定存在sql注入的漏洞

验证并且利用SQL注入漏洞

代码审计流程_第74张图片

 再次回到seay,查看他sql注入出现在那个文件。

根据seay给我们的显示,出现在ad_js.php的这个文件

代码审计流程_第75张图片

然后 根据他的源码来构造payload

在源码中他是以$_GET方式接收值的。键名为"ad_id"

构造payload:

已知:

文件名:ad_js.php

GET方式传参键名为 :ad_id

拼接起来

ad_js.php?ad_id=随便写一个数字。

代码审计流程_第76张图片

 

文件所在的位置

D:\phpStudy\WWW\bluecms\uploads\ad_js.php

wwww就是他的网站目录了。那么整个拼接下来就应该是以下内容

http://127.0.0.1/bluecms/uploads/ad_js.php?ad_id=1

1.完整的url

##http://127.0.0.1/bluecms/uploads/ad_js.php?ad_id=1

通过分析代码,是存在sql注入的。而且传参使用的是GET请求的传参方式

2.验证SQL注入漏洞

使用sqlmap工具

获取所有数据库

命令:

sqlmap -u http://192.168.222.180/bluecms/uploads/ad_js.php?ad_id=1 --dbs

代码审计流程_第77张图片

 获取当前数据库

命令:

sqlmap -u http://192.168.222.180/bluecms/uploads/ad_js.php?ad_id=1 --current-db

代码审计流程_第78张图片

当前数据库为bulecms

获取当前数据库下的所有表

命令:

sqlmap -u http://192.168.222.180/bluecms/uploads/ad_js.php?ad_id=1 -D bulecms --tables

代码审计流程_第79张图片

 获取 blue_admin  表 的所有字段

获取指定表的字段

命令:

 sqlmap -u http://192.168.222.180/bluecms/uploads/ad_js.php?ad_id=1 -D bulecms -T  blue_admin   --columns

代码审计流程_第80张图片

获取这三个字段的信息

拖库

命令

sqlmap -u http://192.168.222.180/bluecms/uploads/ad_js.php?ad_id=1 -D bulecms -T blue_admin -C admin_id,admin_name,pwd --dump

代码审计流程_第81张图片

 

管理员账户名:kaka

      密码:123456(MD5 解密后的结果)

(2)代码审计(文件包含)

敏感函数参数回溯法

 代码审计流程_第82张图片

 选择审计结果列表中的第20项,提示为文件包含漏洞,双击打开读源码

代码审计流程_第83张图片

 代码审计流程_第84张图片

注意这一行的代码 。

他和我们之前在靶场见过的文件包含比较 相对难度更高一点,像之前我们做的文件包含的靶场,用户输入整个的参数就是整个参数,但是现在不是了。现在用户输入的参数是整个include的一部分,他后面有前面也有数据。现在如果我想要用他使用攻击的情况下,我必须去掉前面的也去掉后面的。

绕过有限制条件的文件包含过程

首先要确定这个$_POST[‘pay’]来自哪里

代码审计流程_第85张图片

 选中$_POST[‘pay’]->全文追踪

代码审计流程_第86张图片

 

一共出现在两个位置。

定位第一个

代码审计流程_第87张图片

 1.判断是否为空,他只使用$_POST[‘pay’]来判断,你有没有选择支付方式,没有选择的话他就会使用showmsg()函数,并且 输出“对不起,您没有选择支付方式”
2.如果不为空的话,也就是你选择了支付方式,他就会包含这个支付方式了。然后就会生成$_POST[‘pay’]这个目录下的index.php这个文件

代码审计流程_第88张图片

 

根据文件的目录:D:\phpStudy\WWW\bluecms\uploads\user.php

进入到金币充值页面。

代码审计流程_第89张图片

 点击注册。

代码审计流程_第90张图片

 注册一个新账户

代码审计流程_第91张图片

 注册完成后点击充值中心

代码审计流程_第92张图片

 代码审计流程_第93张图片

 代码审计流程_第94张图片

 

注意在在线支付这里,我们没有可以支付的方式,也就是在这里他存在漏洞

到这个页面后开启bp->点击在线支付。

代码审计流程_第95张图片

 抓取到的数据包

代码审计流程_第96张图片

 

我们把抓到的数据包和源代码进行对比。发现他在传递的时候少了一个参数,也就是$_POST[‘pay’]接收方式。因为没有去提供$_POST[‘pay’]。那么既然没有提供的话我们就可以自己加了。本来向这里提交的你没有提供,那么我们就可以去增加。既然是我们添加的,那我们想写什么就写什么。

并且整个漏洞出现的地方就是在这个$_POST[‘pay’]的地方

include 'include/payment/'.$_POST['pay']."/index.php";

使用了include包含函数,使用了可控变量$_POST[‘pay’]接收数据。那么只要我们把这个$_POST[‘pay’]的值修改成我们想要的内容就可以了

利用过程:
在数据包中添加&pay进行数据的传递
Payload:
submit=%D4%DA%CF%DF%D6%A7%B8%B6&price=30&id=B1689537786E&name=%B1%E3%C3%F1%BF%A8%&pay=../../../../phpinfo.php...........................................................................

.................................................................................................................................................................................................

payload分析:

../../../../

代码审计流程_第97张图片

 这个两个对应两个目录../../

代码审计流程_第98张图片

 

这里两个对应两层目录。

因为我们的phpinfo.php的这个文件在网站的根目录下。所有这里一共是四层目录

也就是../../../../

后面的.......:长度截断。

include 'include/payment/'.$_POST['pay']."/index.php";

因为在后面他做了限制。必须是index.php的文件。所以我们要使用长度阶段的方式把后面的限制给他顶出去。

代码审计流程_第99张图片

 

为我们输入的内容。

然后放包

代码审计流程_第100张图片

 

文件包含利用成功。

备注:这里长度截断如果要成功的话,必须把php服务器切换到5.2以下的版本

代码审计流程_第101张图片

 

(3)代码审计XSS漏洞

定向功能分析法

代码审计流程_第102张图片

 登陆界面->新用户注册

代码审计流程_第103张图片

 

定向功能分析,就是从功能分析。这个界面所对应的代码是什么,我们就要看代码了

根据url找到目录的位置.

注册界面所对应的文件和参数

Url:##http://127.0.0.1/bluecms/uploads/user.php?act=reg

阅读与注册相关的代码了代码审计流程_第104张图片

 

User.php文件

Get方式传参键名为act

键值为reg

 接着一个一个寻找

代码审计流程_第105张图片

 

如果$act的值等于reg的话,就进入到注册页面。

进入到注册页面之前做了一系列的判断。

比如使用session验证你是否已经登陆。

使用session防止恶意注册,是否已经大于30秒后在注册。

代码审计流程_第106张图片

 然后做完一系列操作后,跳转到reg.htm这个注册界面,让我们开始进行注册了 。

代码审计流程_第107张图片

 

当我们把以上的这些信息都填写完毕后提交,他在url的值

从原本的

127.0.0.1/bluecms/uploads/user.php?act=reg

就会变成

$act=do_reg

原本注册界面

代码审计流程_第108张图片

 对应的是他

也就是$atc这个变量的值对应的是”reg”

提交后

代码审计流程_第109张图片

 $atc变量的值就等于do_reg

Do_reg意味着我要注册了。

代码审计流程_第110张图片

 代码审计流程_第111张图片

 

这个时候我们就要对我们提交数据的部分 ,看他的代码有没有进行过滤。

是否存在 xss,是否存在sql注入

代码审计流程_第112张图片

 

注意这个部分。

他只对接收的数据只做了一个 是否为空的判断,以及使用trim函数去除左右两侧的空白,最后赋值给一个变量。所以他并没有考虑到xss和sql的攻击。

代码审计流程_第113张图片

 

对用户名,密码,第二次密码,验证码。进行判断。

对用户名和密码做了长度的限制

代码审计流程_第114张图片

 

注意这里,他在之前sql语句之前,并没有对邮箱进行限制,那么也就意味着,我们可以在文章的地方做文章,比如使用xss对他进行攻击,sql注入攻击。

那么为什么我们可以在邮箱的地方做xss和sql注入攻击?

Xss层面 :

  1. 他没有在邮箱的地方做htmlspaciachars转义,也没有做长度的限制

SQL注入层面:

  1. 没有对特殊符号过限制。
  2. 也没有采用预处理

xss攻击演示过程 :

代码审计流程_第115张图片

 

需要注意的是,这里你需要写一个正确的邮箱地址。然后在写入xss的攻击代码。

如果他是前端验证的话,直接在前端把他这个验证给去掉就行了。后端的话照我这个方式写就可以了

点击提交

代码审计流程_第116张图片

 

利用成功。

然后我们在以管理员的后台来查看信息,看看是否能触发这个xss

代码审计流程_第117张图片

 来到管理员的后台界面,进行管理的身份登陆

代码审计流程_第118张图片

 点击会员管理。

代码审计流程_第119张图片

 会员列表

代码审计流程_第120张图片

 Xss触发成功。


代码审计

1.采用通读法对DVWA存储型xss做代码审计
步骤
步骤一:LOW级别的代码审计

代码审计流程_第121张图片

 

前端和后端对应的数据。
1.我们在前端分别写入name和Message的 值。然后提交给后端
2.后端在接收到name和Message的数据后,将数据插入到数据库中


从代码中分析是否对接收的值,对变量做过滤。
代码分析:
一.对$message变量的过滤

代码审计流程_第122张图片

 

1:使用stripslashes()对$message这个变量进行过滤

Stripslashes():如果用户输入’ “ 他就会变成\’ \” 

作用是防止sql注入

2.使用mysqli_real_escape_string()函数对$message这个变量进行过滤

Mysqli_real_escape_string():对sql语句中的特殊字符进行转义。

作用:防止SQL注入

在以上整个$message这个变量中,他只是做了sql注入的防御。并没有使用htmlspecialchars()对$message进行过滤,也就是没有对xss漏洞进行防御。所以很难防范xss攻击。导致这里可能存在xss攻击。

二.对$name变量的过滤

代码审计流程_第123张图片

 

1.使用mysqli_real_escape_string()对$name这个变量进行防御
Mysqli_real_escape_string():对SQL语句中的特殊字符进行转义。
作用:防止SQL攻击

在对$name这个变量的时候,也只是做了sql注入的防御也没有使用,htmlspeciachars()对$name这个变量进行过滤。同时也可能导致xss漏洞。

代码审计流程_第124张图片

 

以上的过滤完成后,就直接插入数据库中去了 。

总结:以上两个变量都只做了sql注入的防御,并没有做xss的任何防御,所以可能导致xss攻击。

XSS漏洞攻击演示:

代码审计流程_第125张图片

 由于他没有对这两个变量接收的值做任何的xss的处理,所以在这两个地方哪里写都可以。

代码审计流程_第126张图片

 

成功。

Medium级别

代码审计流程_第127张图片

 

前端和后端对应的数据。

一.对$message 变量的过滤

代码审计流程_第128张图片

 

1.使用addslashes()函数对$message 这个变量进行过滤
Addslashes():对’ “ \ null 这些字符在前面加上一个反斜杠,也就是变成\’ \“等。
作用:可以防止SQL注入
2.使用mysqli_real_escape_string()对$message变量进行过滤
Mysqli_real_escape_string():把特殊字符进行转义
作用:防止SQL注入
3.使用htmlspeciaches()函数对$message进行过滤
Htmlspeciachars():将预定义字符转换为html实体字符
作用:防止XSS攻击

在这里他对$message进行了实体转换的处理。所以这里无法攻击。

二.对$name 变量的过滤

代码审计流程_第129张图片

 

1.使用str_replace()函数把”

代码审计流程_第134张图片

 触发成功。

大小写绕过:

Payload:

代码审计流程_第135张图片

 

 成功 。

High级别:

代码审计流程_第136张图片

 

前端和后端对应的数据。

1.我们在前端分别写入name和Message的 值。然后提交给后端

2.后端在接收到name和Message的数据后,将数据插入到数据库中

一.对$messages的过滤 

代码审计流程_第137张图片

 

1.使用addslashes()函数对$message进行过滤
Addslashes():对预定义字符单引号(’),双引号(“) ,反斜杠(\),null。前面添加上反斜杠的字符。比如\’ ,\”
作用:防止SQL注入

2.使用mysqli_real_escape_string()对变量进行过滤
Mysql_real_escape_string():转义在SQL语句中使用的特殊字符
作用:防止SQL注入。

3.使用htmlspeciachars()对$message变量进行过滤
Htmlspecialchars():将预定的字符转换为html实体
作用:防止XSS攻击

总结:在对$message这个变量他做了sql注入的防御也做了xss的防御并且使用了实体转换。这里无法攻击

二.对$name变量的过滤

 

使用preg_replace()函数进行替换,只要出现

你可能感兴趣的:(安全)