#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍04-盲SQL注入(Blind SQL Injection)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。
目录
一、盲SQL注入(Blind SQL Injection)的概念
二、盲SQL注入(Blind SQL Injection)的原理
三、盲SQL注入的类型
四、盲SQL注入的操作示例(以猜解数据库名为例)
五、防御建议
一、盲SQL注入(Blind SQL Injection)的概念
盲SQL注入是一种SQL注入攻击技术,与一般的SQL注入不同。在一般的SQL注入中,攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常无法从显示页面上获取执行的结果,甚至连注入语句是否执行都无法得知。它是一种针对数据库的高级攻击技术,不依赖于服务器返回的具体错误信息,而是通过探测系统的微小响应变化来判断是否存在SQL注入漏洞。例如,布尔型盲注通过观察应用程序返回的是“true”还是“false”来推断数据库信息;时间型盲注则通过页面沉睡时间判断,如当满足某个条件时页面沉睡较长时间,不满足时沉睡较短时间,以此来获取数据库信息等。
二、盲SQL注入(Blind SQL Injection)的原理
三、盲SQL注入的类型
- 布尔型盲注(Boolean Blind SQL Injection)
- 这种类型是通过发送不同的SQL查询来观察应用程序的响应,进而判断查询的真假,并逐步推断出有用的信息。例如在判断数据库名长度时,可以构造诸如“1' and length(database()) = 1#”“1' and length(database()) = 2#”等语句,如果语句执行结果为“true”,即表示猜对了数据库名的长度。在获取数据库名的字符时,可以使用“1' and ascii(substr(database(), 1, 1)) > 90#”这样的语句,通过不断猜测字符的ASCII码范围来确定每个字符,猜对时回显正常,猜错时回显异常。
- 时间型盲注(Time - based Blind SQL Injection)
- 其原理是通过页面沉睡时间判断。比如查询当前数据库某个字符的ASCII码,如果大于某个值时让页面沉睡较长时间(如10秒),小于则沉睡较短时间(如4秒),从而推断出数据库中的信息。像判断当前数据库ascii(substr(database(), 1, 1))的第一个字符的ASCII码,如果大于100,ture沉睡10秒,FALSE沉睡4秒。
四、盲SQL注入的操作示例(以猜解数据库名为例)
- 推测数据库名长度
- 需要借助如“length()”和“database()”等函数。例如在MySQL中,可以使用“select length(database());”语句,也可以通过构造类似“1' and length(database()) = 1#”“1' and length(database()) = 2#”等语句来判断当前数据库名的长度,当得到正确的数据库名长度时,将会得到“true”的结果。
- 得到数据库名
- 要使用“ascii()”和“substr(str, start, length)”等函数。先确定数据库名第一个字符的ASCII码范围,例如构造“1' and ascii(substr(database(), 1, 1)) > 90#”语句,通过不断调整范围(类似二分法)来确定第一个字符的ASCII码,然后再对后续字符进行同样的操作,最终得到数据库名。例如,当发现数据库名第一个字符ASCII码为115,即's',然后再修改为“substr(database(), 2, 1)”去猜第二个字符,以此类推。
五、防御建议
盲注确实要比一般的注入要难很多,因为页面没有直接的结果反馈,所以过程更加繁琐复杂,需要一步一步地去猜解。为防御盲SQL注入,应做好输入校验、参数化查询等操作,避免恶意的SQL语句被执行到数据库中。同时,对数据库的权限进行合理分配,限制不必要的数据库操作权限,也能在一定程度上减少被盲注攻击的风险。