在《WAF攻防之SQL注入篇》中几个有意思的发现
群里发了一篇 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 字