随便切换一首歌,可以看到QQ音乐会发送这三个HTTP请求。
然后其他两个都是不需要的。漏洞的接口是第二个URL。
这是他完整的请求头。
POST /pcmusic/fcgi-bin/qm_reportlstmus.fcg?pcachetime=1459833844 HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: QMDL
Host: i.y.qq.com
Cookie: qqmusic_fromtag=9; qqmusic_key=3A207B4ED955023B69EEB4B3230EFD1EE5B6CD6010598D2B53F0986F7A6D5CA8; qqmusic_miniversion=53; qqmusic_musicid=1904251; qqmusic_uin=781558066; qqmusic_version=12;
Content-Type: multipart/form-data; boundary=uIDN3h
Accept-Encoding: gzip, deflate
Content-Length: 2270
Connection: Keep-Alive
请求头经过测试,只有以下三个是必须的。
Host: i.y.qq.com
Content-Type: multipart/form-data; boundary=uIDN3h
Content-Length: 2270
--uIDN3h
Content-Disposition: form-data; name="uin"
781558066
--uIDN3h
Content-Disposition: form-data; name="listeninterval"
16
/*
基于TCP连接,返回一个绑定指定IP,端口的socket文件描述符。
addr:目标ip地址。
port:目标端口
*/
int Connect(char* addr,int port)
{
int client_fd=socket(AF_INET,SOCK_STREAM,0);
if(client_fd<0)
{
cout<<"create client fd error"<return -1;
}
struct sockaddr_in client;
client.sin_port=htons(port);
client.sin_family=AF_INET;
inet_aton(addr,&client.sin_addr);
if(connect(client_fd,(struct sockaddr*)&client,sizeof(client))<0)
{
cout<<"connect error"<return -1;
}
return client_fd;
}
/*
发送HTTP请求头;
sock:socket文件描述符
qq:qq号
time:想要发送的时间,单位S
*/
void sdhead(int sock,char* qq,char* time)
{
char buf[500];
sprintf(buf,"POST /pcmusic/fcgi-bin/qm_reportlstmus.fcg HTTP/1.1\r\n");
send(sock,buf,strlen(buf),0);
sprintf(buf,"Host: i.y.qq.com\r\n");
send(sock,buf,strlen(buf),0);
sprintf(buf,"Content-Type: multipart/form-data; boundary=E896uw\r\n");
send(sock,buf,strlen(buf),0);
int sz=127;
sz+=strlen(qq);
sz+=strlen(time);
sprintf(buf,"Content-Length: %d\r\n",sz);
send(sock,buf,strlen(buf),0);
sprintf(buf,"\r\n");
send(sock,buf,strlen(buf),0);
char* flag="--E896uw";
sdmsg(sock,qq,time,flag);
recv(sock,buf,sizeof(buf)-1,0);
close(sock);
}
/*
发送协议的正文。
flag:分隔符
*/
int sdmsg(int fd,char* qqnumber,char* time,char* flag)
{
char buf[400];
int sz=0;
sprintf(buf,"%s\r\n",flag);
sz+=send(fd,buf,strlen(buf),0);
sprintf(buf,"Content-Disposition: form-data; name=\"uin\"\r\n\r\n");
sz+=send(fd,buf,strlen(buf),0);
sprintf(buf,"%s\r\n",qqnumber);
sz+=send(fd,buf,strlen(buf),0);
sprintf(buf,"%s\r\n",flag);
sz+=send(fd,buf,strlen(buf),0);
sprintf(buf,"Content-Disposition: form-data; name=\"listeninterval\"\r\n\r\n");
sz+=send(fd,buf,strlen(buf),0);
sprintf(buf,"%s\r\n",time);
sz+=send(fd,buf,strlen(buf),0);
return 0;
}
https://github.com/zhaoke1995/QMusicUpgradeDemo