[代码审计篇]PHP代码审计入门(前置要点)

前言

为了更好的理解漏洞原理以及提升自己的挖洞能力,终于还是入坑了代码审计。况且这个想法已经在脑海中酝酿很久了,但由于方方面面的原因没能照顾到代码审计的学习,索性趁五一假期宅在家里有时间,所以打算正式把这门手艺安排上。

何为代码审计

简介

代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。
即对源代码进行检查,寻找代码中会导致安全问题的bug(漏洞)。

前置知识
掌握基础的编程语法
能看懂代码的逻辑
漏洞形成原理的理解
熟悉不同系统的不同特性
熟悉各种中间件的特性差异

通用审计思路

思路概览
  1. 回溯敏感函数的参数传递过程
  2. 查找可控变量,追踪变量传递过程
  3. 寻找敏感功能点,通读其代码
  4. 直接阅读通篇代码
实例讲解(回溯敏感参数)

espcms_v5源码
Seay源码审计工具

审计开始

先用工具自动审计一波,看看有哪些可能的漏洞
[代码审计篇]PHP代码审计入门(前置要点)_第1张图片
选中提示由sql注入漏洞的地方,双击跟进:
[代码审计篇]PHP代码审计入门(前置要点)_第2张图片
可以发现,在第23行的sql语句中有可控的参数$parentid。在右边的变量列表中点击该变量,可以看到其赋值流程:
[代码审计篇]PHP代码审计入门(前置要点)_第3张图片
可见,参数$parentid从函数accept()中获得,右键该函数并选择函数定位。最后在文件class_function.php的第353行发现该函数的定义:
[代码审计篇]PHP代码审计入门(前置要点)_第4张图片
该函数的作用是获取参数$_GET$_POST$_COOKIE的值,然后进入R分支。
显然,这里的传参是可以控制的,首先是对$_GET进行传参,然后才是$_POST。
但是,在第372行中,参数$var[$k]被函数daddslashes()进行了处理,所以,在这里跟进分析一波函数daddslashes()。
在第179行有该函数的定义:
[代码审计篇]PHP代码审计入门(前置要点)_第5张图片
addslashes()函数的功能:

daddslashes() 函数对字符串或数组进行反斜杠处理
在单引号,双引号,反斜杠前'添加反斜杠'
一般用于对表单提交的数据进行处理,防止sql注入
'附:'如果MAGIC_QUOTES_GPC=ON,则不处理。

但是尽管如此,这里的处理并不影响对该漏洞的利用,因为此处的sql语句中没有单引号(’),所以我们不需要去构造闭合的利用条件。

$sql = "select * from $db_table where parentid=$parentid"

你可能感兴趣的:(代码审计,php,安全漏洞,web,代码规范,信息安全)