前言
为了更好的理解漏洞原理以及提升自己的挖洞能力,终于还是入坑了代码审计。况且这个想法已经在脑海中酝酿很久了,但由于方方面面的原因没能照顾到代码审计的学习,索性趁五一假期宅在家里有时间,所以打算正式把这门手艺安排上。
何为代码审计
简介
代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。
即对源代码进行检查,寻找代码中会导致安全问题的bug(漏洞)。
前置知识
掌握基础的编程语法
能看懂代码的逻辑
漏洞形成原理的理解
熟悉不同系统的不同特性
熟悉各种中间件的特性差异
通用审计思路
思路概览
- 回溯敏感函数的参数传递过程
- 查找可控变量,追踪变量传递过程
- 寻找敏感功能点,通读其代码
- 直接阅读通篇代码
实例讲解(回溯敏感参数)
espcms_v5源码
Seay源码审计工具
审计开始
先用工具自动审计一波,看看有哪些可能的漏洞
选中提示由sql注入漏洞的地方,双击跟进:
可以发现,在第23行的sql语句中有可控的参数$parentid
。在右边的变量列表中点击该变量,可以看到其赋值流程:
可见,参数$parentid
从函数accept()
中获得,右键该函数并选择函数定位。最后在文件class_function.php
的第353行发现该函数的定义:
该函数的作用是获取参数$_GET
、$_POST
、$_COOKIE
的值,然后进入R
分支。
显然,这里的传参是可以控制的,首先是对$_GET进行传参,然后才是$_POST。
但是,在第372行中,参数$var[$k]被函数daddslashes()
进行了处理,所以,在这里跟进分析一波函数daddslashes()。
在第179行有该函数的定义:
addslashes()函数的功能:
daddslashes() 函数对字符串或数组进行反斜杠处理
在单引号,双引号,反斜杠前'添加反斜杠'
一般用于对表单提交的数据进行处理,防止sql注入
'附:'如果MAGIC_QUOTES_GPC=ON,则不处理。
但是尽管如此,这里的处理并不影响对该漏洞的利用,因为此处的sql语句中没有单引号(’),所以我们不需要去构造闭合的利用条件。
$sql = "select * from $db_table where parentid=$parentid";
于是,便可以确认这里存在sql注入。接下来只需要找到该漏洞的触发点即可,回到漏洞点,发现漏洞函数oncitylist()定义在继承了connecter类的important类
中。
右键全局定位该类(important),最后在/adminsoft/index.php中发现了该类的实例化,也就以为着我们可以在此处构造payload:
先简单分析以上代码: