SQL Server应用程序中的高级SQL注入

2016-01-29 16:35 2 1 收藏

SQL Server应用程序中的高级SQL注入,SQL Server应用程序中的高级SQL注入

【 tulaoshi.com - SQLServer 】

 

摘要:
这份文档是详细讨论SQL注入技术,它适应于比较流行的IIS+ASP+SQLSERVER平台。它讨论了哪些SQL语句能通过各种各样的方法注入到应用程序中,并且记录与攻击相关的数据确认和数据库锁定。

这份文档的预期读者为与数据库通信的WEB程序的开发者和那些扮演审核WEB应用程序的安全专家。

介绍:
SQL是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。典型的执行语句是query,它能够收集比较有达标性的记录并返回一个单一的结果集。SQL语言可以修改数据库结构(数据定义语言)和操作数据库内容(数据操作语言)。在这份文档中,我们将特别讨论SQLSERVER所使用的Transact-SQL语言。
当一个攻击者能够通过往query中插入一系列的sql语句来操作数据写入到应用程序中去,我们管这种方法定义成SQL注入。

一个典型的SQL语句如下:
Select id,forename,surname from authors
这条语句将返回authors表中所有行的id,forename和surname列。这个结果可以被限制,例如:
Select id,forename,surname from authors where forename'john' and surname='smith'
需要着重指明的是字符串'john'和'smith'被单引号限制。明确的说,forename和surname字段是被用户提供的输入限制的,攻击者可以通过输入值来往这个查询中注入一些SQL语句,
如下:
Forename:jo'hn
Surname:smith
查询语句变为:
Select id,forename,surname from authors where forename='jo'hn' and surname='smith'
当数据库试图去执行这个查询时,它将返回如下错误:
Server:Msg 170, Level 15, State 1, Line 1
Line 1:Incorrect syntax near 'hn'
造成这种结果的原因是插入了.作为定界符的单引号。数据库尝试去执行'hn',但是失败。如果攻击者提供特别的输入如:
Forename:jo';drop table authors—
Surname:
结果是authors表被删除,造成这种结果的原因我们稍后再讲。

看上去好象通过从输入中去掉单引号或者通过某些方法避免它们都可以解决这个问题。这是可行的,但是用这种方法做解决方法会存在几个困难。第一,并不是所有用户提供的数据都是字符串。如果用户输入的是通过用户id来查询author,那我们的查询应该像这样:
Select id,forename,surname from authors where id=1234
在这种情况下,一个攻击者可以非常简单地在数字的结尾添加SQL语句,在其他版本的SQL语言中,使用各种各样的限定符号;在数据库管理系统JET引擎中,数据可以被使用'#'限定。第二,避免单引号尽管看上去可以,但是是没必要的,原因我们稍后再讲。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

我们更进一步地使用一个简单的ASP登陆页面来指出哪些能进入SQLSERVER数据库并且尝试鉴别进入一些虚构的应用程序的权限。
这是一个提交表单页的代码,让用户输入用户名和密码:
<HTML
<HEAD
<TITLELogin Page</TITLE
</HEAD

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

<BODY bgcolor='000000' text='cccccc'
<FONT Face='tahoma' color='cccccc'
<CENTER<H1Login</H1
<FORM action='process_loginasp' method=post
<TABLE
<TR<TDUsername:</TD<TD<INPUT type=text name=username size=100 width=100</TD</TR
<TR<TDPassword:</TD<TD<INPUT type=password name=password size=100 withd=100</TD</TR
</TABLE
<INPUT type=submit value='Submit'<INPUT type=reset value='Reset'
</FORM
</Font
</BODY
</HTML
下面是process_login.asp的代码,它是用来控制登陆的:
<HTML
<BODY bgcolor='000000' text='ffffff'
<FONT Face='tahoma' color='ffffff'
<STYLE
p { font-size=20pt ! important}
font { font-size=20pt ! important}
h1 { font-size=64pt ! important}
</STYLE
<%@LANGUAGE = JScript %
<%
function trace( str ) {
if( Request.form("debug") == "true" )
Response.write( str );
}
function Login( cn ) {
var username;
var password;
username = Request.form("username");
password = Request.form("password");
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'"; trace( "query: " + sql );
rso.open( sql, cn );
if (rso.EOF) {
rso.close();
%
<FONT Face='tahoma' color='cc0000'
<H1 <BR<BR
<CENTERACCESS DENIED</CENTER
</H1

来源:https://www.tulaoshi.com/n/20160129/1499012.html

延伸阅读
标签: SQLServer
本段文章节选自铁道出版社新出的《用BackOffice建立Intranet/Extranet应用》一书(现已在各书店有售。如海淀图书城、西单图书大厦等。外地或者需要送货上门的读者可以到www.wanbook.com.cn或www.e-bookshop.com.cn上在线购买。本书书号为ISBN7113039448)。本书详尽地讲述了如何使用微软BackOffice系列产品来组建Intranet/Extranet应用。通过它...
标签: Web开发
现在基于web的攻击一般都是注入。导致注入的原因一般为对变量的过滤不完全,从而可以使入侵者非法执行程序或查询修改任意数据。随着注入攻击的愈演愈烈,一些专门的过滤代码应运而生。但一些过滤代码的不完善很可能导致新的攻击。下面就以目前应用最广泛的过滤代码--SQL通用防注入程序为下列说明漏洞的成因、利用方法及防范措施。 SQL...
标签: SQLServer
本文说明为何应该了解数据库一致性检测(DBCC),还解释如何运行DBCC及应用它的五个扩展。 在危急时刻,数据库一致性检测(DBCC)可能是你最重要的工具。本文向你简单介绍DBCC的功能,它们包括: ◆检测表和相关目录的完整性。 ◆检测整个数据库。 ◆检测数据库页的完整性。 ◆重建任何指定表中的目录。 你为何需要学习DBCC 如...
标签: ASP
  调用数据库存储过程 <%Set Dataconn = Server.CreateObject("ADODB.Connection") '建立连接对象 Dataconn.Open "DSN=SinoTrans;SERVER=APP_SERVER;UID=sa;PWD=;APP=Microsoft(R) Developer Studio;WSID=APP_SERVER;Regional=Yes" Set cmdTemp = Server.CreateObject("ADODB.Command") '建立命令对象 ...
在我供职的公司不仅仅拥有Oracle数据库,同时还拥有SQL Server数据库,所以我经常遇见人们向我提两种问题。 第一种通常都是以"你能教我使用Oracle吗?"开始的,对此我比较礼貌的回答一般是"当然可以,实际上我正准备办个Oracle学习班;准备好之后我就叫你"。这是做好人的办法,我没有告诉询问者这可能花费我数周的精力。有时候我进一...