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

登录表单SQL注入executeQuery场景下修改数据库表数据的方法问询

核心问题说明

你遇到的报错本质是Java JDBC的executeQuery()方法限制:该方法要求执行的SQL语句必须且只能返回单个ResultSet结果集,两类情况都会触发失败:

  1. 语句执行后无返回结果(UPDATE/INSERT/DELETE类DML语句默认返回影响行数,不返回结果集)
  2. 堆叠查询返回多组结果,未匹配executeQuery()要求的单结果集规则
    另外绝大多数JDBC驱动默认关闭堆叠查询支持,就算语句语法正确也默认无法执行多语句拼接。

可行实现方案

方案1:嵌套带写副作用的函数(适配SELECT调用场景)

不同数据库都支持在SELECT语句中嵌入带写操作的内置/自定义函数,执行时会先触发写逻辑,最终返回结果满足executeQuery()的要求:

  • MySQL环境:如果目标环境开了sys_exec()等系统函数权限,可以用以下payload,注意替换实际库名、字段值:
    correctpassword' AND (SELECT sys_exec(CONCAT('mysql -e "UPDATE users SET id=''newname'' WHERE id=''oldname''"'))) IS NOT NULL --
    没有系统函数权限的练习环境也可以尝试通过INTO OUTFILE写入自定义UDF后调用执行写操作。
  • PostgreSQL环境:可以用dblink模块回连数据库自身执行DML语句:
    correctpassword' AND (SELECT dblink_connect('dbname=你的目标库名')) IS NOT NULL AND (SELECT dblink_exec('UPDATE users SET id=''newname'' WHERE id=''oldname''')) IS NOT NULL --
  • MSSQL环境:可以通过OPENROWSET回连自身执行写语句,或者调用xp_cmdshell执行系统命令修改数据。

方案2:调整堆叠查询语句顺序(仅适配开启了堆叠查询支持的环境)

如果练习环境特意开启了JDBC堆叠查询支持(比如MySQL连接字符串加了allowMultiQueries=true参数),只需要把返回结果集的SELECT语句放在堆叠的最后一位即可,示例payload:
correctpassword'; UPDATE users SET id='newname' WHERE id='oldname'; SELECT 1 FROM users LIMIT 1 --
该语句最后会返回SELECT的结果集,匹配executeQuery()的规则,不会触发无结果集报错。你之前尝试的子查询嵌套UPDATE的写法本身不符合SQL语法,子查询内不允许执行DML写操作,自然无法生效。

方案3:找其他功能点的注入位

如果登录查询的注入点限制过严,可以找网站其他走executeUpdate()的功能点做注入,比如注册、个人信息修改、内容发布等涉及数据写入的功能,这类功能本身调用executeUpdate()执行INSERT/UPDATE语句,不需要返回结果集,注入写操作的成功率更高:
比如注册时用户名输入admin' ON DUPLICATE KEY UPDATE password='123456' --,如果后端注册逻辑是直接拼接用户名生成INSERT语句,执行时会直接覆盖admin账号的密码。

注意所有payload需要按照你实际环境的表名、字段名、数据库类型做对应修改。

内容的提问来源于stack exchange,提问作者lcrnlpz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:15:07