文章目录
  1. 1. PT bug fix report
    1. 1.1. Ⅰ. 随机获取passkey漏洞
    2. 1.2. Ⅱ. POST注入漏洞

虎踞龙盘PT站是东南大学虎踞龙盘BBS下属的PT站,面向东南大学学子开放。于2010年11月正式运行,主要提供东 南大学内部学生下载娱乐资源,学习资源,是校内继ftp共享资源系统之后重要的共享平台。当前注册人数已达到8,558人,tracker同伴数维持在30000左右,种子数11,402,总种子为53.199 TB,下载量为40TB,总数据量为2.378 PB(截止到2012年1月8日)。当前虎踞龙蟠PT在站务组的精心维护下已经成为南京高校中重要的PT下载网站。东南大学学生可以通过BBS账号直接登录虎踞龙盘PT站下载共享资源。我也有去下载不少东西,下载速度刷刷的,经常是15MB/s+,是的,你没看错,是MB。

不过在使用的过程中,也发现了一些漏洞,有大有小,其中有的无伤大雅,有的则比较严重。现挑选两个比较严重的漏洞进行详细介绍,供类似的PT站或者PHP开发人员学习交流。

以下提及的所有漏洞本人均已联系虎踞龙盘PT站的管理组,并进行了修复工作,大家别再尝试了,笑。
下面正式开始,懒得再写了,直接贴PT bug fix report里的内容了。

PT bug fix report

Ⅰ. 随机获取passkey漏洞

1.存在漏洞页面:

/pt/download.php

2.问题描述:

使用32个0(其实任意长度的0都一样)作为passkey(非法passkey),能够正常下载资源,上传下载量计算在某中枪的特定用户账号上.

可用以下链接进行测试

1
http://bbs.seu.edu.cn/pt/download.php?id= 16580&passkey=00000000000000000000000000000000

下面给出我测试的图

如上图所示,我成功下载了一个种子并且正常的进行了下载,而流量算到了倒霉的gfan用户头上。而且更严重的是,我获取到了他的passkey(种子里有),这样我以后下载任何东西就可以直接用他的passkey构造一个合法的请求来获得种子,可怕。

3.问题原因:
以上述为例,原download.php处理页面提交上述get参数后,得到的mysql查询语句是

1
SELECT * FROM users WHERE passkey=00000000000000000000000000000000 LIMIT 1

是的,你没看错,没加单引号,原来代码就是这样写的。当然如果这样查询一些正常的passkey的话,也没问题。关键就是如果恶意提交多个0的话,上述语句就变成了:

1
SELECT * FROM users WHERE passkey=00000000000000000000000000000000 LIMIT 1

等同于

1
SELECT * FROM users WHERE passkey=0 LIMIT 1

进一步等同于

1
SELECT * FROM users WHERE passkey=FALSE LIMIT 1

而就mysql数据库而言,对于varchar型数据只有字符串“1”是认为布尔值为true,其余所有的字符串数据均认为布尔值是false(很奇怪是不,我也这么觉得)

这样的话整个库中所有passkey字段值不为“1”的记录全部被select出,而检出结果就是非空,满足了if (!$user)的条件,后续操作得以正常进行。

4.修复方法:

简单点可以直接补上单引号,限定为字符串型数据,即这样:

1
"SELECT * FROM users WHERE passkey='". sqlesc($passkey)."' LIMIT 1";

高大上一点,可以用php自带的过滤函数(原sqlesc过滤考虑的不周全)mysql_real_escape_string来替换,直接把0这样的特殊字符给过滤掉。

Ⅱ. POST注入漏洞

1.存在漏洞页面:

/pt/thanks.php

2.问题描述:

存在POST注入漏洞,可以进行mysql注入攻击. 测试提交post数据 “-1 union select version()>4”.

3.问题原因:

1
2
3
4
5
6
7
//thanks.php
if ($_GET['id'])
stderr("Party is over!", "This trick doesn't work anymore. You need to click the button!");
$userid = $CURUSER["id"];
$torrentid = $_POST["id"];
$tsql = sql_query("SELECT owner FROM torrents where id=$torrentid");
$arr = mysql_fetch_array($tsql);

很明显,只对get数据进行了处理,而没有处理POST数据。

4.修复方法:

对post数据进行处理。

文章目录
  1. 1. PT bug fix report
    1. 1.1. Ⅰ. 随机获取passkey漏洞
    2. 1.2. Ⅱ. POST注入漏洞