当前位置:  数据库>sqlserver
本页文章导读:
    ▪SQL注入攻击      SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分.........
    ▪对于索引假脱机的一点理解      对于索引假脱机的一点理解在SQLSERVER执行计划里不知道大家有没有看过“索引假脱机”这个运算符在QQ群里综合了各位大侠的解释:假脱机 有索引假脱机 和 表假脱机两种先来运行一下.........
    ▪MS Sql Server分页存储过程以及C#调用      前面把Oracle的分页存储过程写了,这里也贴出MS SQL Server的分页存储过程,不过这个存储过程的灵活性没有Oracle那个强,大家如果有好的建议或者方法,记得留言哦闲话不扯了,贴代码:1、存.........

[1]SQL注入攻击
    来源:    发布时间: 2013-10-29

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。

 

  SQL注入攻击的总体思路

 

  ·发现SQL注入位置;

 

  ·判断后台数据库类型;

 

  ·确定XP_CMDSHELL可执行情况

 

  ·发现WEB虚拟目录

 

  ·上传ASP木马;

 

  ·得到管理员权限;

 

  SQL注入攻击的步骤

 

  一、SQL注入漏洞的判断

 

  一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。

 

  为了全面了解动态网页回答的信息,首选请调整IE的配置。把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。

 

  为了把问题说明清楚,以下以HTTP://xxx.xxx.xxx/abc.asp?p=YY为例进行分析,YY可能是整型,也有可能是字符串。

 

  1、整型参数的判断

 

  当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:

 

  select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。

 

  ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了

 

  select * from 表名 where 字段=YY’,abc.asp运行异常;

 

  ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

 

  ③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常;

 

  如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

 

  2、字符串型参数的判断

 

  当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:

 

  select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。

 

  ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了

 

  select * from 表名 where 字段=YY’,abc.asp运行异常;

 

  ②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='1', abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

 

  ③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='2', abc.asp运行异常;

 

  如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

 

  3、特殊情况的处理

 

  有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。

 

  ①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;

 

  ②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;

 

  ③ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如U=chr(85),a=chr(97)等,ASCII信息参见附件二;

 

  二、分析数据库服务器类型

 

  一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的攻击方法,必须要区别对待。

 

  1、 利用数据库服务器的系统变量进行区分

 

  SQL-SERVER有user,db_name()等系统变量,利用这些系统值不仅可以判断SQL-SERVER,而且还可以得到大量有用信息。如:

 

  ① HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前连接到数据库的用户名

 

  ②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n ... db_name()>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前正在使用的数据库名;

 

  2、利用系统表

 

  ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects,在WEB环境下有访问权限。对于以下两条语句:

 

  ①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0

 

  ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0

 

  若数据库是SQL-SERVE,则第一条,abc.asp一定运行正常,第二条则异常;若是ACCESS则两条都会异常。

 

  3、 MSSQL三个关键系统表

 

  sysdatabases系统表:Microsoft SQL Server 上的每个数据库在表中占一行。最初安装 SQL Server 时,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。 这个表保存在master数据库中,这个表中保存的是什么信息呢?这个非常重要。他是 保存了所有的库名,以及库的ID和一些相关信息。

 

  这里我把对于我们有用的字段名称和相关说明给大家列出来。name //表示库的名字。

 

  dbid //表示库的ID,dbid从1到5是系统的。分别是:master、model、msdb、mssqlweb、tempdb 这五个库。用select * from master.dbo.sysdatabases 就可以查询出所有的库名。

 

  Sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。

 

  syscolumns:每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。主要字段有:

 

  name ,id, colid :分别是字段名称,表ID号,字段ID号,其中的 ID 是 刚上我们用sysobjects得到的表的ID号。

 

  用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD这个库中,表的ID是123456789中的所有字段列表。

 

  三、确定XP_CMDSHELL可执行情况

 

  若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,

    
[2]对于索引假脱机的一点理解
    来源:    发布时间: 2013-10-29
对于索引假脱机的一点理解

在SQLSERVER执行计划里不知道大家有没有看过“索引假脱机”这个运算符


在QQ群里综合了各位大侠的解释:假脱机 有索引假脱机 和 表假脱机两种


先来运行一下下面的SQL代码:



 1 USE [tempdb]
2 GO
3 create table #tb(aa int,bb char(1))
4 GO
5 insert #tb values(1,'A')
6 insert #tb values(1,'B')
7 insert #tb values(1,'C')
8 insert #tb values(1,'D')
9
10 insert #tb values(2,'E')
11 insert #tb values(2,'F')
12 insert #tb values(2,'G')
13 insert #tb values(2,'H')
14
15 insert #tb values(3,'I')
16 insert #tb values(3,'J')
17 insert #tb values(3,'K')
18 insert #tb values(3,'L')



 1  --SQL1
2 SELECT * FROM #tb a
3 WHERE bb IN
4 (
5 SELECT TOP 1 bb FROM #tb
6 WHERE aa=a.aa
7 ORDER BY NEWID()
8 )
9
10 --SQL2
11 SELECT * FROM #tb a
12 WHERE bb =
13 (
14 SELECT TOP 1 bb FROM #tb
15 WHERE aa=a.aa
16 ORDER BY NEWID()
17 )
18
19 --drop table tb


你会发现SQL1的执行计划和SQL2的执行计划很不一样
SQL1的执行计划



SQL2的执行计划



对于执行计划的解释,MSDN论坛里面的邹建大侠说:



1 据楼主的语句, 第一个使用的是IN, 所以IN 里面的, 被查询优化器判定为 subquery (子查询)
2
3 而第二个使用的是 =, 所以查询优化器判定 = 后面的是一个表达式
4
5 因此在判定查询方法的时候, 产生了差异, 对于查询, 查询优化器认为具有不确定性, 所以每条记录都要去执行一次子查询; 而对于表达式, 查询优化器认为它具有确定性, 所以对于每个 aa, 计算一次就行了
6
7
    
[3]MS Sql Server分页存储过程以及C#调用
    来源:    发布时间: 2013-10-29

前面把Oracle的分页存储过程写了,这里也贴出MS SQL Server的分页存储过程,不过这个存储过程的灵活性没有Oracle那个强,大家如果有好的建议或者方法,记得留言哦

闲话不扯了,贴代码:

1、存储过程:

Create or procedure AspNetPage
@tblName varchar(1000), -- 表名
@SelectFieldName varchar(4000), -- 要显示的字段名(不要加select)
@strWhere varchar(4000), -- 查询条件(注意: 不要加 where)
@OrderFieldName varchar(255), -- 排序索引字段名
@PageSize int , -- 页大小
@PageIndex int = 1, -- 页码
@iRowCount int output, -- 返回记录总数
@OrderType bit = 0 -- 设置排序类型, 非 0 值则降序

AS
declare @strSQL varchar(4000) -- 主语句
declare @strTmp varchar(4000) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
declare @strRowCount nvarchar(4000) -- 用于查询记录总数的语句
set @OrderFieldName=ltrim(rtrim(@OrderFieldName))
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @OrderFieldName +' desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @OrderFieldName +' asc'
end
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @OrderFieldName + ' from ' + @tblName + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @OrderFieldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + @strTmp + ' ' + @strOrder
end
exec(@strSQL)
if @strWhere!=''
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName+' where '+@strWhere
end
else
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName
end
exec sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount out

2、C#调用:

/// <summary>
/// 分页数据
/// </summary>
/// <param name="TableName">表明</param>
/// <param name="RetureFields">返回字段</param>
/// <param name="strWhere">条件</param>
/// <param name="PageSize">每页记录数</param>
/// <param name="CurPage">当前页数</param>
/// <param name="RowCount">总记录数</param>
/// <param name="sortField">排序字段</param>
/// <returns></returns>
public static DataTable GetPageList(string TableName, string RetureFields, string strWhere, int PageSize, int CurPage, out int RowCount, string sortField)
{
SqlCommand cmd = new SqlCommand("AspNetPage");//存储过程名称
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@tblName", TableName);//表名称
cmd.Parameters.AddWithValue("@OrderFieldName", sortField);//排序索引字段名
cmd.Parameters.AddWithValue("@PageIndex", CurPage);//当前第几页,页码
cmd.Parameters.AddWithValue("@PageSize", PageSize);//每页显示的数据条数
cmd.Parameters.AddWithValue("@SelectFieldName", RetureFields);//要显示的字段名(不要加Select)
cmd.Parameters.AddWithValue("@OrderType", 1);//设置排序类型,非0值则降序
cmd.Parameters.AddWithValue("@strWhere", strWhere);//查询条件,不要加where
cmd.Parameters.Add(new SqlParameter("@iRowCount", SqlDbType.Int));
cmd.Parameters["@iRowCount"].Direction = ParameterDirection.Output;
DataTable dt = RunProcedureCmd(cmd);
RowCount = Convert.ToInt32(cmd.Parameters["@iRowCount"].Value.ToString());//返回的总页数
return dt;
}

/// <summary>
/// 执行存储过程,返回DataTable
/// </summary>
/// <param name="cmd"></param>
/// <returns></returns>
public static DataTable RunProcedureCmd(SqlCommand cmd)
{
DataTable result = new DataTable();
SqlConnection conn = new SqlConnection(ConnectionString);//你自己的链接字符串
try
{
if ((conn.State == ConnectionState.Closed))
{
conn.Open();
}
cmd.Connection = conn;
WriteLog(cmd.CommandText);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(result);
da.Dispose();
conn.Close();
conn.Dispose();

return result;
}
catch (Exception ex)
{
conn.Close();
conn.Dispose();
throw ex;
}
}

OK搞定,勿喷!

本文链接


    
最新技术文章:
▪Sql Server里删除数据表中重复记录的例子
▪如何查看SQLSERVER中某个查询用了多少TempDB空间...
▪在SQL Server中使用ISNULL执行空值判断查询
▪揭秘SQL Server 2014有哪些新特性(1)-内存数据库
▪揭秘SQL Server 2014有哪些新特性(2)-固态硬盘 Buff...
▪揭秘SQL Server 2014有哪些新特性(3)-可更新列存...
▪揭秘SQL Server 2014有哪些新特性(4)-原生备份加...
▪解决SqlServer 各版本 sa帐户不能登录问题
▪浅析SQL Server中包含事务的存储过程
▪深入分析MSSQL数据库中事务隔离级别和锁机制
▪SQL优化技巧指南
▪人工智能自动sql优化工具--SQLTuning for SQL Server
▪使用 TOP 子句限制UPDATE 语句更新的数据
▪sql server动态存储过程按日期保存数据示例
▪SQLServer用存储过程实现插入更新数据示例
▪SqlServer中tempdb的日志机制原理解析及示例分享...
▪SqlServer数据库提示 “tempdb” 的日志已满 问题...
▪浅谈tempdb在SqlServer系统中的重要作用
▪SqlServer提示“列前缀tempdb.无效: 未指定表名”...
▪SQL命令优化需要记住的9点事项
▪教你如何看懂SQL Server查询计划
▪sql server 2000数据库备份还原的图文教程
▪SqlServer2012中First_Value函数简单分析
▪sql语句中单引号嵌套问题(一定要避免直接嵌...
▪谈谈sqlserver自定义函数与存储过程的区别
▪SQL SERVER使用REPLACE将某一列字段中的某个值替...
▪总结一周内学习的Sql经验(一)
▪sql存储过程详解
▪SQL Server UPDATE语句的用法详解
▪MSSQL事务的存储过程
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3