第十三关 可见的基于错误的 SQL 注入
这一关就是通过报错信息的,进行sql盲注,得到密码进行登录
提示: 1、存在SQL 注入漏洞,注入点在cookie
2、有数据库表users,字段列是username和password
具体操作:
1、找到对应的数据包发往repeater(具体操作和第十一关一样)
2、加单引号测试下页面响应情况,存在sql注入
页面报错
页面显示完整的 SQL 查询,包括 cookie 的值,还有未闭合的字符串,那么注入就出现在这个单引号字符串中

3、在单引号后面加一个-- 注释
添加注释字符以注释掉查询的其余部分,包括导致错误的额外单引号字符
页面显示正常

4、插入sql语句,测试存在sql注入漏洞,检测这个注入点存在和可利用
' AND CAST((SELECT 1) AS int)--
解释:与将常量值1转换为整数类型
CAST 是 SQL 中的类型转换函数,用于将某个值转换为指定数据类型。
页面报错存在SQL注入漏洞
显示and的参数必须是布尔类型的,而不是整数类型的

我们修改下,换成=,构成布尔表达式
' AND 1=CAST((SELECT 1) AS int)--
解释:将常量值1转换成整数类型,条件恒为真
页面显示正常

5、确定存在SQL注入后,去插入查询用户名的sql语句
' AND 1=CAST((SELECT username FROM users) AS int)--
解释:与将来自用户表的用户名转换为整数类型的条件=1,也就是恒为真,永远成立
报错,页面显示由于字符限制,查询被截断

字符限制,那就把id值去掉尝试下
' AND 1=CAST((SELECT username FROM users) AS int)--
页面报错,显示子查询返回了多行数据

修改查询语句以仅返回一行:
' AND 1=CAST((SELECT username FROM users LIMIT 1) AS int)--
页面报错,暴露出来users表中的第一个用户名:administrator

6、知道了管理员是表中的第一个用户,再次修改查询以泄露其密码
' AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--
页面报错,暴露出密码:2jzpvewg2r2p6ey3vzt6

7、爆破出来的密码登录,靶场通关
