在《WAF攻防之SQL注入篇》中几个有意思的发现
wstart 漏洞分析 17082浏览 · 2018-02-26 13:52

群里发了一篇 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} 搞事情的机会。
11 条评论
某人
表情
可输入 255
爱吃菠菜的悠悠
2018-03-03 07:04 0 回复

多谢师傅,get到知识了


爱吃菠菜的悠悠
2018-03-03 07:02 0 回复

{version}???


hades
2018-02-27 11:15 0 回复

@三顿 如果你的回复对别人没有帮助,就不要回复了。


ADog
2018-02-27 03:54 0 回复

@wstart 懂了,谢谢师傅!


wstart
2018-02-27 03:19 0 回复

@ADog 反引号就是mysql里面标志符号的一个写法吧。。

这个在写sql语句中比较常见 。

主要是为了避免一些关键字的混淆。

比如你有一个表命名成 select

那么查询的语句就写成

select from select

那就很奇怪 。 所以加上

select
from select 这样子去区分一下。


wstart
2018-02-27 03:15 0 回复

@ADog

你说的这2个问题都是{}的衍生用法

{identifier expr} 说明了,第一个是标示符,第二个是表达式

1.and {`op} 的意思就是 表示标示符为空,后面直接拼接表达式
2 version length准确的写法是 {
version`length()} 也是 {identifier expr} 的用法 只是他的标识符写成了version而已。


wstart
2018-02-27 03:10 1 回复

@phithon =.= 肝谢大佬 。

主要是感觉 {} 这个语法特别奇怪 。。

不知道有啥用途。所以写了一下。

乌云那篇bypass也只是说了用法。

没深入说明这个用途。


phithon
2018-02-27 02:05 0 回复

@ADog 因为这些技巧基本以前社区都有说过,想起来就发一下


ADog
2018-02-27 01:59 0 回复

@phithon 谢p牛


ADog
2018-02-27 01:58 0 回复

文章写得很好,不过那篇文章有几个问题想请教师傅

1.and {``op}

这个是个什么意思呢,中括号和里面的反引号(区分保留字符?)是什么作用?

2.versionlength

这是个啥?在mysql手册里也没找到这函数。。

对这块研究不深,望师傅解惑~


phithon
2018-02-27 01:44 0 回复

心疼没赶上乌云社区的同学,可以多翻翻以前的文章

http://drops.xmd5.com/static/drops/tips-7883.html


目录