fancybox xss漏洞导致html转义无效

从老的1.3.4到新的2.0.7都有影响

验证:
如果对以下地址使用fancybox,当fancybox打开时会触发脚本。
xss

原理:
fancybox在取title的时候取的是$(obj).attr(‘title’),没有进行转义就拼接进结果中。导致即使原代码进行了转义,在使用了fancybox时依旧会产生xss

解决方法:
1、停止使用title特性
2、修改_format_title函数,将title进行转义

Yet Another Aria2 Web Frontend

aria2是个好软件,多线程,HTTP/FTP/BT通吃,参数设置丰富,功能强大。在我的TL-WR703n上比transmission快多了。

看了官网上的3个web前端,两个是php的,一个是c的。先不说c的那个界面。。php我尝试在路由上跑,依赖实在太多。
简单man了一下aria2,这货明明可以JSON-RPC的啊,根本就用不着后端啊! 于是,就有了这个坑——YAAW。

YAAW简介

YAAW - Yet Another Aria2 Web Frontend
是一个纯前端实现的Aria2 Web前端界面。无需架设任何服务器,只需要在浏览器中打开即刻使用。

链接

首页/demo: http://binux.github.com/yaaw/
GitHub: https://github.com/binux/yaaw

Dropbox Uploader Script

Dropbox全平台并且各种工具齐全,在各个主机上都在用。用Dropbox备份VPS上的数据也很方便,但是之前看到的脚本都需要填写用户名密码,迟迟不敢用。。

这里推荐这个使用API的Dropbox上传脚本,通过设置沙盒,把备份目录限制在应用中,保证其他文件的安全。
而且这个脚本是用curl驱动的,只有一个文件,在linux平台下毫无压力。

Home page: http://www.andreafabrizi.it/?dropbox_uploader
github: https://github.com/andreafabrizi/Dropbox-Uploader
原始版本是需要完全权限的,我fork了一个带沙盒限制的版本: github: https://github.com/binux/Dropbox-Uploader

使用方法:
第一次启动的时候会指引你去Dropbox创建一个应用,按照指引操作即可。

上传: ./dropbox_uploader.sh upload [LOCAL_FILE]
下载: ./dropbox_uploader.sh download [REMOTE_FILE]
删除: ./dropbox_uploader.sh delete [REMOTE_FILE]

迅雷Hash算法分析

从迅雷离线获得的地址中,存在着大量的Hash值,这些hash看似都是base64,sha1,md5但却有所不同。
比如这是一个典型的离线地址

http://gdl.lixian.vip.xunlei.com/download?
fid=3KUoDlBy9IotAFn5vQAHc5VUIgKiwSgmAAAAAHYA3duVUUeWgaJI4JGu5syK9PLK&     // base64: 与cid,size,gcid相关(size为小字节序)
mid=666&                                        // maybe: always 666
threshold=150&                                  // maybe: always 150
tid=A950BAE38A2E7398186D4127315DB76F            // unknow: 256bit relate with size
srcid=4                                         // maybe: always 4
verno=1                                         // maybe: always 1
g=7600DDDB9551479681A248E091AEE6CC8AF4F2CA&     // gcid: for normal download gcid == cid
scn=c7&                                         // section
i=3547930B96AFA7B0A1CFCC80D516ADE97A34DAE0&     // cid == infoid == btih == ed2k hash, files share a same cid in a bt task, cid is the btih of the torrent
t=6&                                            // type: 1=normal 4=ed2k 6=bt
ui=18×××9640&                                  //userid
ti=33742×××247&                                //tid from get free url
s=640205218&                                    //totalByte
m=0&                                            // mayby: always 0
n=01324486025B4775690D459D7F43726F770F6CBF6F345D5B46347DA817445D5B422876D1025B783236556EA51C335D2E6D0A47E45F00000000     // filename

根据已有的数据分析/比对,大致各个字段的含义已经标识出来了。其中除了ui,ti是与用户相关的变元,cid是来源相关的变元,其他的字段对于某一个文件来说一般是相同的。

cid

算法源码:

def cid_hash_file(path):
    h = hashlib.sha1()
    size = os.path.getsize(path)
    with open(path, 'rb') as stream:
        if size < 0xF000:
            h.update(stream.read())
        else:
            h.update(stream.read(0x5000))
            stream.seek(size/3)
            h.update(stream.read(0x5000))
            stream.seek(size-0x5000)
            h.update(stream.read(0x5000))
    return h.hexdigest().upper()

算法来自于https://github.com/iambus/xunlei-lixian
在api中,cid主要用于文件的索引。观察代码可知,cid并没有hash整个文件,而是根据文件的头/中/尾部的0x5000字节的内容计算Hash。这样就可以在不下载完整个文件,就能够查询到其他服务器上可能的相同文件。于是在下载支持range的文件的时候,即使该地址没有被索引到,但是通过cid,依旧可以被p2sp加速。
当然了,由于没有hash整个文件,文件在事实上有可能是不同的,那么根据下面这个gcid就可以唯一确定一个文件了。

gcid

def gcid_hash_file(path):
    h = hashlib.sha1()
    size = os.path.getsize(path)
    psize = 0x40000
    while size / psize > 0x200 and psize < 0x200000:
        psize = psize << 1
    with open(path, 'rb') as stream:
        data = stream.read(psize)
        while data:
            h.update(hashlib.sha1(data).digest())
            data = stream.read(psize)
    return h.hexdigest().upper()

这个算法是我完全没有通过逆向黑盒分析而来,虽然没有做完整的测试,但是一般来说是正确的。。分析借助了loli.lu的18万个已有文件的数据,以及迅雷咖啡吧上的一句话:“如果文件很大,则计算gcid非常耗时,因此可以在大文件传输过程中计算gcid,文件传输完毕,则gcid也计算好了“。。
gcid的作用是文件的唯一键,在迅雷服务器上唯一确定一个文件。可以说,只要有了gcid,实际上是可以任意下载到需要的文件的。算法采用了分片hash再二次sha1的算法。。猜测原因是因为分片被限制在512个一下,当hash较大文件的时候,可以边下载边hash,再在最后hash那个不到512*20字节的串即可,当文件下载完成的时候就能立即得出gcid。还有一个原因是bt文件也是用sha1分片Hash的,那么获得种子文件也就同时有可能获得gcid了。同时,如果迅雷服务器保存了每个分片的sha1 hash的话,那么在下载通过cid匹配的文件同时,就能同时比较各个分片是否正确,以此保证最终结果。

fid

算法如下:

def parse_fid(fid):
    cid, size, gcid = struct.unpack("<20sq20s", fid.decode("base64"))
    return cid.encode("hex").upper(), size, gcid.encode("hex").upper()

def gen_fid(cid, size, gcid):
    return struct.pack("<20sq20s", cid.decode("hex"), size, gcid.decode("hex")).encode("base64").strip()

首先这很明显是一个base64,但是一开始我并没有发现她们和cid,size,gcid的关系,直到我膝盖中了一箭。。
fid就是cid,size,gcid的二进制然后再base64而已。但是有了fid,神马cid,size,gcid这三大要素都不是问题了。应该是用于api分析url的便利,所做的一个接口性参数。

tid

未知算法。
根据18万的文件数据,唯一能够知道的是,这个tid和文件大小一一对应。。size相同的文件tid一定相同,但是又不是size的直接hash,目前来说完全不知道这个参数的意义何在。。
如果有兴趣,您可以在https://github.com/binux/lixian.xunlei/blob/master/tid.dict文件里面找到目前已知的映射。。如果分析出算法了请务必告诉我。

n

算法源码:

thunder_filename_mask = "6131E45F00000000".decode("hex")
def thunder_filename_encode(filename, encoding="gbk"):
    if isinstance(filename, unicode):
        filename = filename.encode(encoding)
    result = ["01", ]
    for i, word in enumerate(filename):
        mask = thunder_filename_mask[i%len(thunder_filename_mask)]
        result.append("%02X" % (ord(word)^ord(mask)))
    while len(result) % 8 != 1:
        mask = thunder_filename_mask[len(result)%len(thunder_filename_mask)-1]
        result.append("%02X" % ord(mask))
    return "".join(result)

def thunder_filename_decode(code, encoding="gbk"):
    assert code.startswith("01")
    result = []
    for i, word in enumerate(code[2:].decode("hex")):
        mask = thunder_filename_mask[i%len(thunder_filename_mask)]
        result.append(chr(ord(word)^ord(mask)))
    result = "".join(result).rstrip("\0")
    return result.decode(encoding)

算法来源于+Zhang Youfu。简单来说这个参数就是将文件名各位用掩码进行了简单转换而已,中文的编码与最终输出的header中的相同,既编码采用utf8,最终输出的也是utf8,值得指出的是默认的编码是gbk的。迅雷在输出文件名时会截断较长的文件名,但是实际上通过传递完整的n参数,可以无视这个限制。在binux/ThunderLixianExporter还有一个js版本的实现。

总结

由上面的分析可见,一个文件的离线地址完全就是根据文件的信息生成的,于是你发现了什么?对了,完全不需要通过迅雷服务器我们就可以生成自己的离线地址!如果这个文件在迅雷服务器上存在,我们可以直接下载回来!(等等,你说n。。那不就是文件名嘛。。我只关心内容。。文件名这种小问题。。)
说到做到,您可以通过https://github.com/binux/lixian.xunlei/blob/master/check_file.py这个文件直接计算出文件的cid,gcid,fid,如果可能的话也能计算出tid。
然后,把fake_url添加到迅雷软件里面。然后。。就可以直接下载了!可以开启高速通道,可以在快盘秒传,运气好可以开启离线秒传。。。
over

一个网盘的终结(?)及由其而生的思考的思考

标题是思考的思考的原因是《一个网盘的终结(?)及由其而生的思考—JSharer或宣布长期暂停服务》这样一篇文章。
在JShare还叫JShare的时候,就知道这样一个有责远大理想,而且界面很漂亮的网盘。虽然很少会去收集稀有物,所以很少去,但是深知寻找资源的不易,特别是当需要的时候。。

标题一定要写的生存战略マル~》这是电磁猫那边的公告帖。生存战略这个词准确的反映了网盘的最大的问题——生存。

一、钱

在二次元概念范围内,我一般都避免谈及这个词,这个即使在三次元中都俗到不行的词。但是,没有钱是不成的,网盘是很烧钱的。
爱吗?二次元不缺少爱,但是用爱能支撑一个论坛,支撑一个PT/BT,支撑几个内部FTP,但是支撑不起网盘; 网盘所需要的服务器,带宽都太多了,太花钱了。我相信,即使是115、腾讯、迅雷,单就网盘业务来说几乎肯定是亏损的,但是作为产品链中的一环,他们能通过其他业务支撑起这项服务,但是一个ACG向的网盘,难!

解决的办法只有两个:

1.弄到钱

这很显而易见不是吗。如果能弄到钱就能做下去啦。
但是,收钱只有两种办法,向用户收,向第三方收。

在中国,向用户收钱难,太难了。免费午餐吃惯了的中国网民,看到一个资源只会伸手,下载不了不骂娘就得感谢了。
即使对于有爱的人士来说,VIP收费+免费的模式是可以接受的,但是会有多少人付费?是否足以支撑这个项目?我个人认为难。

向第三方收钱,最简单的例子就是广告了,但是依旧存在够不够烧的问题。
要知道对于一个点击,网盘可能需要付出的是1G的流量,换来的不过是不足0.5%的概率点击广告;这样的成本还是很难消化。

2.减低运营成本

既然没钱,那就少花一点。

P2P

比如漏勺就有这样的尝试,但是包括BT,PT,电驴的所有P2P方式都有一点硬伤——Peer:

  • 持续性 没法保证资源长时间在网存活,PT可以通过定期重新发布+免费来再次刺激下载,激活资源,可能会好一些

  • 速度稳定 当Peer少的时候,速度依赖于Peer的网络状况

  • 时间稳定 资源是否可以下载依赖于在线的Peer,但是并不是任何时段都有种子,或者有足够的种子在线

以上这些问题,在遇到冷门资源的时候更加明显,无种/速度/并不是随时可以下载,即使是采用了比较先进的管理方式的PT依旧存在。
但是,作为一个以“实现ACG资源长久分享的长期计划,目标是解决在资源分享的过程中一直存在的资源保存不便现状”的ACG网盘来说,冷门的问题依旧需要服务器和带宽资源来解决。
当然了,P2P对于热门资源的解决能力依旧是可以借鉴的,毕竟互联网中的2/8法则在这应该也是基本适用的。

网盘中转

这是我在做了loli.lu之后的想法。
既然P2P无法保证一致的网络状况,自己又无法支撑网盘的资源开销,那就去用别人的网盘就好了。
每一份资源在本地服务器上保留一份,然后上传到别的网盘中,用户再通过别的网盘下载。由于网盘实际上不会真正删除他们服务器上的文件,并且存在秒传这样的机制,过期/重传这样的问题实际是可以解决的。
那么,通过别的网盘,我们在保留资源持续有效的同时,通过提供多个网盘的下载,也能适应各种不同的网络环境和保持一致的下载体验。

当然,缺点也是有的,这样的行为不可能被其他网盘官方许可,也就是说存在用户方针风险。

二、版权

这又是掌握着网盘命脉的,至关重要的资源。
ACG向网盘由于自身特点,注定存在大量的非法版权的内容,注定会受到政策的影响。更加上内容是保存在服务器上的,也不接受用户私人数据,于是很难逃避版权方面的限制。
找避风港或是寻找借口,决定了这个项目的生存能力。可能转向小众是解决这个问题的一般可行办法,但是能支撑多久,天知道。

ACG向网盘是个碉堡了的事情,但是真正做起来,难,太难了。

让非会员也能使用kuai.xunlei.com的添加网络文件功能

没什么用的功能一则:
让非会员也能使用kuai.xunlei.com的添加网络文件功能。

访问kuai.xunlei.com,登录,然后将下面的脚本粘贴到地址栏中执行即可:

javascript:$('#add_internet_file_btn').unbind().click(function(){$('#add_internet_file_layer').fadeIn();$('#add_internet_file_layer .addingtips').hide();$('#add_internet_file_layer .apply_submit_btn').show();});

似乎这样就可以用xunlei来免费加速了,不支持BT是一大遗憾。

利用特定版本PHP对query处理不一致,实现Chrome’s Anti-XSS绕过

完全是为了需要发现的,以至于bypass这个词也是第一次见到。。这个漏洞利用了Chrome和PHP对于请求URL处理上的不一致,对于Chrome不认为是query请求的连接,被PHP当作query部分正常处理了,以此来绕过Chrome的XSS过滤。

受影响的浏览器和版本:
Google Chrome - 16.0.912.63 beta
Firefox - 9.0.1
Safari - 未亲自测试
Opera - 未亲自测试

不受影响的浏览器:
IE10 - 未亲自测试,有截图

漏洞尚在使用中…
绝对不是什么不好的用途啦..

826b1112bf8521831b04b2e2985f81ab

VPS配置记录(一)

一直想弄个VPS来玩,但都没有下定决心,随着人民币升值VPS变得更廉价,加上最近看到yardvps的圣诞节20%续费优惠码,算下来一个512M XEN的VPS也不过40RMB/月了。去除省去的VPN的钱,还算不错,于是决定入手一个玩玩。

稍微介绍一下吧,yardvps (推介链接),是无管理型的VPS提供商,机房位于洛杉矶,支持支付宝支付
我选的这个VPS配置如下:

  • 内存:512 MB

  • SWAP:1 GB

  • CPU: 1 个 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz

  • 硬盘: 20GB

  • 流量: 1500GB

  • 原生IPV6、PPTP VPN

由于有中文页面和新浪微博+支付宝,简直就是为中国人打造的。速度方面各地都不一样,到国内骨干网能有200-300KB/S的速度。但是在我这(北京联通)还是挺悲剧的,也就30KB/S的样子,而且丢包严重。。虽然也有其他地区朋友说速度不错。。不过最好还是亲自测试以下为好
官方测速100M位于我服务器上的文件

好,推介到此结束,下面正式开始,服务器系统用的是ArchLinux 64位版本,因为用得比较习惯了。。而且默认配置文件的分布还是比较舒服的。。

添加用户

用adduser的交互式用户添加,比起useradd各种命令参数省心很多:

[root@localhost http]# adduser
Login name for new user []: binux
User ID ('UID') [ defaults to next available ]: 
Initial group [ users ]: 
Additional groups (comma separated) []: bin,daemon,sys,adm,disk,wheel,log,audio
Home directory [ /home/binux ] 
Shell [ /bin/bash ] 
Expiry date (YYYY-MM-DD) []: 

New account will be created as follows:
---------------------------------------
Login name.......:  binux
UID..............:  [ Next available ]
Initial group....:  users
Additional groups:  bin,daemon,sys,adm,disk,wheel,log,audio
Home directory...:  /home/binux
Shell............:  /bin/bash
Expiry date......:  [ Never ]

This is it... if you want to bail out, hit Control-C.  Otherwise, press
ENTER to go ahead and make the account.

/etc/sudoers

由于我都是用sshkey验证登录的,总是不记得密码,于是给wheel组加上了免密码sudo,至于为什么不直接用root是因为这样可以防止手抖。。

[root@localhost binux]# sudoedit /etc/sudoers

## Same thing without a password
-# %wheel ALL=(ALL) NOPASSWD: ALL
+%wheel ALL=(ALL) NOPASSWD: ALL

## Uncomment to allow members of group sudo to execute any command
-# %sudo   ALL=(ALL) ALL
+%sudo   ALL=(ALL) ALL

然后就是改掉密码什么的

pacman && python && vim

随手打开一些源

[root@localhost ~]# vi /etc/pacman.d/mirrorlist
Server = http://mirrors.kernel.org/archlinux/$repo/os/$arch





[root@localhost ~]# pacman -Sy
[root@localhost ~]# pacman -S python
[root@localhost ~]# pacman -S python2
[root@localhost ~]# pacman -S vim

nginx

pacman -S nginx





[root@localhost ~]# vim /etc/nginx/conf/nginx.conf

-#user http;
+user http;

-    #keepalive_timeout  65;
+    keepalive_timeout  20;

-    #gzip  on;
+    gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
-            root   http;
+            root   /srv/http;
            index  index.html index.htm;
            autoindex on;
        }

     }

+    include vhost/*.conf;

这里我们已经把nginx的目录统一放到/srv/http下了。为了让nginx所在的http组也能访问修改这个路径,把这个目录的所有人改成http,然后将binux也加入这个组来修改里面的文件。
然后建立vhost目录,然后include到主配置中来,为了以后方便添加虚拟主机。

[root@localhost conf]# cd /etc/nginx/conf/
[root@localhost conf]# mkdir vhost

[root@localhost conf]# cd /srv/
[root@localhost srv]# chown http:http http
[root@localhost srv]# chmod 775 http
[root@localhost srv]# usermod -a -G http binux

[root@localhost srv]# rc.d start nginx

PPTP Server

参考:https://wiki.archlinux.org/index.php/PPTP_Server_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

[root@localhost ~]# pacman -S pptpd
[root@localhost ~]# vim /etc/pptpd.conf

+3行
option /etc/ppp/pptpd-options
localip 172.16.36.1
remoteip 172.16.36.2-254

[root@localhost ~]# vim /etc/ppp/pptpd-options

+14行
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
ms-dns 8.8.8.8
ms-dns 8.8.4.4

[root@localhost ~]# vim /etc/ppp/chap-secrets

+binux   pptpd   passwd  *

[root@localhost ~]# vim /etc/sysctl.conf

# Disable packet forwarding
-net.ipv4.ip_forward=0
+net.ipv4.ip_forward=1

[root@localhost ~]# iptables -A INPUT -i ppp+ -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -o ppp+ -j ACCEPT

[root@localhost ~]# iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p 47 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p 47 -j ACCEPT

[root@localhost ~]# iptables -F FORWARD
[root@localhost ~]# iptables -A FORWARD -j ACCEPT
[root@localhost ~]# iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE
[root@localhost ~]# iptables -A POSTROUTING -t nat -o ppp+ -j MASQUERADE

[root@localhost ~]# rc.d save iptables

然后在线启用端口转发,然后可以启用pptpd了。

echo 1 >/proc/sys/net/ipv4/ip_forward
rc.d start pptpd

[教程] 如何下载loli.lu的资源 For Windows

loli.lu已关闭!
如需使用迅雷会员功能,请购买迅雷会员服务
如需在OSX,Linux环境下下载迅雷离线,请参阅ThunderLixianExporter

迅雷从早期的多线程下载,到P2SP多服务器下载,然后各种P2P吸血,到最后的迅雷离线服务,确确实实地建立起了一个互联网资源数据库。
无论是热门新番,还是上古时代的里番,几乎都能在迅雷的硬盘上找到,即使种子无人做种,即使ed2k没有资源,只要你付费,迅雷离线几乎都能满足你的欲望。

但是要让迅雷的吸血流氓客户端 钻进计算姬的身体里,总是觉得不舒服。于是我们有用回了干净清爽“少功能”的多线程下载软件。
ACG圈内听说的比较多的就是IDM(Internet Download Manager)了。

于是这篇windows教程就说说怎么用IDM下载loli.lu的资源。。不过首先让我们扔掉那恼人的IE吧。。

工具介绍

IDM

IDM是一个多线程下载软件。没了。。对真的没了。
没了就是这个东西的优势所在,没有乱七八糟的广告,没有没有必要的功能,一次付费破解终身适用。
IDM将多线程发挥到极致,自动的续传判断,自动的最大可开启线程数判断,资源嗅探,多浏览器支持等特性,是迅雷很好的替换。

您可以很容易的从互联网上寻找到付费破解方式。。(我也不知道现在用的版本是哪里来的了)

loli.lu

是我所编写的开源项目,旨在帮助Linux和MAC用户更好的适用迅雷离线的丰富资源。在Martian支持下提供的ACG离线内容分享服务。
通过这个项目的中转,你可以免费获得可供下载的迅雷离线地址,并且可以将地址分享给好友进行下载。

获取下载链接

访问:https://loli.lu/,点击右上角的登录,使用Google账户授权:
login

点击想要下载的资源,然后在批量下载对话框中选择“IDM导出”

将导出文件保存到本地,然后打开“IDM > 任务 > 导入 > 从IDM导出文件”

选择刚才下载到的文件,确认下链接确认就可以了。
注意,这个时候任务并不会立即开始,请到任务列表的最下端手动恢复任务。

好了,现在试试能不能满速下载吧:)

如果您每次都是使用“IDM导出”功能进行下载,是没有必要安装插件的,这时候您可以点击左边栏的“我无须使用浏览器下载功能”链接来关闭红色的文字提示,并且可以显示tag列表。

添加资源

在登录后就可以在右上角找到添加资源的链接啦
bar
add task
当然了,如果觉得麻烦,也可以直接填写链接获得高速下载链接:
add task 2

对了,及时不是发布资源,获得的下载链接依旧可以分享给好友,只需要点击分享按钮,将链接复制给好友就可以了。
当然你也可以适用我们的一键分享功能:
share

IE难伺候啊

一开始还想要为loli.lu添加IE支持的,但是用linux习惯了,一直没有切到windows下看一眼loli.lu实际的效果,只是做了IE8版本以下的限制。

于是,我错了,即使在IE8之下。。

完全就是一团糟嘛!圆角,文字旋转不支持就算了。media query不支持,饿。。完全没法看啊这!

也就是简单点的页面好一些,稍微可用。

====================
不过好消息是IE9页面基本正常了。。于是,支持到IE9吧,反正IE也没插件,无法直接浏览器下载资源,直接蓝屏给你看!

蓝屏,蓝屏。。额。。。。。。。。。。。。。好吧,蓝屏页面在IE下也没法看。。
IE我真的伤不起啊。。