背景 我试图解决第四个现实的任务在hackthissite.org,并无法弄清楚到底是什么SQL我应该注入到URL来检索电子邮件列表。浪费了几个小时后,我放弃了,看了一个解决方案,该解决方案给出了这段有趣的代码行,该行代码将在选择查询后注入:
UNION ALL SELECT NULL, *, NULL, NULL FROM email
我了解这样做的原因以及原因;黑客需要创建一个与合并的查询具有相同列数的查询,并在*周围移动以确保显示电子邮件。那不是我的问题。
问题 我的问题是为什么该代码在MySQL中引发语法错误。经过一些测试,我发现这显然是一个有效的查询:
SELECT *, NULL, NULL, NULL FROM email
就这样
SELECT NULL, text, NULL, NULL FROM email
但是由于某种原因,它不是:
SELECT NULL, *, NULL, NULL FROM email
并在“ ,NULL,NULL FROM email from”附近引发语法错误。我不明白为什么会这样。似乎查询仅在是请求的第一列时才有效,而与其他列无关。这是一个错误吗?它是MySQL独有的功能(并且任务使用了不同的SQL变体)吗?还是我完全误解了?
这是记录的行为:
在选择列表中的其他项目上使用不合格可能会产生解析错误。为避免此问题,请使用合格的tbl_name。参考。
只需按照说明进行操作即可。这应该干净地解析:
select NULL, email.*, NULL, NULL from email