找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 729|回复: 0

Asp程序漏洞实例解析

[复制链接]

34

主题

43

回帖

119

牛毛

一级牛人

积分
119
发表于 2009-7-31 09:44:34 | 显示全部楼层 |阅读模式 来自 黑龙江省哈尔滨市
Asp程序设计中由于程序员本身疏忽而造成的漏洞很多,其中还包括许多网上有
名的一些程序,下面通过2个实例来讲解一下常用漏洞的利用和解决方法!
一)一个小型电子商务网站
一个朋友应邀为一个小区写了一个asp的购物网站,网站功能为在线注册用户资
料,网上报价,网上订购,货到付款。由于只是为一个小区内服务,程序不是
很大,为了安全,觉定不采用网上免费的电子商务程序,而是自己写一个,工
作量不是很大,完成之后,便叫我过去测试一下安全性能。
下面是我检测过程,请看一下我的检测思路,相信对以后从事编程工作有一定
的帮助!
登陆网站后,感觉页面美工挺好,网站主要部分是会员注册,热卖商品,特价
商品展示,由于是货到付款,所以要求用户注册详细的个人资料,于是我便注
册了一个用户名:netone,密码为cexo,登陆成功后,首页上显示:“netone
,欢迎您的到来,您有一封新的短消息。”进入短消息后有站长的一个欢迎信
。好,开始检测!
1.一般asp程序设计中用户名和密码验证的sql语句为:
mysql="select * from user where userid=’”&userid&”’ and pwd=‘”
&pwd&” "
这里就有一个特殊字符过滤的问题,如果采用特殊字符如netone’ or ‘1就已
经跳过了密码限制,sql语句变为:
mysql="select * from user where userid=netone or ‘1’ and pwd=‘”
&pwd&” "
众所周知,程序对or 后面的语句只要有一个为真就不进行比较而直接认为整个
语句为真,解决办法:这个是一个很早的漏洞了,网上的程序一般都没有了这
个漏洞,但如果编程者一不小心很容易犯这个错误,其实只要在表格提交语句
userid = Trim(Request("userid"))改为userid=replace(trim(request
("userid")),"'","‘"),即把特殊字符’用空格代替了!
没想到我这位朋友居然也出现这种错误,用netone’ or ‘1 居然成功登陆,
而且首页上出现“netone’or ‘1,欢迎您的到来,您有9封新的短消息。”一
看短消息,居然所有的短消息全部列了出来,看来是用户名出现混乱导致。其
中一个短消息是我朋友发给另外的一个管理员的,告诉他管理页面在“goadmin
”,而且在短消息中写出了用户名和密码,赶紧进入管理页面,可以添加商品
,添加公告,查看用户资料,还看见有3个管理员,但密码是用*号表示,怎么
办?很简单,在浏览器上点查看原代码,在密码行出的代码如下<input
type="hidden" name="pass" value="admin">这个value就是密码了,赶紧把3
个管理员帐号和密码记下,好了,到了这一步,赶紧通知我朋友,他到也改的
快,马上就改动完毕,接着测试把!
2.改了之后,用netone’ or ‘1进入不了,怎么办?再进入管理页面,管理
员帐号和密码都改了,刚才的密码白看了,再联想到用netone’ or ‘1进入后
出现的短消息混乱的情况可以推测,短消息显示页面肯定也存在问题。短消息
页面是user_sms.asp,而显示某条消息的页面为user_sms_show.asp?id=?,在未
登陆情况下,输入user_sms.asp,系统提示尚未登陆,看来这个页面还是设置
了session来限制非法访问,于是用netone登陆,查看我的短消息的页面为
user_sms_show.asp?id=7,我试着把id=7改为别的数字,居然也进入了,这说明
,user_sms_show.asp这个页面只是简单的用sessiong来查看对方是否登陆,而
不去查看短消息是否是发给此用户,所以可以造成越权查看别人的短消息。而
正好此时我朋友也是通过发短信给另外2个管理员,通知他们更改后的用户名和
密码,而且由于注册会员很少,我一个一个短消息测试,查到了发给其他管理
员的短消息,从而成功的有搞到了用户名和密码!
解决办法:给每一个用户设置一个识别符,然后短消息传送时,既要鉴定
session是否登陆成功,还要查看每条短消息的id与用户识别码是否符合。同样
通知我朋友更改一下,但他嫌更改麻烦,干脆把短消息功能去掉!也好,那接
着下一步把!
3.又在整个网站看了一遍,感觉别的漏洞的话基本上没有了,因为这本来就是
一个小型的电子商务程序,本身页面就比较少,在就是程序的数据库泄露的问
题了,由于采用access作为数据库,而数据库文件可能被非法下载,那就测试
一下他的数据库把,如何知道他的数据库的位置了?一般的是有一个专用目录
的来存放的,既然要检测当然就要有耐心,一个个试吧,输入/data/,返回的
信息显示,file not found,这说明没有这个目录,接着看,/database/,不对
,/datas/,/databases/,均不对,再看看他的网站名称,由于是一个购物网站
,名称为qgo,所以猜测数据库可能在/qgodata/下,在浏览器下输入,返回:“
你无权查看该页字样”,这说明此目录存在,判断正确,但还是不知道具体是
什么文件呀?又忙了半天,想到asp中一般将数据库连接方式保存为一个文件,
而这个文件一般以inc结尾,或者保存在一个inc文件夹中,一般是conn.inc文
件,而这个文件是可以读出来的,从而有可能泄露数据库文件甚至管理员密码
。我于是接着测试,终于找到conn.inc文件位于inc子目录,输入
\inc\conn.inc后,浏览器没有返回任何信息,说明文件存在,赶紧用flashget
下载,打开,数据库文件为/qgodata/qgaodata.mdb,下载打开,全部记录都在
,包括所有用户资料,管理员密码。
解决方法:把inc文件改为asp后缀,同时把数据库文件也改为asp后缀,同时更
改连接文件中的语句!
测试到现在为止,这个程序基本上一般的漏洞都存在,很具有普遍性!到现在
为止,我们已经找到很多漏洞并成功修补!
二)一个免费空间提供程序的漏洞
主页提供的话更是一个大问题,除了程序设计问题,还牵涉到管理员权限分配
的问题,尤其是windows下提供空间,如果开放asp权限,更要注意安全问题,
下面是一个网上常见的免费asp空间提供程序,分析一下其安全性能。
该程序提供在线注册,web上传方式,我在我自己的机器上开了个iis进行测试
,发现注册完毕后登陆进入/os/default.asp界面,在这个页面,可以对已有文
件编辑,删除,另外还可以web上传文件,在这些操作中,浏览器的地址栏始终
是显示的是default.asp,但肯定中间操作调用其他文件,细心一看,比如在对
某个文件进行编辑时候,点击编辑图标是浏览器的状态栏显示edit.asp?
filename=d:\home\homepage\netone\index.htm&task=read,这就出现了一个漏
洞,泄露了物理路径,而且通过这种方法发现总的文件调用是用files.asp?
sPath=D:\home\homepage\netone,形式,在浏览器下输入此地址,则列出了此
目录下文件名,同时还有编辑文件,上传文件的页面,更大的漏洞是,把后面
的地址改为d:\home居然也显示出来了 home下的文件夹,接着又改为c:\,d:\,
全部列举出来了,然后退出来,再输入files.asp或是edit.asp,均出现了出错
页面,说明这2个文件对登陆进行了限制,但是输入完整的路径,如edit.asp?
filename=d:\home\homepage\netone\index.htm&task=read或是files.asp?
sPath=D:\home1\homepage\netone\居然不报错,直接进入,看来这2个文件对
登陆限制有很大的问题。
解决方法:在浏览器下进入操作界面后自动的在地址栏下隐藏了实际的url,但
状态栏中全部显示了,所以第一个办法是不让状态栏显示,可以用javascrip特
效来使状态栏显示特定字符如欢迎等,一个简单的代码如下:
<script language="JavaScript">
var msg = "欢迎光临! " ;
var interval = 120
var spacelen = 120;
var space10=" ";
var seq=0;
function Scroll() {
len = msg.length;
window.status = msg.substring(0, seq+1);
seq++;
if ( seq >= len ) {
seq = 0;
window.status = '';
window.setTimeout("Scroll();", interval );
}
else
window.setTimeout("Scroll();", interval );
}
Scroll();
</script>
但这样是解决不了根本问题,关键是files.asp和edit.asp要对用户登陆进行验
证,同时要验证url中的输入字符,或者不允许从外部递交url,从而限制提交的
url中出现d:\,或e:\
设置一个检查函数function ChkPost()
dim server_v1,server_v2
chkpost=false
server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
chkpost=false
else
chkpost=true
end if
end function
这个函数即可有效的检查对方提交的url是否来自外部!
通过2个例子可以看出,程序设计过程中的重要性。web程序设计其实是个很大
的问题,同时也是个很容易忽视的问题,对于这样的漏洞,不是打上一两个补
丁就能完事,而要在实际过程中,多多总结,多多测试此贴转载
http://www.bugba.com
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-29 12:28 , Processed in 0.155376 second(s), 33 queries .

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表