Javascript是客户端语言,javascript为web应用带来了很多优势,因此很多web程序开发者非常依赖javascript,从简单的判断到ajax,javascript无所不在,然而过分依赖javascript,您的web程序可能出现极大的安全隐患。下面从实际情况讲讲过分依赖javascript所带来的问题:
1、upload时的javascript判断,这个是为大家所熟知的漏洞,早年的asp程序基本都有这个问题,即在上传文件的时候,只是客户端判断文件,而真正处理上传的服务器脚本没有判断,于是大家可以自己写个form上传可执行文件;与此类似的是注册的时候判断注册的信息是否符合要求,单靠javascript是不行的;
2、ajax里的注入,ajax非常强大,在web2.0里用的很广泛,但太多的ajax程序的服务端文件存在注入,虽然不是一眼就能看到的注入点,但仔细看看源码,可以很容易的找到提交点(注入点);
3、下面谈的是本文产生的重点,不仔细看看,程序员都会觉得这程序没问题!
先看一段asp代码:
<!--#include file="../Inc/Conn.asp"-->
<%
Dim StarTime,Style_Copy
Dim AdminName
startime=timer()
AdminName=replace(session("AdminName"),"'","")
if AdminName="" then
%>
<script language='javascript'>top.location='Login.asp';</script>
<%
end if
%>
这是某某网站管理系统的后台验证页面,包含在后台的每个页面中,也就是访问每一个后台页面都先通过它判断session。
当初测试这个系统的时候,我感觉很安全,因为不存在注入点,找不到可以利用的地方,后台密码也猜不出,测试了好久,仍找不到拿下的办法。但无意中我关闭了浏览器的脚本执行,发现访问admin/default.asp的时候可以直接进入了,与登陆了没有两样,于是轻松拿下shell。然后我翻翻源码看了看,不禁无语,其实这里逻辑上没有问题的,唯一的问题是过分依赖了javascript。
Javascript是客户端语言,我可以执行它也可以不执行。如上代码执行了才返回登陆页面,而如果不执行,则程序继续往下走,这段代码可以无视了...于是程序员知道了,少加了个response.end,或者把js换成response.redirect...
ASPX与PHP也一样,经常能发现这个有点无语的问题;不过问题最严重的是JSP的站,JSP系统大多存在这个问题,开发JSP的程序员大多喜欢用javascript(也许因为js与jsp本是一家),前段时间检测了两个国内的不开源的JSP系统(一个是门户站,一个是IDC站,欢迎两站点的开发人员联系我:[url]www.oldjun.com[/url]),两个站均存在滥用javascript导致可以随便进系统后台,而后台代码的安全性一般比较薄弱,基本上都可以注入。下面给出某个系统的部分代码(check.jsp,后台所有文件都包含它,用来检测session),与上面的asp语句如出一辙:
<%
    if(session.getValue("Site_Id")==null)
    {
%>
<script language="javascript">top.window.location.href="/index.html";
</script>
<%
    }
%>
总结一下:网站渗透的时候,禁用浏览器的脚本也许会有意外的发现。韩国站大多喜欢用javascript+框架结构,只允许大家访问main.html(htm),如果禁用了js,则可以无视这框架的存在,随意检测系统问题了。开发网站的时候,别只图网站的功能而忽视网站的安全,审核代码的时候,也思考一下,假如这段js不存在,网站是怎么运行的,千万别过分依赖javascript。