接下来我会详细讲解“详解SQL报错盲注”的攻略。
什么是SQL报错盲注
SQL报错盲注(Error-based Blind SQL Injection)指的是在进行SQL注入时,通过构造恶意的SQL语句触发目标网站SQL的错误提示,在错误提示中获取有关数据库的信息或功能,从而实现进行注入操作。
SQL报错盲注攻击过程
SQL报错盲注攻击过程分为以下几个步骤。
1. 确定目标网站是否存在注入漏洞
使用工具或手工方式,确定目标网站是否存在注入漏洞。一般是通过单引号、双引号等特殊字符进行注入测试,如果返回异常信息则说明存在SQL注入点。
2. 构造触发错误语句
SQL报错盲注的原理是在SQL语句中构造出现错误,从而触发错误提示信息。构造触发错误语句的方式有很多,这里只举例两种。
- 利用SQL函数
CONCAT()
构造非法的SQL语句
' and (SELECT 1 FROM (SELECT CONCAT_WS(0x3a,version(),FLOOR(rand(0)*2))x FROM information_schema.tables GROUP BY x limit 1)a) '
- 利用SQL函数
CAST()
构造非法的SQL语句
' and (SELECT * FROM (SELECT(SLEEP(5)))WkxD) AND 'ubpl'='ubpl
3. 解析错误提示语句获取有用信息
触发错误语句后,服务器根据不同语法错误返回不同的错误提示信息。我们可以通过解析错误提示信息获取有用信息,如数据库类型、数据库版本等。
4. 利用获取的信息进行注入操作
根据获取的有用信息,就可以构造有效的SQL注入语句,完成需要进行的攻击行为,例如获取数据库表、字段等信息。
SQL报错盲注示例
接下来我用两个具体的SQL报错盲注攻击示例进行说明。
示例1:获取目标网站数据库类型
我们假设目标网站存在以下文件:
- index.php?id=1
此时我们可以尝试使用以下语句进行注入测试:
http://target.com/index.php?id=1'
如果返回了错误的SQL语法信息,则说明存在注入点。在检测到注入点后,我们可以使用以下语句构造非法SQL,从而触发错误提示,并获取有用信息——目标网站数据库类型:
' and (SELECT 1 FROM (SELECT CONCAT_WS(0x3a,version(),FLOOR(rand(0)*2))x FROM information_schema.tables GROUP BY x limit 1)a) '
此时如果返回以下错误提示,就可以得知目标网站使用的数据库类型了:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '5.6.44-log:1' at line 1
通过错误提示信息可以看出,目标网站使用的是MySQL数据库,并且版本为5.6.44-log。
示例2:获取目标网站管理员的密码
我们仍然假设目标网站存在以下文件:
- index.php?id=1
通过尝试手工注入或者使用工具进行测试,我们找到了SQL注入点。
接下来,我们使用以下构造非法SQL:
' and (select * from (select sleep(20)) c) '
如果访问该网站注入点所在的URL会停留约20秒,那么说明构造的SQL语句执行了。 通过改变sleep的时间,我们发现该网站可以做到以秒计算的时间休眠,检查网站的容错情况,可能是错误的SQL语句下整体进入或冻结。 那么可以使用以下注入语句:
' and (select * from (select "admin_password_here")a) '
由于该语句为True,所以我们无需尝试爆破密码,直接得到了目标网站的管理员密码。
总结
SQL报错盲注是SQL注入攻击中非常常见的一种方式,可以利用错误提示语句在不直接访问数据库的情况下间接获取数据库的相关信息,甚至是注入目标网站的数据。因此,网站开发者在开发网站时应该注意相关漏洞点,以免网站遭受攻击。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解SQL报错盲注 - Python技术站