前言:
最近在做毕业设计, 一同学问我asp做的站应该注意哪些安全问题, 我纳闷了好久, 我自己都没考虑这个问题的, 哎, 这同学也太认真了!想一想大家努力学习了html, javascript, asp后, 是不是都想自己做个个人主页挂到网上呢, 是不是搞了半天就做了几个页面出来了, 最后还是到网上找一有后台的改改, 挂网上去了。 这下就应该注意一下常见的安全漏洞了, 虽然都比较老, 可是新手根本不知道有这回事所以老犯这个错误的。 于是根据自己以前改别人系统的经验, 总结了下, 也算是对他的交代, 嘿嘿, 新手进来, 菜鸟飘过, 还是那句话。 自己不知道, 并不表示不存在!下面以我改的主页来说明下!
1爆库
原理:
"%5c"暴库法, 它不是网页本身的漏洞, 而是利用了iis解码方式中的一个特性, 如果iis安全设置不周全, 而网页设计者未考虑IIS错误, 就会被人利用。 为何要用"%5c"?它实际上是"\"的十六进制代码, 也就是"\"的另一种表示法。 当我们把"/"换成十六进制写法"%5c"时, ie不会对此进行转换。 地址中的"%5c"被原样提交了.当iis收到后解析时, 又会将%5c还原成"\",所有调用数据库的连接文件中都有Server.MapPath方法的作用是将网站中的相对路径转变成物理上的绝对路径。 为何要这样?因为连接数据库时, 须指明它的绝对路径。
也就是说网址目录只表示从根目录起的相对位置。 当Server.MapPath方法将相对路径转为真实路径时, 它实际是三部分路径加在一起得到真实路径的:网页目前执行时所在的相对路径, 也就是从网站物理根目录起的相对路径, 设置过iis的人都会知道, 每一个网站, 都必须指定它在硬盘上的物理目录, Server.MapPath方法正是通过把"网站根目录的物理地址+完整的相对路径", 从而得到真实的物理路径。 在这里, IIS以"\"表示真实路径的目录关系, 而以"/"表示虚拟路径, 这可能就是IE会自动把我们地址中的"\"转为"/"的原因, 在iis中, "/"和"\"代表着不同的意义, 遇到了"\"时, 认为它已到了根目录所在的物理路径, 不再往上解析, 而这个路径是不存在的, 数据库连接当然会失败, 于是IIS会报错, 并给出错误原因。
我们只有在数据库相对地址和它的目录绝对地址之间使用"\"("%5c"), 才能达到目的。 即是在最右边第一个/处使用%5c成功可能性是最大的.
conn.asp(数据库连接文件)暴库大法, 如果说第一种暴库法是利用了绝对路径出错, 那么, 这种暴库法就是利用了相对路径出错。 一般来说, 只要conn.asp不在根目录的系统, 而调用文件在根目录, 就会出现这种问题。 当然这种说法也是经验性的, 准确的说就是, conn.asp与调用它的文件, 如果相对位置改变了, 就会报错, 暴出数据库路径。
利用:
下面是我自己的电脑上测试:访问
http://localhost/198816/index.asp, 正常访问,
然后将url改成http://localhost/198816%5cindex.asp, 出现如下错误:
Microsoft JET Database Engine (0x80004005)
找不到文件 'E:\10\data.mdb'。
/data.asp, 第 11 行
看这里爆库出现了, 得到了数据库名字和路径;
我们可以将其下载,
在ie输入http://localhost/198816/data.mdb, 出现下载页面。
下载了数据库之后, 如果数据库有密码, 使用access密码破解器, 不要几秒就可以得到密码, 下面就可以浏览所有数据库的内容了, 一般后台密码都是MD5加密的, 可以直接上MD5网站破解出来!如果无法查询到, 那就是运气问题了, 如果你肉鸡够好够多, 那就慢慢暴力破解吧!不过暴力破解好象没有谁会这样做!
Conn爆库也类似!
防范方法:
在数据库连接文件中加入容错语句即可, 我在data.asp的开头加入了,
On Error Resume Next
再在结尾加入错误处理语句,
If Err Then
err.Clear
Set Conn = Nothing
Response.Write "fuck!"
Response.End
End If
现在再去爆库, 你发现页面只输出了fuck!爆库不成功!
下面我们说说即使存在爆库, 在别人知道你数据库路径的情况下, 别人也无法下载你的数据库!
2数据库安全
asp结合access数据库是最常见的, access数据库最大的缺点就是容易被搜索到, 然后被下载, 而暴露帐号和密码, 防止数据库被下载的常见方法有如下几种, 如果你有更好的方法请告诉我。 我也是菜鸟·~~~~:
1. 将数据库改成自己都无法记住的BT名字。 这种方法对爆库没用, 而且使用google也有可能搜到数据库路径。
2. 在数据库名字中加#号或者%24=$等特区字符, 利用URL编码特性防止下载。
3. 去掉后缀, 不要扩展名, 系统有可以解析成路径, 从而无法下载, 当然XP下测试是可以下载的, 我的格式是fat32。 其他系统没测试, 有人测试了告诉我下, 谢谢!
4. 加系统文件的后缀, 如后缀改为.db, .temp等。 听说系统是不允许下载这些后缀的文件的!
5. 在数据库中建立一个nodown的表, 建立一个字段数据类型选择ole对象。
6. 网络上最常见的方法是, 把数据库后缀改为asp等系统可以解析的后缀。
第6个是网络上使用的最多的方法, 但是也不是完美的, 如果别人可以通过留言等其他方法向数据库提交数据, 那就危险了, 如果别人提交<%execute(request("a"))%>到数据库, 那么访问数据库就可以执行了此语句, 这样可以执行提交的任意代码。
当然这个也是可以消除的, 我们可以通过在ole对象中加入如<%loop <%loop <%1=2<%2=1这样的语句, 让asp出错来防止下载。 实现这种效果我采用两种方法实现过, 一.
建立一个nodown的表, nodown的字段, 类型选择ole对象, 然后建立一个文本文件。 里面的内容为<%loop <%loop <%1=2<%2=1, 然后打开nodown表, 选择nodown字段, 右击选择插入对象, 选择由文件创建, 浏览对位到刚才建立的文本文件, 加入nodown表中, 然后把数据库改为asp后缀, 在访问, 发现出现如下错误:
Active Server Pages, ASP 0116 (0x80004005)
Script 块缺少脚本关闭标记(% >)。
/198816/dataasp.asp, 第 577 行
说明成功实现。 这里nodown表一定要在其他表的前面, 注意了!(我也不知道需要不需要)。
二.
使用asp代码, 向数据库中增加nodown的表和字段, 代码如下:
<%
db="data.mdb" ‘这里改成数据库的地址
Set conn = Server.CreateObject("ADODB.Connection")
constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"")
conn.Open constr
conn.execute(“create table nodown(notdown oleobject)”)
set rs=server.createobject(“adodb.recordset”)
sql=”select * from nodown”
rs.open sql,conn,1,3
rs.addnew
rs(“nodown”).appendchunk(chrB(asc(“<”))&chrB(asc(“%”)))
rs.update
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
网上的方法还有很多, 大体就这两种, 我就不重复了。 这里还有一点数据库的问题, 就是删除掉大量数据后, 数据库大小并没有改变, 这里只要使用工具-〉数据库实用工具-〉压缩和修复数据库, 就可以了!
我的设置如下:
密码设置复杂点, 并且MD5加密, 使用第一种方法加入nodwon表和字段, 数据库后缀改为asp, 名字改为%24#$%da#%ta@##%conn#.asp.
我觉得对于个人主页来说, 已经比较安全了, 但是安全不是绝对的.
3万能密码
这个就是传说中的'or'='or'了, 虽然危害很大, 可直接饶过后台验证, 进入后台, 但是确实是到处可见。
原理:
如都输入'or'='or'则如下语句为真,
sql="select * from admin where adminname='"&request.form("adminname)&"' and adminpass='"&request.form("adminpass")&"'"变成了
sql="select * from admin where adminname=”or'='or” and adminpass=”or'='or”
从而返回真, 跳过认证。
利用:
后台帐号和密码都或使用一下一种:
1:"or "a"="a
2: ')or('a'='a
3:or 1=1--
4:'or 1=1--
5:a'or' 1=1--
6:"or 1=1--
7:'or'a'='a
8:"or"="a'='a
9:'or''='
10:'or'='or'
11:最短的万能登陆密码 'or'1
12:'or 1 or'或'or''=''or'
还有其他很多!
防范:
有方法是过滤掉单引号, 好象其他数据库里面还要过滤到单引号的其他编码。 如:
dim name,Pass
name=replace(trim(request.Form("name")),"'","")
Pass=md5(replace(trim(request.form("Pass")),"'",""))
我的登陆验证还采用了,
ivcode=trim(request.form("ivcode")), ivcode是写在配置asp文件中的变量, 这样安全更好了, 即使知道密码, 存在这个漏洞, 不知道定义的ivcode值, 一样无法登陆后台!
4上传
上传这个漏洞比较难以理解, 也许大家是多抓包, 改包, nc上传不太熟悉, 多练习几次就可以了。 个人主页中有可以会用到上传各种文件, 如rar, gif, swf, 等这样必须为这些文件分类存放, 这样在上传时选择上传类型, 传递想对类型的路径给上传页面, 大家是不是都很熟悉, 呵呵, 其实这样就形成了上传漏洞了!
原理:
一、 FilePath.此为变量, 为上传页面传递到保存页面的变量, 这里我们就可以修改其值该为asp□, 然后利用服务器在读取这段变量时, 因为“□”是二进制的00, 服务器认为该变量语句已经结束了, 于是“□”后面的字符也就被忽略掉了, 这样一来, 上传的文件就保存为了asp后缀了。
二、FileName.这里指可以上传修改了后缀为aaspsp ccerer等类型的asp文件, 而饶过过滤和认证.得到shell., 还有通过很多方法饶过认证。 还是那句话, 我们不知道的并不表示不存在。
利用:
可以采取用WinSock抓包, 然后用记事本保存提交数据并增加、修改相关内容, 再用WinHex修改空格为二进制, 最后用NC提交.建议使用上传工具直接上传!免的修改包的麻烦!
防范:
一. 路径定义为常量.
二. 过滤服务器可以解吸的文件类型, 并且检测到上传危险文件则停止上传, 并且定义只可以上传的类型!
5注入
首先我们在IE的“Internet选项→高级”中有一个“显示友好HTTP错误信息”的选项, 取消前面的钩。 这样才可以显示注入!SQL注入的漏洞通常是由于程序员对它不了解, 设计程序时某个参数过滤不严格所致。 通常通过在如show.asp?id=79后加单引号, 如果出错则初步认定存在注入, 然后加and 1=1 ;and 1=2, 这里分辨两次提交的页面有不同没?如果有不同则判定存在漏洞!当然也有字符型和搜索型的, 原理都差不多。 网上说的太多了, 我就不重复了, 防范也一般网上都有防范注入的代码, 下过来, 包含到需要放注入的页面即可!
6跨站
一般都是带有象JAVAScript等这类脚本代码, 这样在服务里一旦被执行就形成了所谓的跨站攻击了。 一般来说对于人机交互行比较高的程序, 比如论坛, 留言版这类程序都比较容易存在跨站script攻击。 所谓跨站脚本漏洞其实就是Html的注入问题, 恶意用户的输入没有经过严格的控制进入了数据库最终显示给来访的用户, 导致可以在来访用户的浏览器里以浏览用户的身份执行HTml代码.如<script>alert(’xss’)</script> <img class='lazy' data-original="javascript:alert(/xss/)" width=100>, 这样的代码如果过滤的不是很好的话, 直接放入数据库, 再在浏览器里显示出来, 就构成了跨站。 个人主页用的最多的是自己写的留言本了, 这里如果不加任何的过滤就直接放入数据库, 那么就构成了跨站, 通过<iframe src=”马地址”>就可以直接挂马!
防堵跨站漏洞, 阻止攻击者利用在被攻击网站上发布跨站攻击语句, 不可以信任用户提交的任何内容, 首先代码里对用户输入的地方和变量都需要仔细检查长度和对”<”,”>”,”;”,”’”等字符做过滤;其次任何内容写到页面之前都必须加以encode, 避免不小心把html tag弄出来。 这一个层面做好, 至少可以堵住超过一半的XSS攻击。 所以防范数据的转换和过滤是可以在3个地方进行转换的, 在接受数据的时候可以转换下, 在进入数据库的时候可以转换下, 在输出数据的时候也可以转换下.所以我们写留言本的时候, 建议所有数据直接通过htmlencode转化再放入数据库, 这样就万无一失了.
7session安全
在计算机专业术语中, Session是指一个终端用户与交互系统进行通信的时间间隔, 通常指从注册进入系统到注销退出系统之间所经过的时间。 具体到Web中的Session指的就是用户在浏览某个网站时, 从进入网站到浏览器关闭所经过的这段时间, 也就是用户浏览这个网站所花费的时间。 因此从上述的定义中我们可以看到, Session实际上是一个特定的时间概念。 一般来说, 后台管理员在登录页面输入账号密码后, 程序会拿着他提交的用户名密码去数据库的管理员表里面找, 如果有这个人的账号密码就认为你是管理员, 然后给你一个表示你身份的Session值;或者程序先把你的用户名密码提取出来, 然后到数据库的管理员表里面取出管理员的账号密码来和你提交的相比较, 如果相等, 就跟上面一样给你个表示你身份的Sesion值。 然后你进入任何一个管理页面它都要首先验证你的Session值, 如果是管理员就让你通过, 不是的话就引导你回到登录页面或者出现一些奇奇怪怪的警告, 这些都跟程序员的个人喜好有关。 个人主页很少使用cookie验证了吧?因为session验证比较安全, 也比较方便。 但是session也可以欺骗的, 只是局限性比较大。
我们自己写的个人主页后台这里最需要注意的就是session的安全了, 每个页面都要加上判断是否存在session的语句, 最好是把这个放到一个页面, 在后台每个页面都连接进来, 或则出现直接输入后台页面就可以操作后台, 那就后台的验证白做了!这里要最要注意的就是上传页面的验证了。 一定要判断session验证了没, 否则别人直接输入上传页面就可以直接上传文件, 那你就等着中马吧!
后记:
asp个人主页安全的一些问题基本都提到了, 对我们自己写一个自己的主页以及修改别人的系统已经足够了, 但
……