找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 804|回复: 0

花木兰留言本的漏洞分析与利用

[复制链接]

71

主题

325

回帖

708

牛毛

一级牛人

积分
708
发表于 2009-6-1 18:55:29 | 显示全部楼层 |阅读模式 来自 湖北省武汉市
本帖最后由 nohack 于 2009-6-1 18:58 编辑

漏洞不是我发现的,网上已经有这方面的文章。我只是再来分析下漏洞的产生而已~~~~花木兰留言本界面做的比较漂亮。从网上可以下载到该留言本的源代码!我是在本机测试的,总共只有四个文件。dqe_gustbook.asp(数据库文件)    gustbook_Conn.asp(数据库连接文件)   gustbook_sub.asp(函数文件)    index.asp(首页文件),数据库连接文件加了容错语句。从客户端提取的变量就只有四个
lanmu zhiding shijian ip   看源码如下:
Books_mingzi=htmlencode(Request.form("mingzi"))
If Books_mingzi="" then Books_mingzi="匿名者" End If
Books_biaoti=htmlencode(Request.form("biaoti"))
Books_neirong=htmlencode(Request.form("neirong"))
If Books_biaoti="" or Books_neirong="" then
    Response.Write "<script>alert('标题和内容不能为空!');this.location.href='"&Url&"';</SCRIPT>"
ElseIf len(Books_mingzi)>14 then
Response.Write "<script>alert('昵称能大于7个汉字!');this.location.href='"&Url&"';</SCRIPT>"
ElseIf len(Books_biaoti)>23 or len(Books_biaoti)<2 then
Response.Write "<script>alert('标题内容不能小于2个汉字,大于23个汉字!');this.location.href='"&Url&"';</SCRIPT>"
ElseIf len(Books_neirong)>600 or len(Books_neirong)<5 then
Response.Write "<script>alert('留言内容不能小于5个汉字,大于600个汉字!');this.location.href='"&Url&"';</SCRIPT>"
Else
Set mRs= Server.CreateObject("adodb.recordSet")
mRs.open "Select * from dqe_gustbook", conn, 1, 3
mRs.addnew
   mRs("who") = Books_mingzi
   mRs("biaoti") = Books_biaoti
   mRs("neirong") = Books_neirong
   mRs("lanmu") = lanmu
   mRs("zhiding") = 0
   mRs("shijian") = now()
   UserIP = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
   If UserIP = "" Then userip = Request.ServerVariables("REMOTE_ADDR")
   mRs("ip") = UserIP
mRs.update
mRs.close
Set mRs = nothing
   Response.Write "<script>alert('留言添加成功\n\花木兰官网:http://www.77f77.com');this.location.href='"&Url&"';</SCRIPT>"
   Response.End
End If
主要是看对变量的过滤,htmlencode函数除了对IP(这个数据我们可以自己构造,稍后再说)没过滤,其他都过滤了。来看下htmlencode函数是如何写的。
Function htmlencode(fString)
If not isnull(fString) then
    fString = replace(fString, ">", ">")
    fString = replace(fString, "<", "<")
    fString = Replace(fString, CHR(32), " ")
    fString = Replace(fString, CHR(9), " ")
    fString = Replace(fString, CHR(34), """)
    fString = Replace(fString, CHR(39), "'")
    fString = Replace(fString, CHR(13), "")
    fString = Replace(fString, CHR(10) & CHR(10), "</p><p> ")
    fString = Replace(fString, CHR(10), "<br> ")
htmlencode = fString
End If
过滤了很多字符~~~~~,注入不可能了~~~
看这几行代码:
UserIP = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
   If UserIP = "" Then userip = Request.ServerVariables("REMOTE_ADDR")
   mRs("ip") = UserIP
是从客户端获取IP地址,首先是获取代理IP,如果没有使用代理Request.ServerVariables("HTTP_X_FORWARDED_FOR") 返回为空值,然后就Request.ServerVariables("REMOTE_ADDR")获得客户端的IP。 获得变量后并没有进行任何过滤直接插入到数据库了。所以漏洞就此产生。

利用方法,用寂寞的刺猬post提交工具,在x-forwarded-for填上一句话代码。。然后留言抓包。。。如图将抓包的数据填好

最后提交就可以了。。。。然后就是用一句话客户端连接。。得到webshell。。
4.bmp

评分

参与人数 1牛毛 +2 收起 理由
fuchou-angle + 2 老大 软件···

查看全部评分

您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-30 06:26 , Processed in 0.185197 second(s), 37 queries .

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表