发信人: onenightwithyou(小雕)
整理人: williamlong(2002-05-20 11:12:03), 站内信件
|
当今流行的网络数据库技术主要有三种:idc(互联网数据连接);rdo(远程数据对象);ado(高级数据对象)。
基于ado的数据库连接主要用在本地数据库操作上;基于rdo的数据库连接主要用在(asp)web 数据库上或vb的C/S数据库编程上。idc的是仅用于web数据库上。
关于asp+sql的侵入网上有很多经典教程,在本论坛里也有很多精辟的见解。我主要想说说idc数据库的原理,拓宽一下思路,大家一起来看看idc数据库连接有没有什么可以利用的地方。
先讲讲idc的工作原理:
一个典型的idc数据库操作(以下由查询为例加以介绍)是由以下几个文件构成的:
htm文件:用于和用户的交互,取得查询操作的信息。
idc文件:含有有odbc数据源及sql语句等信息的文本文件。httpodbc.dll将idc查询参数通过odbc数据源得到一个查询结果,并将此结果传递到模板文件(.htx)。
htx文件:模板文件,由html语句及含有查询结果的一系列变量组成。它向用户显示查询结果。
很明显基于idc技术的数据库连接和asp有很大不同,就是他不单纯由iis来控制整个操作。而是加上了httpodbc.dll来对idc文件进行解析。
一个search.idc文件实例:
括号为注释内容
Datasource:Ex1 (odbc数据源的名称,通过控制面板中的odbc数据源来添加)
Username:sa (用户名)
Password: (口令)
Template:search.htx(查询结果输入那个模板文件)
SQLStatement:(sql语句,下面是详细内容,可以分段,但要用+号连接)
+SELECT name,age, sex, phone
+from people
+where name='%txtname%' ('%txtname%'即是从htm文件中获得的查询参数)
按照正常的攻击思路应该是在提交txtname这个参数时加入进攻的语句如:
http://127.0.0.1/scripts/search.idc?txtname=aa';exec master.dbo.xp_cmdshell "net user onenight onenight/add"
可是这时httpodbc返回的内容是检索到0个记录(假设系统有aa这个记录)。怎么会有这种现象发生?首先让我们看看经过httpodbc解码后返回的txtname内容吧:
aa'';exec master.dbo.xp_cmdshell "net user wjd wjd/add"
请注意:aa'已经变成了aa''
按照我的理解此时如果a'变成了a''sql server应该提示错误才对,可sql提示的却是找到0个记录。看来另有蹊跷。打开sql.log分析以下刚才的查询:
inetinfo 28c-2b8 ENTER SQLExecDirect
HSTMT 015F25E0
UCHAR * 0x00B5ECE0 [ 117] " SELECT NAME,AGE, SEX, PHONE, email from people where name='aa'';exec master.dbo.xp_cmdshell "net user onenight onenight/add"'"
SDWORD 117
inetinfo 28c-2b8 EXIT SQLExecDirect with return code 0 (SQL_SUCCESS)
HSTMT 015F25E0
UCHAR * 0x00B5ECE0 [ 117] " SELECT NAME,AGE, SEX, PHONE, email from people where name='aa'';exec master.dbo.xp_cmdshell "net user onenight onenight/add"'"
SDWORD 117
其中inetinfo说明连接的对象是iis。return code 0说明前面的 ENTER SQLExecDirect 的语句执行成功。将sql语句剥离出来分析:
SELECT NAME,AGE, SEX, PHONE, email from people where name='aa'';exec master.dbo.xp_cmdshell "net user onenight onenight /add"'
接合iis返回的信息我们可以分析出httpodbc.dll 做了什么工作:
它将凡是有单引号的地方再重复一次单引号,由此保证了整个字符串单引号的完整性进而逃脱了攻击。
|
|