数据加载中……


 

 登   陆

我的分类(专题)
数据加载中……

链接

Blog信息
数据加载中……

 



鼎峰家教网V2008漏洞分析续篇
樱木花盗 发表于 2008-11-14 18:14:14

PS:本文发表于黑客手册0807期
给新手写的投稿文章,文章内容极其简单!高手飘过!


                    鼎峰家教网V2008漏洞分析续篇
                                                     图/文
Cool_wXd[C.R.S.T]
看了黑手0806期上的《鼎峰家教网V2008漏洞分析》这篇文章,作者在接触脚本安全不久便能够通过实践自己挖掘漏洞真的是一种进步!不过在文章中作者还是出现了一些疑问,所以我也下载了这套系统来看一看,也就产生了这篇文章!下面我们还是看代码吧!
在0806期中提到过的漏洞我们就不说了,还是说一些补充方面的东西!首先我们说一说注入漏洞,正如上期作者所写,防注入代码只是针对Request.QueryString进行了过滤,那么我们就可以尝试其他的方式注入!那就是直接通过request获取变量和通过request.form获取变量!这两个例子我们都分别用一个漏洞来描述!我们来看直接用request获取变量的注入!来看News_View.asp中的233行,代码为
sql = "select * from news where id="&Trim(Request("id"))
看到这个,我们就想通过POST方式提交或者Cookie注入都是可以跳过防注入代码的!因为下面我们还要讨论通过POST提交方式的注入,所以这里我们使用Cookie注入吧!使用的工具是GreenBrowser及其插件JavaScript Cookier,我们来看操作!这里我们用演示站点!在GreenBrowser打开News_View.asp,返回的界面是错误,因为没有给定参数“id”,如图1所示


然后打开我们cookie注入工具JavaScript Cookier,在相应的输入框中按如图2所示输入,并依次点击有效期,源读入和写入

然后我们刷新News_View.asp页面,返回正常,如图3

 

然后再次回到JavaScript Cookier中,将id的属性修改为12 and 1=2,并刷新News_View.asp页面,返回错误,如图4,5






 

由此我们也就看到了,注入点是确实存在的!至于注入漏洞的利用,在以往的黑手中都有关于手工注入的教程,这里我们就不浪费版面了!下面我们再来看看通过request.form获取变量的注入!我们看user_login.asp中的代码从第4行开始,如下:
<%
if Request.QueryString("Action")="login" then

user=Trim(Request.Form("user"))

pass=Trim(Request.Form("pass"))

SQL="Select * from U_s_e_r where user='"& user &"' and pass='"& md5(pass) &"'"

set rs=server.createobject("adodb.recordset")

rs.open SQL,conn,1,1

if rs.bof and rs.eof then

Response.write "<script language='javascript'>alert('用户名或密码错误!');history.go(-1);</script>"

Response.End()

else

Session("user")=rs("user")

Response.Redirect("User_Center.asp")

Response.End()

end if

rs.Close

Set rs=nothing
else

Response.Redirect("Index.asp")
end if

%>
我们看到user和pass只是经过trim()去掉两边的空格而没有经过其他验证便进行SQL语句的执行!而且防注入系统只是针对只是针对Request.QueryString进行了过滤,那么我们通过POST方式提交就可以绕过了!首先我们自己构造一个html页面,代码如下:
<form method="post" action="http://127.0.0.1/User_login.asp?Action=login">
<p>用户名:<input name="user"
type="text" size="50"></p>
<p>密  码:<input name="pass"
type="password" size="50"></p>
<input type="submit" value="登陆">
</form>
下面我们进行提交,我注册的用户名是bushiba,密码为123456,那么针对这个字符型的注入,提交为用户名bushiba' and 1=1 and ''=',密码正常输入123456,如图6

 

点击提交,返回的是正常登陆的页面,如图7







然后我们再次提交用户名bushiba' and 1=2 and ''=',密码正常输入123456,并提交,返回的是如图8

 

漏洞也确实是存在的,至于手工注入获取管理员账号和密码我们这里就不多说了!下面我们来讨论一下作者遗留的另外一个问题,就是关于搜索型注入漏洞的工具使用!这里我们以pangolin为利用工具说一说吧!正如0806期作者分析,这个搜索型注入是通过POST方式提交绕过防注入代码,那么我们就可以利用注入工具的POST方式进行漏洞的检验!这里我们用0806期作者所用的So_result2.asp页面来进行演示,代码229行,如下:
sql = "select * from Stu where yn=1 and "&Request.Form("lb")&" like '%"&Request.Form("keyword")&"%' order by addtime desc"
一个SQL语句两个注入,因为我们前边已经讨论过Request.Form方式的注入,所以针对Request.Form("lb")这个变量的注入我们就不讨论了!直接看Request.Form("keyword")这个!提交的变量是两个,一个是lb另一个是keyword,我们构造一下,如下
http://edu.dfcms.cn/sch/jj/So_result2.asp?lb=sex&keyword=男,然后放入pangolin(注意针对软件设置时应讲搜索型选上),并把方式改为post,然后进行检测,我这里检测结果如图9所示


这样作者遗留的疑问我们也就解决了!具体的猜解密码我们就不做过多的说明了!关于这个程序的注入漏洞,由于只是过滤了Request.QueryString获取变量,所以导致我们可以通过POST方式和Cookie方式都可以达到注入!而且注入漏洞还是很多的,这里我们只举了这三个代表性的!其他的还需要朋友们自己去挖掘!关于注入漏洞的修补,0806期作者所说的在sql.asp中只加入针对request.form方式的防注入代码还是不够的,还需要加入针对request.cookie方式的防注入代码,而且可以参照neeao大牛写的防注入程序!
由于这套程序还没有开发完善,许多功能还没有添加,对于新闻之类的评论都没有,但是在这较少的交互中,还是存在了跨站漏洞!我们还是具体看代码。这里我们就看会员注册部分吧!页面User_Reg.asp中获取变量和写入数据库的语句代码如下:
if Request.QueryString("Action")="reg" then

Dim username,password,password2,name,sex,email
      

username=Trim(Request.Form("username"))

password=Trim(Request.Form("password1"))

password2=Trim(Request.Form("password2"))

name=Trim(Request.Form("name"))

sex=Trim(Request.Form("sex"))

email=Trim(Request.Form("email"))
      

SQL="Select * from U_s_e_r where user='"& username &"'"

set rs=server.createobject("adodb.recordset")

rs.open SQL,conn,1,3

if not rs.bof and not rs.eof then

Response.write "<script language='javascript'>alert('该用户名已注册,请使用其他用户名!');history.go(-1);</script>"

Response.End()

else

rs.Addnew

rs("user")=username

rs("pass")=md5(password)

rs("name")=name

rs("sex")=sex

rs("mail")=email

rs.Update

end if

rs.Close

Set rs=Nothing
      
             

Response.Write ("<script>alert('恭喜您,注册成功,请返回登录!');location.href="/BLOG/Index.asp";</script>")
end if
%>
直接获取,直接写入!但是我们需要注意到的是,这些字段在数据库中定义的长度最长的为E-mail为100个字符,其他的最长20个字符,所以我们使用这个!但是我们发现在注册时候提示的却是请输入正确的邮箱账号!这个是客户端验证的,我们只需要本地提交就可以了,修改邮箱部分的maxlength="50"为maxlength="100"还有就是去掉dataType="Email" msg="信箱格式不正确",还有就是提交部分改为action="http://url/User_Reg.asp?Action=reg然后就是本地提交了!按照如图10输入方式提交

然后我们到后台看一看,在查看注册会员时,显示如图11所示

 

跨站漏洞形成!我想当这个程序完善的时候会有更多跨站的地方!针对跨站漏洞来说只有想不到没有办不到!在跨站利用方面,我想会有更多好的方法,朋友们也可以尝试一下通过跨站实现添加管理员!针对跨站漏洞的修补,应该是在服务端对用户提交的数据进行有效的过滤,而不是类似这种在客户端进行验证,这样的验证突破还是很简单的!
    以上就是我针对鼎峰家教网V2008漏洞的简单分析,0806期作者所提过的漏洞我们这里没有进行考虑!对这套系统来说,个人认为还处于代码编写的初期,很多部分还没有完善,虽然管理员有一定的安全性,但是还是考虑得不够周全,算上0806期作者所提过的暴库,ewebeditor的利用,注入,跨站!我想这套系统还是有很多地方需要提高的!文章就写到这里,如果朋友们有什么疑问可以联系我,我的论坛ID是Cool_wXd.


阅读全文 | 回复(0) | 引用通告 | 编辑
 


发表评论:

    昵称:
    密码: (游客无须输入密码)
    主页:
    标题:
    数据加载中……


Powered by Oblog.