群里发了一篇 WAF攻防之SQL注入篇 里面对各个厂商的WAF都过了一遍。本来一开始也以为是常规操作,匆匆扫一眼就没怎么在管了。

但是挖漏洞的同事仔细研究里面的几种饶法后,觉得其中的阿里云盾d的绕法十分诡异,让我看了一下,我这才注意留意到这个特殊的绕法 。

原文写的是 利用–+%0a、@自定义变量、{a key}组合进行绕过

http://192.168.20.81/user.php?id=@a:=(select @b:=`table_name`from{a information_schema.`TABLES` }limit 0,1)union select '1',@a

通过拆解sql语句我们知道,最后的结果是通过自定义的变量a和union返回。

这里对于 @自变量 有几个知识点,这是以前没留意的操作

  • @a=1 判断 变量a 是否 等于 1
  • @a:=1 等同于 set @a = 1 (只有在set的语句下 = 才是赋值)

第一层是@a=(xxxxxxx) 这里略过不看
第二层是select @b:=`table_name`from{a information_schema.`TABLES` } limit 0,1

  • 这里的 @b:=`table_name` 和 直接 写 table_name 效果是一样的。 原因上面提到了 。
  • 第二个是 { a key }的写法。我一直很疑惑 这个{a key}是什么东西。关于这个,我找了很多资料,都没找到。问了几个朋友也没发现,最终在mysql的官网手册中找到了。
    https://dev.mysql.com/doc/refman/5.7/en/expressions.html
    这个确切的写法是 {identifier expr}

    • {identifier expr} is ODBC escape syntax and is accepted for ODBC compatibility. The value is expr. The curly braces in the syntax should be written literally; they are not metasyntax as used elsewhere in syntax descriptions.
    • 简单点说,这个写法主要是为了兼容ODBC才会有的写法。并不是标准的sql语法。
    • 那么在ODBC中是怎么使用的呢,我又寻找了一下 http://web.synametrics.com/winsqlescapeclause.htm
    • 文中提到 ODBC中的写法
      • SELECT * FROM table1 WHERE datefield = {d '1995-09-12'}
        前面的d是告诉ODBC这个数据的格式是啥。 虽然说一般是用一到两个字母去表示,例如
      • Date {d 'yyyy-mm-dd'}
      • Time {t 'hh:mm:ss'}
      • Timestamp {ts 'yyyy-mm-dd hh:mm:ss[.f...]'}
    • 但是我试了一下。写很长,mysql也可以认。

  • 更重要的是,只要是支持ODBC,那么 {identifier expr} 理论上都可以使用。这就大大增加了 {identifier expr} 搞事情的机会。

点击收藏 | 2 关注 | 1
登录 后跟帖