分享
 
 
 

一个学校的网站安全性测试

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

本文作者:angel

文章性质:原创

发布日期:2004-04-02

前言

我自从在学校维护学生会网站以后,就有了不小的权限,我只要上传一个“海阳顶端网ASP木马”就可以任意修改任何web页面了,因为学校里所有的站点都放在http://www.nothing.com/里面,不过我可不敢这样做,也不会这样做。最近学习ASP挺上瘾,就看看学校自己写的ASP程序有什么隐患吧。

问题一

除了前台只有少量的ASP文件,就是用户注册(是学校的人才能注册)、登陆、忘记密码、个人信息修改这几个ASP文件,先看看忘记密码,lostpass.asp是一个提交页面,没有任何ASP语句,看看<form>里目标文件是lostpass1.asp,再查看原代码,没有发现问题(是我的水平有限),再看下一个lostpass2.asp,呵呵,发现了一句有毛病的语句:

sql="select pwd,answer from [member] where userID='"&userID&"' and answer='"&answer&"'"

这么低级的错误也会犯,此时,您只要根据sql构造一个特殊的用户名和密码,如:' or '1'='1

这样,程序将会变成这样:

程序代码:

[ 复制代码到剪贴板 ]

sql="select pwd,answer from [member] where userID="&'or'1'=1&"and pass="&answer&"

or是一个逻辑运算符,判断两个条件的时候,只要其中一个条件成立,那么等式将会成立,而在语言中,是以1来代表真的(成立),那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值。这样的话我们从一开始就可以提交' or '1'='1这个来饶过验证了,不管我们在什么文本框我们都提交' or '1'='1这个都能顺利到达下一个页面,既然这样,我们用' or '1'='1来作为用户名和密码登陆,会怎么样呢?实验证明登陆成功,因为显示个人资料修改的链接了,果然正常显示了个人资料,我发现真实姓名不可改,说明一定有什么ID之类的来识别用户,于是直接查看网页源代码发现这么一行重要的东西:

<input type="hidden" name="hiddenField" value="2001010001">原来是靠这个hiddenField来辨别用户,那么如果我修改了value的值,那不是可以修改其他用户了吗?马上拿我以前注册的来试,把我的号码2001010XXX替换上去,然后修改<form>里的相对连接,另存为htm文件,然后提交我需要修改的资料。再看看我的资料,果然被修改了,这么说如果我我知道任何一个用户的hiddenField的值,就可以修改其资料,还不乱套?这个就搁在一边……这个问题可以写个函数禁止从外部提交数据得以解决。

不过这个漏洞有点局限性,如果想改某个用户的资料一定要知道hiddenField的值,否则只能乱改。不过既然这个文件这样了,我想后台入口验证程序应该也是这样,我试着登陆,成功了,所有会员的资料尽收眼底,而且任意添加和修改管理员,做什么都可以啊。

这个问题的防范方法其实很简单,处理输入字符就可以了,原来我还以为用replace()函数呢,请教了一下劲风,得知用mid()函数可以很好的解决,加一个判断就可以了:

程序代码:

[ 复制代码到剪贴板 ]

us=mid(input,i,1)

if us=" " or us="'" or us="%" or us="<" or us=">" or us="&" then

response.redirect "error_page.asp"

response.end

几行代码就可以检查用户所输入的字符了,当然,应该尽量多检查一些特殊字符。这行代码意思是检查输入的字符中,如果有空格、单引号、百分号和“<”、“>”就重定向到error_page.asp这个页面。

虽然“海阳顶端网ASP木马”具有黑掉学校服务器的能力,但我们还是要从学校的程序入手,否则就没有意义了,“海阳顶端网ASP木马”在这里只充当一个查看原代码的角色。

问题二

通常一些资料调用文件都会存在一些SQL injection漏洞,比如show.asp、showarticle.asp、shownews.asp、showuser.asp等等,因为这些文件很容易忽略检查变量,我看到一个shownews.asp文件。马上打开,其原代码如下(由于此文件太大,限于篇幅,我去掉了很多无关的HTML代码):

程序代码:

[ 复制代码到剪贴板 ]

<% option explicit %>

<!--#include file="conn.asp"-->

<%

dim sql,rs,rsc,thedate

dim reviewable,aboutnews

set rs=server.createobject("adodb.recordset") '查找显示相关新闻数目及是否开放评论权限

rs.open "select * from news_parameter where parameterid=1",conn,1,1

if not rs.bof and not rs.eof then

aboutnews=rs("aboutnews")

if rs("reviewable")=1 then

reviewable=1

else

reviewable=0

end if

else

aboutnews=5

reviewable=1

end if

rs.close

set rs=nothing

set rs=server.createobject("adodb.recordset")

sql="update news set hits=hits where newsid=" & cstr(request("newsid"))

conn.execute sql

if session("purview")="" then

rs.open "select * from news where newsid=" & cstr(request("newsid")) & " and audit=1",conn,1,1

else

rs.open "select * from news where newsid=" & cstr(request("newsid")),conn,1,1

end if

if err.number <> 0 then

response.write "数据库出错"

else

if rs.bof and rs.eof then

rs.close

response.write "该新闻不存在或未经过审核"

else

%>

<html>

<head>

<LINK href="function/css.css" rel=stylesheet type=text/css>

<title><%=rs("topic")%></title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body bgcolor="#FFFFFF" text="#000000" topmargin=0 leftmargin=0 rightmargin=0>

<table width="92%" border="0" cellspacing="0" cellpadding="0" align="center">

<tr>

<td height="36" valign="middle">

<div align="center"><br><font size=3><b><%=rs("topic")%></b></font><hr size=0 width=100%></div>

</td>

</tr>

<tr>

<td>

<div align="center"><%=rs("ntime")%> <% if trim(rs("nfrom"))<>"" then

response.write "文章来源:" & trim(rs("nfrom"))

end if %>

<% if trim(rs("writer"))<>"" then

response.write "作者:" & trim(rs("writer"))

end if %> 浏览次数:<%=rs("hits")%><hr size=0 width=100%></div>

</td>

</tr>

<tr>

<td valign="top">

<% dim content

content=rs("content")

content=replace(content,"../../../","../news/")

response.write content %>

</td>

</tr>

<tr>

<td valign="top"><br><br><br><b>---------- 相 关 新 闻 ----------</b><br>

<% set rsc=server.createobject("adodb.recordset")

if session("purview")="" then

rsc.open "select top " & aboutnews & " * from news where keys like '%" & trim(rs("keys")) & "%' and newsid<>" & cstr(rs("newsid")) & " and audit=1 order by ntime DESC",conn,1,1

else

rsc.open "select top " & aboutnews & " * from news where keys like '%" & trim(rs("keys")) & "%' and newsid<>" & cstr(rs("newsid")) & " order by ntime DESC",conn,1,1

end if

if rsc.bof and rsc.eof then

response.write "暂时没有相关新闻"

else

response.write "<ul type=circle>"

do while not rsc.eof

response.write "<li>"

thedate="(" & cstr(year(rsc("ntime"))) & "-" & cstr(month(rsc("ntime"))) & "-" & cstr(day(rsc("ntime"))) & ")"

response.write "<a href='shownews.asp?newsid=" & cstr(rsc("newsid")) & "' target=_blank>" & trim(rsc("topic")) & "</a><font color='#6365CE' size='1'>" & thedate & "</font>"

if month(cdate(trim(rs("ntime"))))=month(now()) and clng(day(cdate(trim(rs("ntime"))))+1)>=clng(day(now())) then

response.write "<img src="http://doc.readmen.com/1/image/news.gif"><br>"

end if

rsc.movenext

loop

end if

rsc.close

set rsc=nothing %>

</ul></td>

</tr>

</table>

<!--#include file="function/copyright.inc"-->

</body>

</html>

<% end if

end if%>

<!--#include file="function/DBclose.asp"-->

大家看到了吗?文件根本没有对任何变量做任何检查,所以这个文件怎么利用都不过份,呵呵,看到这一句,

程序代码:

[ 复制代码到剪贴板 ]

rs.open "select * from news where newsid=" & cstr(request("newsid")),conn,1,1

由于程序根本没有对任何变量做任何检查。我们就可以可以直接构造 newsid 发动sql injection攻击,我们提交这样的代码就可以以连接这个SQL数据库的用户所拥有的权限执行系统命令。

针对这个文件的解决办法就是用replace函数过滤,看看下面的代码:

程序代码:

[ 复制代码到剪贴板 ]

<%

function checkStr(str)

if isnull(str) then

checkStr = ""

exit function

end if

checkStr=replace(str,"'","")

checkStr=replace(str,";","")

checkStr=replace(str,"--","")

end function

%>

这个函数的意思就是把单引号、分号,两个横线替换为空。

我们学校服务器的系统漏洞已经找不出什么东西了,但是由于Web程序的问题,导致服务器被控制,学校的技术人员怎么想呢?文章虽短,但问题已经说明很清楚了。

看来Web程序的问题实在不可忽视。Web程序安全的重点就是对字符检查——检查——再检查。

本人水平实在有限,写不出什么高深技术的文章,在这里献丑了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有