什么是盲注?

SQL注入是指:WEB应用程序没有对用户的输入进行足够的安全校验,用户的输入被拼接进SQL语句并执行该SQL语句,由于用户输入了一些满足SQL语句语法的字符,拼接进SQL语句后执行最终导致数据库执行了本不应该被执行的非法操作。

而盲注则是SQL注入的一种。

举个例子:

一个学生信息查询系统,输入学生学号就会返回学生的姓名和专业,实际上就是执行的

SELECT name,majority FROM student WHERE student_id = ‘$id’;

正常情况下用户输入的是一个学号,那么返回该学生的信息。

如果用户输入的是123′ or ‘1’=’1,整个语句就变成了

SELECT name,majority FROM student WHERE student_id = ‘123’ or ‘1’=’1′;

会返回所有学生的信息。

盲注是在SQL注入的基础上,根据SQL注入的回显不同而定义的。

以上面这个例子为例:

用户输入学号,WEB程序打印出该学生的姓名和专业,这个姓名和专业是数据库里存储的具体数据,而WEB程序将这个数据库里的数据原封不动的告诉 我们了,这种就叫有回显。

而无回显是指,WEB程序不再告诉我们具体的数据了,可能只告诉我们说:“查询成功”、“查询失败”,甚至可能只说一句“查询完成”或者什么都不说。虽然我们并不能直接得到数据库中的具体数据,但是SQL语句的拼接发生了、非法的SQL语句也执行了,那么SQL注入就发生了,只是SQL注入的结果我们没有直接拿到罢了。

虽然是无回显的,但也并不意味着就无从下手了,盲注正是为了针对这种情况的!盲注更像是一种爆破、一种无脑测试,具体注入的时候,比如想注入数据库名,攻击者在做这样的事:

如果”数据库名”的第1个字母是a,你就说“查询成功”,否则就说“查询失败”
如果”数据库名”的第1个字母是b,你就说“查询成功”,否则就说“查询失败”
如果”数据库名”的第1个字母是c,你就说“查询成功”,否则就说“查询失败”

如果”数据库名”的第2个字母是a,你就说“查询成功”,否则就说“查询失败”
如果”数据库名”的第2个字母是b,你就说“查询成功”,否则就说“查询失败”
如果”数据库名”的第2个字母是c,你就说“查询成功”,否则就说“查询失败”

这样通过不断的测试,最终根据WEB程序返回的“查询成功”和“查询失败”,攻击者判断出了想注入数据的每一位是什么,那么就也能够得到这个数据的具体值了。

盲注有哪些分类?

布尔型

就是上面所说的“查询成功”和“查询失败”,根据SQL语句查询的真和假,WEB程序有两种不同的回显,这两种不同的回显就被称为“布尔回显”。

延时型

也就是所谓的时间盲注,即在无法通过布尔盲注判断的情况下,通过响应时长来判断。在做延时盲注时,攻击者构造的SQL语句是这样的意思:如果满足xx条件,就sleep(5),否则就不sleep。

数据库如果执行了sleep()就会延时,而WEB程序和数据库做交互就会等数据库的这个延时,用户(攻击者)和WEB程序做交互那么用户就也得等WEB页面的这个延时,所以攻击者只需要根据页面的响应时间的长短就可以判断xx条件是否满足了。而这个xx条件,可能就是“数据库名的第一位是否为a”这样的判断语句。

盲注的步骤

SELECT name,majority FROM student WHERE student_id = ‘$id’;

其中$id为用户输入,假设为布尔盲注,回显为“查询成功”和“查询失败”。

Step 1: 找注入点

关于找注入点比较简单,学过SQL注入应该都会,如果题目给了源码就直接看着SQL语句构造就行了。

如果没有给源码,我们需要先测试字段类型是字符型还是数字型,然后看是否有回显,然后用or 1=1#之类的东西去测试。具体测试时,我们先想象他的SQL语句是select xx from yy where zz = ‘$your_input’; 因为基本所有题的SQL语句都是这个结构,在这个SQL语句结构的基础上去测试就好了。

Step 2: 构造condition

所谓的condition就是某个条件,这个条件的真与假可以影响SQL语句的查询结果,进而影响WEB页面的回显。例如输入0′ or 1=1#和0′ or 1=2#(#是注释符):

SELECT name, mojority FROM student WHERE student_id = ‘0’ or 1=1#’ #查询成功
SELECT name, mojority FROM student WHERE student_id = ‘0’ or 1=2#’ #查询失败

这里我们可以明确的知道student_id为0的学员是不可能存在的,那么上述SQL语句的查询结果就完全由or后面的1=11=2来决定了。SQL中=意为“是否相等”,所以1=1就表示1是否等于1,这是一个布尔表达式,它的结果只有True和False两种。

这个能直接影响整个SQL语句查询结果的1=11=2,也就是这个布尔条件表达式,就是我们目前Step 2要构造的condition。

Step 3: 注数据

现在我们只需要将Step 2构造的Condition换成具体的注入数据的语句,就可以了!

SELECT name, mojority FROM student WHERE student_id = ‘0’ or substr((select database()),1,1) = ‘a’
SELECT name, mojority FROM student WHERE student_id = ‘0’ or substr((select database()),1,1) = ‘b’
….

布尔盲注中的布尔回显

  1. 最常见的就是回显的内容不同,比如查询成功查询失败,回显长度有时也可以
  2. 返回的HTTP头的不同,比如结果为真可能会返回Location头或者set-cookie
  3. 看HTTP状态码,比如结果为真则3xx重定向,为假则返回200

通过上面的内容,你已经能够进行简单的盲注了,然而实际的题目中会加上各种各样的过滤,为了绕过这些过滤,盲注被分成了LIKE注入、MID注入、LEFT注入、正则注入、IN注入、BETWEEN注入等各种各样的注入类型。

substr((select database()),1,1) = ‘a’

 

作者 admin

百度广告效果展示