|
发表于 2010-2-20 11:24:12
|显示全部楼层
在网站看见有朋友用这个博客程序,[separator]下载回来发现一些BUG,分析了一下。并和
套程序的开发者取得了联系。可以说这个程序在跨站方面做的很不错。我们看看
处理跨站的代码是怎么写的,myreplace.asp文件代码如下:
<%function myreplace(mystring)
mystring=replace(mystring,"&","&")
mystring=replace(mystring,"<","<")
mystring=replace(mystring,">",">")
mystring=replace(mystring,chr(13),"<br>")
mystring=replace(mystring,chr(32)," ")
mystring=replace(mystring,chr(9)," ")
mystring=replace(mystring,chr(39),"Á")
mystring=replace(mystring,chr(34),""")
mystring=replace(mystring,"","<b>")
mystring=replace(mystring,"","</b>")
mystring=replace(mystring,"","<u>")
mystring=replace(mystring,"","</u>")
mystring=replace(mystring,"/","</u>")
mystring=replace(mystring,"#","</u>")
myreplace=mystring
end function
%>
跨站来说基本上是没得玩了,过虑了基本的"<",">",本想用IMG,JAVASCRIPT跨一
下呢,连"/"都过虑掉了。看来跨站是没得玩了。继续看注入吧。
在show_article.asp中的关键代码如下:
dim articleid,articleRs,articleSql
articleid=request.querystring("articleid") //直接取值
if articleid="" then //为空就会告诉我们错误
response.Write "<script>alert('参数错误!');history.back();</script>"
else
'---------------------
session("articleid")=articleid //将articleid值保存上服务器上
'先来更新点击率
'hitsql="update article set hits=hits+1 where articleid="&artilceid //修改没过虑的articleid值
'db.execute(hitsql)
hitsql="update article set hits=hits+1 where articleid="&session("articleid")
db.execute(hitsql)
'-----------------
set articleRs=server.createobject("adodb.recordset")
articleSql="select * from article where articleid="&articleid //查询没过虑的articleid值,漏洞出现
articleRs.open articleSql,db,1
%>
见图一,图二。
我也没看数据库里的表名复杂不,因为发现了后台可以OR,代码如下:
<%
dim admin,password
admin=request.form("admin") //直接取值
password=md5(request.form("password"))
if admin<>"" then
dim rs,strsql //没有过虑OR
strsql="select * from users where admin='"&admin&"' and password='"&password&"'"
set rs=db.execute(strsql)
if not rs.eof and not rs.bof then
session("msmax")=rs("admin")
response.Redirect "admin_index.asp"
else
response.write "<script>alert('对不起,此用户名不存在!');</script>"
end if
end if
%>
不过他用代码判断我们提交的用户名有没有特殊字符,见图三。看看他的代码是怎么实现的,
在admin/login.asp代码如下:
<script language="javascript" type="text/javascript"> //这个不用管它
function check1()
{
if (document.form.admin.value=="")
{
alert("错误:请输入用户名!");
return false;
}
if (document.form.pwd.value=="")
{
alert("错误:请输入密码!");
return false;
}
return true;
}
</script>
<script type="text/jscript"> //把这个去掉
var uReg=/[^A-Za-z0-9]/ig;
function check3(vAlue){
if (uReg.test(vAlue)){
alert('错误:密码不能输入非法字符!');
document.form.password.value=""
form.password.focus();
}
if (vAlue.length>16){
alert('错误:密码只能输入16位!');
document.form.password.value=""
form.pwd.focus();
}
}
</script>
<script type="text/jscript">
var uReg=/[^A-Za-z0-9]/ig;
function check2(vAlue){
if (uReg.test(vAlue)){
alert('错误:用户名不能输入非法字符!');
document.form.admin.value=""
form.admin.focus();
}
if (vAlue.length>6){
alert('错误:用户名只能输入6位!');
document.form.admin.value=""
form1.admin.focus();
}
}
</script>
</head>
<body>
<div id="formwrapper">
<h3>后台管理登录</h3>
<form action="" method="post" name="form" onsubmit="javascript:return check1();" > //改处理路径
<fieldset>
<legend>用户登录</legend>
<div>
<label for="Name">用户名:</label>
<input type="text" name="admin" size="17" maxlength="30" onchange="check2(this.value)"/><br />
</div>
<div>
<label for="password">密码:</label>
<input type="password" name="password" size="18" maxlength="18"onchange="check3(this.value)" /><br />
代码略…… |
|