Friday, 24 January 2014

探索在 Chromium 瞬间移动的方法

其实, Chromium 浏览器暗地里传授了一种瞬间移动的方法。

现阶段这个方法只在linux。Windows 用户就看看算了。

首先, 打开 Chromium,  按SHIFT+ESC键打开 Task Manager, 或者在 Menu 选 Tools -> Task Manager 也一样。

你会看见有Memory, Process ID 云云。




如果选左下角的 Stats for nerds, 就会进入chrome://memory-redirect/, 静止版的 Processes memory。

特别的地方是可以看见其它浏览器的Memory。 比如说 Firefox。




Ok,  回到刚才的Task Manager.

顺带一提, 我的blog曾经写过 Google Chromium 地址栏的介绍, 提到输入URL的途中, Chromium 会 pre-render 来加快速度, 可是我当时没有给你看证据。

现在尝试输入URL, 留意Task Manager最后一行, 很明显看见 Pre-render的 Network 传输 811KB/s.





 Ok, 让我们开始探索瞬间移动。

首先, 在Task Manager 中间随便一个地方按右键。选 Goats Teleported



就会有新的栏位 Goats Teleported 出现。(Teleport 是瞬间移动的意思。)

你所看到的数字是一直跳动的。 无法预测数量。


那些数字代表什么呢? 就是一群山羊在 Chromium 的 Memory 里面不停的使用瞬间移动功夫, 跳来跳去, 这些数字就是每秒出现在 Chromium Memory 的山羊数目。

让我们看下Chromium的部分源码, https://chromium.googlesource.com/experimental/chromium/src/+/ddeb0e8430927a8f4a8300773729e1c0c2aead8f/chrome/browser/task_manager/task_manager.cc:






goat_salt_ 的赋值是 base::RandUint64() 。任意的数字, 暂时不大明白其中蕴藏的秘密。只好看看其它地方。

去header 文件找下灵感,
 https://chromium.googlesource.com/experimental/chromium/src/+/ddeb0e8430927a8f4a8300773729e1c0c2aead8f/chrome/browser/task_manager/task_manager.h





...看到一个奇怪的URL, http://go/at-teleporter , 哪有 go 这种 domain 的?... =.=

go, 你联想到什么秘密吗? 我想到的只有 Go programming language 和 Gopher。当然, goat 本身也是 go开头... Oops... http://go/at 不就是goat吗? ( 之前还以为是at&t)

也许只有当你学会瞬间移动, 才能穿越时空浏览这个 go 的 神秘 domain 吧?



干杯 :)


*其实 go 是 Google intranet 的地址表达方式, 正式的 hostname 其实是 http://goto.google.com






所以 http://go/at-teleporter 其实是 Google 内部的链接 http://goto.google.com/at-teleporter :)






Thursday, 16 January 2014

面子书 - 一次性删除多个inbox信息 。


                           最后公告: 由于面子书停用 desktop messenger,所以代码无法直接运行。

22 jan 2014 公告: 留言提到的代码问题已解决。请重新copy代码。

有些人会觉得删除大量的信息很麻烦



因为要按每个人的对话信息, 然后里头又要按 Actions, 然后选 Delete Conversation... , 然后还要再按 确认 Delete Conversation


如果要管理太多信息/粉丝, 会非常不便 。

现在我来说说比较快的方法 。



步骤 1:

更多 -> 已存档, 打开 https://www.facebook.com/messages/archived/, 确保 archived(中文称 "已存档") 文件夹里头没有重要的对话信息都是可以丢的, 当然也可以是空的。




步骤 2:

去未读(Unread)那里 (: 其它 (Other) 那里也可以), 用滑鼠一边scroll 到底, 如果是不要的对话信息,  就选右边的叉 (Archive/存档)。

目的是把那些对话信息集中在 archived("已存档")的文件夹, 方便一次过删除。




步骤 3:

打开archived/已存档 的<文件夹, https://www.facebook.com/messages/archived/ ,  也就是跟步骤 1 一样的地方。

会看到刚才打叉进来的对话信息。比如说我的例子, 只有两封对话信息。

警告: 稍微 scroll 一下, 确保全部对话信息都是你要删除的! 否则不要进行接下来的步骤。 如果发现有不小心带进来的对话信息, 你可以打叉取消存档





步骤 4:

按右键, 选 Inspect Element




步骤 5:

Console 标签




步骤 6:

把下面的代码 copy paste Console 下面空白的地方。


var fb_dtsg = document.getElementsByName('fb_dtsg')[0].value;
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://www.facebook.com/desktop/fbdesktop2/transfer.php?__a=1&socialfox=false", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState >= 4) {
var da = xhr.status;
if (da == 200) {
var ac = JSON.parse(JSON.stringify(xhr.responseText)).split('access_token":"')[1].split('"')[0];
var xhr2 = new XMLHttpRequest();
xhr2.open("GET", "https://graph.facebook.com/fql?format=json&q=SELECT+thread_id+FROM+unified_thread+WHERE+has_tags%28%27archived%27%29+LIMIT+500&access_token=" + ac, true);
xhr2.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr2.send();
xhr2.onreadystatechange = function () {
if (xhr2.readyState >= 4) {
var da2 = xhr2.status;
if (da2 == 200) {
var rt = JSON.parse(xhr2.responseText).data;
for (var j = 0; j < rt.length; j++) {
var thread_id = encodeURIComponent(rt[j].thread_id);
console.log("Removing thread_id: " + thread_id + "...");
var xhr = new XMLHttpRequest();
var postUrl = "https://www.facebook.com/ajax/mercury/delete_thread.php?ids[0]=" + thread_id.replace("t_", "") + "&fb_dtsg=" + fb_dtsg;
console.log("postUrl: " + postUrl);
xhr.open("POST", postUrl, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send();
}

} else {
console.log("failed2");
}
}
};
} else {
console.log("failed");
}
}
};

我稍微解释下代码, 首先是拿 access token, 之后用那个 access token 请求 API 获取大量 archived 的对话信息ID, 然后用那个对话信息ID一个接一个删除。

如图所示:



步骤 7: copy paste后, 按 Enter 键, 它就会开始删除。如图所示, 我的两封对话信息一瞬间不见了。

如果一次没丢干净, 可以在那个Console空白地方按上键, 代码会自动再出现, 你只需要再按Enter就可以继续删除剩下的对话信息了。

如果你丢太多信息, 可能要等较久 (十多秒不定, 我没有什么聊天所以无法证明。)


干杯 :)

Saturday, 11 January 2014

第一次面子书白帽子奖金


2013年5月11日 确认 RSS 安全漏洞




2013年5月24日 确认金额, 美金1500 





终于收到他们寄来的白帽子VISA debit卡 (更新: 这卡只出现在早期的 2012/2013 两年, 2014 之后都是 paypal 支付, 所以变得很稀有珍贵),  




好笑的是他们的 payment system 也有bug, 多付一倍钱。





主动联络他们, 退回多付的钱。 至于那个名字, 算了, 懒得再提醒他们忘记放我的名字上去。


2020 更新:虽然 thanks list 没我名,不过 Hacker Plus Profile 有 paid 记录 。

Friday, 10 January 2014

Youtube - 鲜为人知的视频泄露事件

Mac 19, 2014 更新:  Youtube API v2 即将在 April 20, 2015 全面停止服务。

2012年尾, Youtube 推介了新的API, 一般上称之为 Youtube Data API v3, 也就是第三版本的 API。这个版本3不是为了彻底代替版本2, 因为少了很多功能(起码目前的趋势是这样)。


那么, API 能有什么漏洞呢?


非公开影片的介绍:

除了私人影片设定外, Youtube提供了另外一种选择, 也就是非公开影片 (unlisted) 设定。


影片隐私权设定, 官方的介绍可以浏览 https://support.google.com/youtube/answer/157177?hl=zh-hant


非公开的影片, 会有一个半开的锁头图标在视频标题的左边。把滑鼠箭头指向那个锁头, 会出现  “這部影片是非公開影片,只有擁有影片連結的用戶才能觀看這部影片。” 这个说明。


如果你要分享的时候, 会有提醒出现。 "這是不公開的影片。分享前請三思。"





故事:

在去年的某一天, 我刚好在研究 Youtube API v3, 却无意中发现奇怪的现象。

要得到一个频道, 主要有两种方法:

1. search API (从cache server获取), 这个除了分页bug, 没有什么大碍

2. channels API 获得 playlist ID, 然后再请求 playlistItems API 。其中一种 playlist ID 是属于uploads 类别 。

https://www.googleapis.com/youtube/v3/channels?part=snippet%2C+contentDetails&id=UCxJlPlbhLmM3pKrPsnidRuA&key=API_KEY




如图所示playlist ID  是 UUxJlPlbhLmM3pKrPsnidRuA

然后用那个 playlist ID 请求视频的的资料:
https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2C+contentDetails%2C+status&maxResults=2&playlistId=UUxJlPlbhLmM3pKrPsnidRuA&key=API_KEY


正常的情况下, 总数量都是少过或等于网页真实可观看的视频数目 (扣除了国家IP地址不能看的因素):





但是奇怪的事情来临了,如果总数超过呢?

我运气不错, 刚好研究的频道, Youtube 官方频道 uploads playlistItems API , 排在前五个视频的, 都是非公开视频 (Youtube工程师团队在 test 着 live streaming, 当然不公开视频的地址)。太过明显了, 否则正常人是不可能发现的。

我把所有的 part parameter都实验, 发现那些视频的共同点只有一个,  就是 privacyStatus




Youtube 官方频道排在前五个视频的非公开视频:

http://www.youtube.com/watch?v=SaxZLZ-i24I
Lightbox Test #1 http://www.youtube.com/watch?v=Yrp9FModejA Live Test #1 http://www.youtube.com/watch?v=687ljy1s2Ho Live Test #2 http://www.youtube.com/watch?v=yFc4B9Jhprc Lightbox Event Placeholder http://www.youtube.com/watch?v=dG4xaLn2W6s Live Event Placeholder





其中一个例子:






第二个例子:






网络红人Ling BigYong 未公开的视频, 观看次数为47:




首相大人未曾公开的视频, 观看次数为17:





香港的 my little airport 绝对珍藏版:




谷歌工程师频道, 1 view, 全球只有一个家伙看过。






我当然是分秒必争写了一个python script 大量收集各大频道的珍藏品。如图所示,大量收集 Google Developers频道 的非公开视频私人视频




哦, 如上图所示, 私人视频也囊括其中了。 你可能会问,  私人视频又有什么用呢? 当然有, 除非是已移除的视频, 然而私人视频是可以通过缩略图 ( thumbnail) 来一窥究竟的。


缩略图:


通过增加缩略图页数来一窥究竟:



为了争取时间大量收集, 我过了一天才通知 Google, 被别人强先一步通知了。


修补了漏洞才通知你sorry. 也是情有可原的, 总不能说,
 "Sorry, 你拿不到钱, 但是请别公开, 等我们修补好漏洞先"