Mar
24

Web开发中请勿过分依赖Javascript

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站,欢迎两站点的开发人员联系我:www.oldjun.com),两个站均存在滥用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。

共有13条评论

  1. 0x33: Mar,27th,2009

    想法很前卫,

  2. janglichao: Mar,28th,2009

    呵呵,今天我刚上交了一个javascript做的project,晕,被老师为难了的说,呵呵,恩,先学习了,

  3. dklkt: Mar,28th,2009

    赞“无意中我关闭了浏览器的脚本执行”

    记得以前上XX网站的时候,网站上的广告里有网马。我那时一般都是把JS关了再上的。很安全。^_^

  4. Darren: Apr,1st,2009

    楼上的共享资源撒

  5. 双seqiu: Apr,4th,2009

    很不错 值得参考

  6. 笨猫: Apr,4th,2009

    不错。学习了。

  7. hiphop: Apr,5th,2009

    這的方式確實很有效

  8. 风谷: Apr,9th,2009

    呵呵,造成这样的原因,其一是过份依赖javascript,其二还是对脚本代码不熟悉造成的.
    譬如php中:
    if (***) {
    header(location:login.php);
    }
    fputs();

    上面在header之后,并没有exit();或die().这样,执行完header()后,下面的也会执行...
    这与上述的,也是一个道理.

  9. xiaoz: Apr,15th,2009

    说的不错,以前看代码时记的有一个是用javascript来判断是否输入了'这些符号
    结果我post提交也是可以的,就达到了提交'饶过,直接登陆后台。
    来看看oldjun兄了...
    呵呵

  10. 小柯: May,16th,2009

    不错,学习学习。。。嘿嘿

  11. 幽鬼狼魂: Jul,30th,2009

    我晕,以后会多多注意自己程序的。。晕死。。。学习了

  12. teamtopkarl: Oct,9th,2009

    asp也有这种现象

NAME:

required

E-MAIL:

required, will not be published

HOMEPAGE:

CONTENT:

VERIFY:(请输入A后的英文字母!)

required