代码审计
白盒测试
- 搭建成功后 用WEB漏洞扫描工具
- 利用网站的源码进行代码审计
准备工作
- 漏洞参数条件:函数 可控变量
- 列如sql注入
- 函数关键字:mysql_connect mysql_select_db mysql_query 等
- 可控变量关键字:$_GET $_POST $_REQUEST $_SERVER等
定点漏洞挖掘
- 分析漏洞产生条件
- 得到漏洞关键字
- 利用工具查找关键字
- 分析文件名进行判断筛选
- 对文件进行代码分析 跟踪变量
- 确定是否存在该漏洞
数据库监控工具挖掘
- 打开审计插件mysql监控工具
- 输入mysql账号密码点击下断和更新
- 登陆要审计的页面
- 并且吧各个功能点都点一遍
- 回到源代码审计工具
- 点击更新
- 看到变量中带值的的sql语句就可能是注入点
- 复制带值的sql语句部分
- 粘贴到包含文本,并输入搜索的文件和范围,一般文件就是php文件
- 点开一个看起来不像配置文件的文件
- crtl + f 搜索刚刚粘贴的关键字
- 找到带参数id的sql语句
- 如果包含该参数有变量,就需要回调该变量,观察该变量过滤规则,从观察是否存在过滤不完整
- dvwa用的isset函数,没有过滤的意思,所以不必回调
- 所以该页面没有任何过滤,存在sql注入
SEAY源代码工具挖掘
- 首先打开seay源代码审计工具
- 点击新建项目导入源码
- 点击自动审计
- 可以看到一堆漏洞
- 我们点击sql注入这个
产生漏洞 条件
- 函数关键字:mysql_connect mysql_select_db mysql_query 等
- 可控变量关键字:$_GET $_POST $_REQUEST $_SERVER等
- 该没有可控变量关键字,我们假设他有关键字$_GET
- 可以看到使用了变量传入,并且有函数包裹所以我们要回调函数
- 我们复制该函数名
- 在本文中查找该函数
- 可以看到该函数的定义是
- 如果条件存在就将输入的字符转义
- 我们查一下该条件到底是什么
- 使用了两个函数:function_exists()和get_magic_quotes_gpc()
- 第一个是定义是否传来字符串
- 第二个是定义传来的铭感字符添加转义
- 再回到这边来
- 如果那边的条件成立,则根本不存在注入
- 因为他规定了输入必须是字符还有转义威胁字符
- 所以该位置不存在注入
- 我们现在做一个假设
- 如果没有必须是字符串的条件
- 他只是过滤了单引号等字符
- 而该sql语句并没有吧字符写死在里面
- 则该位置就存在漏洞,因为他过滤的是字符单引号等字符,但是我们可以不用字符,使用整形注入
- 现在假设他真的就存在这么一个漏洞
- 通常情况是观察该类在那位置实例化,可以是本文,也可以是外部调用,所以本文和外部调用我们都要搜索是否存在
- 我们搜索该类的时候发现没有任何文件调用(此处无图),所以他肯定就是在本页面中使用
三种情况
-
一种是在其他文件实例化,一种是在本文件实例化,还有一种是在类中调用
-
文件实例化:就要通过全文函数搜索,去找到实例化的文件,然后再通过该传参条件,在外部文件构造sql语句
-
本文件实例化和类中调用都直接在当前文件构造sql语句即可
-
通过在本文搜索,搜索他当前所在的函数
-
发现该函数就是在类中调用
-
找到该语句,根据其条件,构造出利用姿势
-
如:php?funcName=unique&value=1
-
反正不是盲注就是显注入或报错注入
-
观察应该是盲注
-
如果真的要确定是什么注入就跟一下条件语句中的函数,看他怎么处理即可
这里假设变量都是用get传参(图中小红方块),因为该源码没有吧参数传递给用户,所以将就假设一下,方法都一样
如
f
u
n
c
N
a
m
e
=
funcName=
funcName=_GET[‘unique’];
v
a
l
u
e
=
value=
value=_GET[‘unique’];