作者:mobiledu2502925333 | 来源:互联网 | 2024-12-13 18:53
作为网络安全领域的初学者,本文记录了我在SQL注入技术上的实践与思考,以期在未来的学习中能够不断回顾与巩固。以下内容基于实际操作经验整理,若有不当之处,欢迎各位前辈指正。
本文未经过严格的排版处理,未来将逐步完善。
靶机链接:https://blog.csdn.net/qq_35258210/article/details/112465795
目录
- 数字型注入 (POST)
- 字符型注入 (GET)
- 搜索型注入
- 其他类型注入
- INSERT/UPDATE 注入
- DELETE 注入
- HEADER 注入
- SQL 盲注
- Time 盲注
- 宽字节注入
1. 数字型注入 (POST)
在尝试直接输入无效后,采用抓包工具进行分析。由于目标字段为数字类型,尝试使用payload: -1 or 1=1,通过构造逻辑永真的条件来获取所有用户名。
进一步利用ORDER BY确定表结构,发现当查询第3列时出现错误,表明该表仅有两列。
替换第二列的内容以提取敏感信息,成功获取到所需数据。
2. 字符型注入 (GET)
输入1时系统反馈不存在该用户,而输入单引号则引发错误。通过分析错误信息,构建payload: ' ORDER BY 4 -- 来确定表结构,最终确认表包含两列。
使用UNION SELECT结合已知列数,成功获取数据库名称等信息。
3. 搜索型注入
尝试输入单引号触发错误,分析错误信息后得知输入被特殊字符包裹。构造payload: ' ORDER BY 3 -- 确定表结构,并通过UNION SELECT获取数据库版本、名称及用户名。
4. 其他类型注入
输入单引号导致错误,分析后发现输入被额外字符包围。使用payload: ') ORDER BY 2 -- 确定表结构,并通过UNION SELECT获取数据库版本和名称。
5. INSERT/UPDATE 注入
在表单提交过程中观察到错误信息,通过分析确定注入点。构造payload: ') AND UPDATEXML(1, CONCAT(0x7e, USER(), 0x7e), 1) -- 成功触发错误,泄露用户名等信息。
在更新信息时同样可以利用类似方法注入,只需注意正确闭合SQL语句并注释掉后续内容。
6. DELETE 注入
在删除留言功能中寻找注入点,通过分析URL参数构造payload: 77 AND UPDATEXML(1, CONCAT(0x7e, DATABASE(), 0x7e), 1) -- 触发错误,泄露数据库名称。
7. HEADER 注入
登录后通过修改HTTP头部信息进行注入,构造payload: ' AND UPDATEXML(1, CONCAT(0x7e, DATABASE(), 0x7e), 1) AND ' -- 成功触发错误,泄露数据库名称。
8. SQL 盲注
面对无明显反馈的注入点,采用盲注技术。通过构造payload: ' AND LENGTH(DATABASE()) > 7 -- 判断数据库名称长度,进而逐位猜解出完整名称。
9. Time 盲注
当常规盲注方法无法获得即时反馈时,可以使用Time-Based Blind Injection。通过构造payload: ' AND IF(SUBSTR(DATABASE(), 1, 1) = 'p', SLEEP(5), NULL) -- 延迟响应时间,间接判断条件真假。
10. 宽字节注入
针对某些对特殊字符过滤不严的情况,可以通过改变字符编码方式绕过限制。例如,使用GBK编码构造payload: %df' OR 1=1 -- 实现注入。