分析QQ相册密码的验证算法
根据http://izone.qq.com/client/photo ... &album=31931732 下载或者翻看Internet临时文件夹下的 photo_password 文件可查到下列语句: type="text/javascript" src="/js/md5.js"> documents.cookie=("album" albumId "pwd=" hex_md5(pwd)); 对比 md5.js文件可知,此v2.1版本的 javascript MD5,且输入的密码转化为32位的字符串。
比较两个地址: http://photo.qq.com/cgi-bin/izon ... mp;albumid=31931732 /*http://izone.qq.com/client/photo ... amp;album=31931732/这个地址类似可以不看*/ (此地址为有密码情况下的登陆地址,要求输入密码) http://photo.qq.com/cgi-bin/izon ... asswd=&mode=big (此地址为无密码情况下的登陆地址)
由此可以推断出: http://photo.qq.com/cgi-bin/izon ... 1931732&passwd=(****************)&mode=big ******为转化后的md5字符串,此地址应该为此地址为有密码情况下的直接登陆地址。 随便输入一段字符显示如下:
密码有误,请重新输入! 考虑到在前面有密码情况下的登陆窗口连接为cgi_album_pwd,浏览相册连接为cgi_album_view。 试将登陆地址改为下列方式: http://photo.qq.com/cgi-bin/izon ... 1931732&passwd=(****************)&mode=big 随便输入一段字符显示如下:
经过换算可知,1234的MD5值是81dc9bdb52d04dc20036dbd8313ed055 测试数次
密码:11111111 MD5:1bbd886460827015e5d605ed44252251
密码:3 MD5:eccbc87e4b5ce2fe28308fd9f2a7baf3 由此可以判定,此处的passwd为密码加密后的前4位。 photo_password 文件可查到下列语句: var p=""; if (x!=null) p=x.selectSingleNode("/data").getAttribute("passwd"); 判定此passwd应该是数据库中的某字段名。 if (p!="" && hex_md5(pwd).indexOf(p)!=0){ alert("密码错误") document.getElementById("pass").focus(); return; } documents.cookie=("album" albumId "pwd=" hex_md5(pwd)); location="/client/photo_static_big.htm?uin=" uin "&album=" albumId; pwd为输入的密码,经过md5加密。判定此处出现的passwd="eccb"应该是验证输入的密文密码的正确性的。假如正确,使用hex_md5(pwd)进行登陆。
由于QQ相册密码提示为8位,那么假如有心人使用相关工具换算处8位以下的所有数字和字母组合的MD5值做成数据库,那么密码就如同虚设。但是考虑到相册密码意义不大,一般情况下不会有人过于无聊拿机器去跑这东西... 似乎最基本常见的的运算次数为几百万亿次,假如谁又爱好搞几台服务器跑天把做个数据库倒是蛮好,就是大了点预备个TB级的硬盘矩阵吧。假如怕麻烦可以去国外的几个大型MD5数据库查询。 |