泄密查询
登录
注册
看我鼓捣华西安全网(cha.hxsec.com)密码泄露查询接口 anhkgg2017-08-10 首发专栏:汉客儿关注
最近爬个站的数据,然后想扫一下其他网站的同一个账号名能否找到泄露的密码,然后在这个站嘿嘿一下.
0×00 开始
最近爬个站的数据,然后想扫一下其他网站的同一个账号名能否找到泄露的密码,然后在这个站嘿嘿一下…
在 sec-wiki 找到了这个密码泄露查询网站。
随便用了一下,发现网站虽然讲密码打码了,但是某些数据还是可以猜出来原始的内容,或者通过简单的计算拿到原始的内容。
but,我不能一个个输入然后看吧,数据虽然少,也有上千条啊,怎么说也是个python程序员,怎么也得鼓捣一下。
分析一下hxsec的查询接口,用python批量一下。
0×01 分析接口
hxsec查询界面如下:
hxsec1.png
hxsec1.png
其实接口很简单,f12,切换到network栏,然后随便输入什么,点击试试吧皆可以。
看到访问的网络接口如下:
Request URL:http://cha.hxsec.com/ajax.php?act=select
Request Method:POST
Status Code:200 OK
select_act:3
match_act:2
key:ll111
table:212300_cxhr_zhaopin_com
参数都特别简单,select_act表示User and Email/User/Emial,match_act表示模糊/精确查询,key就是输入的关键字。最后一个table比较重要了,表示在什么库中查询,扫描时看到进度变化,在什么库中进行了多少了,每次搜索都会在这所有库中搜索,直到结束。
这个数据应该存在了本地,或者初始化时服务器返回了。暂时不管,后面继续重点分析(有意思的就在这)。
请求返回数据,有下面几种情况:
没有返回空内容
//该库只有一条数据
addRow("ll111","348720221@qq.com","202**962AC59075B964B07152D234B70","212300_cxhr_zhaopin_com");
//该库有多少数据
addRow("'fish13', 'fish1346@qq.com', '**', 'mail_qq_sohu");addRow("fish13', '592545012@qq.com', '**', 'mail_qq_sohu");addRow("fish13', 'm_srikanth@sohu.com', '**', 'mail_qq_sohu'], ['fish13', '', '176**1176671', 'qq_old_password'
0x02 分析table
其实接口很清楚了,但是还需要直到所有table的内容,然后才能完成所有数据搜索。
所以,table怎么找,在哪里呢!
还是要分析代码了...
看看表单所在位置代码,找找搜索按钮的响应函数(这里也可以看到上面说的参数的详情),很明显响应函数是getdata。
在html,js中一番搜索,tmd居然没有。
只在system.js中看到了这个!
傻逼|你TM的来打我啊|getdata|stend|u5927|
hxsec2.png
hxsec2.png
—-手工分割线——-
TMD的,我这暴脾气,这是挑衅啊,lz非搞你不可了!这已经上升到人身攻击了!!!
----手工分割线-------
很明显,tmd代码混淆了。怎么办,调试跟呗。
把system.js(用chrome格式化一下,不然...瞎眼)扒出来一看,其实也不复杂。
//jb 5/24修改
eval(function(p, a, c, k, e, d) {
e = function(c) {
return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
}
;
if (!''.replace(/^/, String)) {
while (c--)
d[e(c)] = k[c] || e(c);
k = [function(e) {
return d[e]
}
];
e = function() {
return '\\w+'
}
;
c = 1;
}
;while (c--)
if (k[c])
p = p.replace(new RegExp('\\b' + e(c) + '\\b','g'), k[c]);
return p;
}('3o 2Y$=["",\'\',\'\\\\w+\',\'\\\\b\',\'\\\\b\',...tbody|php|table|傻逼|你TM的来打我啊|getdata|stend|u5927|innerHTML|url|type|somd5combdba21b9c|Administry|u4e8e4|u7684|操你妈|u60a8|u627e|u90ae|u957f|u5462|u7bb1'.split('|'), 0, {}));
不过直接看也挺闹人的,边调试边看吧。
参数是什么?
// p是字符串
// a 是62
// c 是 352数组大小, k 是Array[352]
// e 是0 , d 是{}
e函数干嘛了?具体返回数据暂时也不同看了,调试到了自然可以dump出来
e = function(c) {
//61以内的就返回字符,0-9,a-z(11-36),A-Z(36-61)
//62以上
//c.toString(36) 36进制转为字符
return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
}
然后就解密那一长串字符了,用的e
while (c--)
d[e(c)] = k[c] || e(c);
解出来的数据大概是这样的一个object,
5y: 'u7684'
5x: 'u4e8e4'
5w: 'Administry'
5v: 'somd5combdba21b9c'
5u: 'type'
5t: 'url'
5s: 'innerHTML'
5r: 'u5927'
5q: 'stend'
5p: 'getdata'
5o: '你TM的来打我啊'
5n: '傻逼'
5m: 'table'
5l: 'php'
5k: 'tbody'
5j: 'somd5comeff53bcd1'
然后继续解,将结果返回给eval执行
while (c--)
if (k[c])
p = p.replace(new RegExp('\\b' + e(c) + '\\b','g'), k[c]);
直接dump结果,如下
var _$ = ["", '', '\\w+', '\\b', '\\b', ...|来打我啊|SOMD55|傻逼|||||||||||你TM的来打我啊|php|table|act|u8f93|select|u5728|u6b63|u603b|POST|u8fdb|u5165|u60a8|u627e|u7684|操你妈|u5462|u7bb1|u90ae|u957f|u4e8e4|u5927|30|getdata|31|33|32|eval|url|type|data|indexOf|success|focus|39|38|dataxxxx|40|somd5comea98952b0|gat_kong|35|34|36|for|37|pow|empty|insertRow|somd5comb39f98f6a|round', '|'];
eval(function(somd5comf3298c8c5, somd5com3de2f8f6d, somd5comf78518fb1, somd5com6d38bb14b, e, somd5comd152c7b41) {
//
e = function(somd5com21a288587) {
return (somd5com21a288587 < somd5com3de2f8f6d ? _$[0] : e(parseInt(somd5com21a288587 / somd5com3de2f8f6d))) + ((somd5com21a288587 = somd5com21a288587 % somd5com3de2f8f6d) > 35 ? String["fromCharCode"](somd5com21a288587 + 29) : somd5com21a288587["toString"](36))
}
;
if (!_$[1]["replace"](/^/, String)) {
while (somd5comf78518fb1--)
somd5comd152c7b41[e(somd5comf78518fb1)] = somd5com6d38bb14b[somd5comf78518fb1] || e(somd5comf78518fb1);
somd5com6d38bb14b = [function(somd5com8f18e7d16) {
return somd5comd152c7b41[somd5com8f18e7d16]
}
];
e = function() {
return _$[2]
}
;
somd5comf78518fb1 = 1
}
;while (somd5comf78518fb1--)
if (somd5com6d38bb14b[somd5comf78518fb1])
somd5comf3298c8c5 = somd5comf3298c8c5["replace"](new RegExp(_$[3] + e(somd5comf78518fb1) + _$[4],_$[5]), somd5com6d38bb14b[somd5comf78518fb1]);
return somd5comf3298c8c5
}(_$[6], 62, 184, _$[7]["split"](_$[8]), 0, {}))
有没有感觉很熟悉的结果,就是上面解密的哪个函数,参数变量真tmd
好看。不详细说了,跟前一次一样,最后返回一个解密的js代码,给eval执行。
这次dump出来看到了要的东西了!注释都有了,就不说了
function getdata() {
$(_$[28])["css"](_$[29], _$[30]);
get_del();
var somd5com490d63bb2 = $(_$[31])["val"]();//输入
if (somd5com490d63bb2 == _$[32]) {
$(_$[33])["focus"]();
alert(_$[34]);
return false
}
;if (somd5com490d63bb2["length"] < 4) {
alert(_$[35]); //"关键字长度请大于4!!"
return false
}
;var somd5combdba21b9c = $(_$[36])["val"](); //选择的搜索类型,1,2,3
var somd5comd7f929c0a = $(_$[37])["val"](); //匹配类型,1模糊,2精确
somd5com326e7999e = new Date()["getTime"](); //时间戳
somd5comdd52905dc = 0;
for (var somd5comb93c3a502 = 0; somd5comb93c3a502 < database["length"]; somd5comb93c3a502++) {
get_data(somd5com490d63bb2, somd5combdba21b9c, somd5comd7f929c0a, database, somd5comb93c3a502)
}
}
诶,忘了一件事,我们是找table的,在哪里呢?!
其实就是上面代码中的database了,这里循环每个table通过get_data(内部ajax访问)来搜索结果。
for (var somd5comb93c3a502 = 0; somd5comb93c3a502 < database["length"]; somd5comb93c3a502++) {
get_data(somd5com490d63bb2, somd5combdba21b9c, somd5comd7f929c0a, database, somd5comb93c3a502)
}
在dump出来的js代码中一搜,database没有找到定义,我靠!什么情况!调试到getdata时,确实是有值的,dump内容如下:
["06_cn_mumayi_jd_com","1010wan_beihaiw_duowan","12306_cn","131_xiu_tianya",
"17173_com","212300_cxhr_zhaopin_com","212300_cxhr_zhaopin_copy","24buy_cd","51cto_com_new",
...] //一部分
但是我能就这么算了吗?!database究竟哪里来的,真想只有一个,去html再看一眼,搜到如下内容,嗯,看来是了,服务器返回的database。
访问http://cha.hxsec.com/ajax.php?act=database,拿到返回的结果
var database = new Array("06_cn_mumayi_jd_com","1010wan_beihaiw_duowan","12306_cn","131_xiu_tianya","17173_com","212300_cxhr_zhaopin_com","212300_cxhr_zhaopin_copy","24buy_cd","51cto_com_new","51job_com","52pk_com",...,"xiaohua_other","xiaomi_com");
也知道前面的database变量怎么来的了,为了database有效,ajax.php?act=database是在system.js加载完之后发送的请求。
0×03 总结
ok,分析告一段落,table拿到了,接口所有信息都弄清楚了,下面就是开始码代码了!
另外,我只想对写system.js的同志说,nmmmp!那一段中文啥用没有,只能激起fn!
有不敬之处,敬请见谅!
有一点小小的分析技巧:
//想看这的请移步博客原文,自己想法看这个内容。嘎嘎,没找到请留言
封装了一套py的代码,地址:https://github.com/anhkgg/hxsec_search
博客原文:https://anhkgg.github.io/hxsec-search-pwd-interface-analyze
专栏
anhkgg
anhkgg
17 篇文章
等级: 1级
关注
||
昵称
请输入昵称
必须您当前尚未登录。登陆?注册邮箱
请输入邮箱地址
必须(保密)表情插图
有人回复时邮件通知我
相关推荐
8211;死磕python字节码手工还原python源码
8211;死磕python字节码手工还原python源码
死磕python字节码手工还原python源码
anhkgg2018-09-046779
【原创】2345内核拒绝服务漏洞分析(3)- WORD的锅
【原创】2345内核拒绝服务漏洞分析(3)- WORD的锅
通过本系列分享一些内核驱动漏洞挖掘的知识
anhkgg2018-07-182462
2345内核拒绝服务漏洞分析(2)
2345内核拒绝服务漏洞分析(2)
通过本系列分享一些内核驱动漏洞挖掘的知识
anhkgg2018-07-084011
【原创】2345内核拒绝服务漏洞分析(1)
【原创】2345内核拒绝服务漏洞分析(1)
通过本系列分享一些内核驱动漏洞挖掘的知识
anhkgg2018-07-074560
FREEBUF免责声明协议条款关于我们加入我们广告及服务寻求报道广告合作联系我们友情链接关注我们
官方微信
新浪微博腾讯微博Twitter赞助商
Copyright © 2018 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号
css.php 正在加载中...0daybank
文章评论