花木兰留言本的漏洞分析与利用
本帖最后由 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。。
页:
[1]