2007年10月31日星期三

[Tips]DOM Based Cross Site Scripting

by Superhei
http://www.ph4nt0m.org
2007-11-01

现在xss非常流行.而且跑xss的工具到处都是,导致就和sqlinj一样,很多大站 基本很难找到很明显的xss bug了,以往我们查找xss 一般都黑盒,而且效果很明显,对于白盒,一般都是基于Server language如[php/asp/jsp ....]查找变量输出语句如:print/echo ....等.

今天刚看看大牛Amit Klein在2005写[DOM Based Cross Site Scripting or XSS of the Third Kind]:http://www.webappsec.org/projects/articles/071105.html 提到的DOM的xss比上面提到的那些更加难以发现,就luoluo牛说的找基于dom的xss才是王道 :)
找这类的xss需要分析js本身的代码,这样我们可以就和分析Server language的一些漏洞一样分析js了: 就和php等一样漏洞的产生是: 变量--->输出函数 ,而js是 变量--->输出给浏览器那么我们要找dom-xss就是分析变量的'提取'和'输出'语句了

比如变量的'输出'给浏览器执行的一些对象:document.write,eval ...等等
变量'输入/提取':document的一些对象 如document.URL document.location ...等等

就和Amit Klein文章里列举的那些:

2. Analyzing and hardening the client side (Javascript) code. Reference to DOM objects that may be influenced by the user (attacker) should be inspected, including (but not limited to):

document.URL
document.URLUnencoded
document.location (and many of its properties)
document.referrer
window.location (and many of its properties)
Note that a document object property or a window object property may be referenced syntactically in many ways - explicitly (e.g. window.location), implicitly (e.g. location), or via obtaining a handle to a window and using it (e.g. handle_to_some_window.location).

Special attention should be given to scenarios wherein the DOM is modified, either explicitly or potentially, either via raw access to the HTML or via access to the DOM itself, e.g. (by no means an exhaustive list, there are probably various browser extensions):

Write raw HTML, e.g.:
document.write(…)
document.writeln(…)
document.body.innerHtml=…
Directly modifying the DOM (including DHTML events), e.g.:
document.forms[0].action=… (and various other collections)
document.attachEvent(…)
document.create…(…)
document.execCommand(…)
document.body. … (accessing the DOM through the body object)
window.attachEvent(…)
Replacing the document URL, e.g.:
document.location=… (and assigning to location’s href, host and hostname)
document.location.hostname=…
document.location.replace(…)
document.location.assign(…)
document.URL=…
window.navigate(…)
Opening/modifying a window, e.g.:
document.open(…)
window.open(…)
window.location.href=… (and assigning to location’s href, host and hostname)
Directly executing script, e.g.:
eval(…)
window.execScript(…)
window.setInterval(…)
window.setTimeout(…)


那么我们分析dom-xss就可以直接分析那些js的函数了,那么我们怎么分析呢,和PHP等一样我们可以用grep等一些静态的方法,那么动态的方法呢? 可以使用基于proxy的中间自动fuzz,还有luoluo提出的js函数的'hook'等等 ...期待luoluo牛的fuzz-tool

另外在利用或者触发dom-xss要注意一个js的特点就是[js闭合标签优先]:http://superhei.blogbus.com/logs/10073294.html的特点.
最后感谢luoluo牛的耐心的指导,还有jx分享他的0day :)

2007年10月7日星期日

[Tips]A new way to inject backdoor in PHPWind

by superhei
2007-10-08
http://www.ph4nt0m.org

Text Mode

pw的一个放后门的方式

data\bbscache\admin_record.php是记录后台登陆和操作的,我们看看是怎么操作这个文件的:

admin\admincp.php:

$bbsrecordfile=D_P."data/bbscache/admin_record.php";
if(!file_exists($bbsrecordfile)){
    writeover(
$bbsrecordfile,"<?php die;?>\n");
}
//这个if只是说如果不存在admin_record.php 就用代码生成一个

如果我们只是编辑admin_record.php 把
<?php die;?>

这个给删除呢 :)

我们看下我们的代码杂写入admin_record.php的

你在后台登陆http://localhost/PHPWind_GBK_6.0RC/upload/admin.php
随便用个错误的用户登陆 就会有如下记录:

|admin|s|Logging Failed|127.0.0.1|1191667510|

呵呵 所以我们可以通过这个写入我们的代码,不过这里是有过滤的 不可以用<

所以我们的后门应该这样留:
<?php die;?>

改为
<?php /*die;?>

2007年10月1日星期一

[Tips]RSA非对称加密的一些非常规应用

author: 云舒
date: 2007-10-01
http://www.ph4nt0m.org

Text Mode

可以随意转载,但是必须保留ph4nt0m的版权所有,谢绝商业用途。

前些时候,大概7月份看了些SSL协议的东西,对前人非常的佩服。把非对称加密的安全性和对称加密的快速性结合起来使用,保留了各自的长处。整个数据传输过程中,通过非对称加密在不安全的区域安全的传输了用于对称加密的密钥,实在是创造性的思维。

前天晚上洗澡的时候,突然有了几个新的想法,加上以前的一点发现,就有了这篇文章和几行代码。现在觉得非对称加密还真的很有意思啊,洗澡也很有意思,难怪阿基米德洗澡能够发现浮力定理。我们不够强大,可能是因为洗澡不够吧。

一. RSA替换HTTPS保证安全传输敏感数据

目前大多数的web应用在注册或者登录的时候,或者其他任何涉及到用户帐户,密码,以及信用卡号等等敏感数据传输的时候,一般都毫不犹豫的采用了 HTTPS加密传输的方式来进行。比如Gmail,Yahoo Mail,Live Mail等国际性的邮箱,都是用了这种方式。确实,使用HTTPS是一种比较安全的方法,但是这样做从成本角度来说,并不是最优的。

使用1024位密钥的HTTPS传输,在相同硬件配置的情况下,性能基本上要损失掉30%左右。大量的CPU时间花费到了对数据的加密解密以及证书认证,传输,SSL握手等方面。对于千万用户级别的应用这些损失是难以忽略掉的,因此大公司一般都会购买SSL硬件加密卡,使用硬件进行加密解密。

鉴于RSA等非对称加密算法的public key是可以公开的,因此可以使用这种方式来传输数据,在某些场合取代昂贵的HTTPS传输。比如在邮箱的登录入口,用户点击提交按钮的时候,在本地使用 JS代码将用户名和密码进行RSA加密。虽然public key明文存在于JS代码中,客户端可见,但是仅仅具备public key是无法推算出private key的,因此无法对加密后的数据进行捕获分析,加密后的数据可以安全的通过互联网传输。

前些时间对国内国外的一些大型网站登录入口做了些分析,发现只有tencent的邮箱是使用的这种方式。他们用JS做了一个类,提供RSA加密算法的各种方法,在邮箱登录表单提交的时候调用加密。JS类的地址为http://mail.qq.com/zh_CN/htmledition2/js/safeauth.js,有兴趣的可以自己去研究。使用这种方式之后,服务端的计算量大大减少,只需要在用户提交的时候进行一次解密操作就可以了。而且这个解密,可以使用C语言做成模块,给前端展现语言调用,提高效率。如果有更高的安全性考虑,可以做一些改进,比如在客户端提交表单之前,在发送数据里面加入完整性检验等等,自由发挥即可。

二. 独立的水印系统

现在的论坛或者blog,都需要使用水印来防范强行破解密码的攻击方式,和防范发帖机器人的破坏。但是很多水印和应用系统结合在一起,不方便扩充和给第三方提供服务。这几天想到可以使用RSA加密来实现一套独立的水印算法,并且可以方便的提供给任意的第三方安全使用。

主要思路是这样的,首先生成一对公钥和私钥。将公钥发布给需要使用水印服务的第三方,私钥保存在水印生成方。在使用方随机生成一个字符串,随后使用水印方提供的public key,使用RSA算法进行加密,将加密后的字符串发送给生成水印方。生成方使用private key对这个字符串进行解密,画出图形,将数据传输给水印使用方。虽然加密后的字符串在水印使用方的HTML源代码中明文可见,但是同上所说的,没有 private key是无法解密的。对于安全性的一些加强,可以考虑同时在使用方与生成方之间共享一个用于对称加密的字符串。先对随机生成的水印数字进行对称加密,然后再RSA非对称加密,这样可以在万一丢失private key的情况下,仍然不容易马上被攻破。

为了验证我的这个思路,今天写了一小段验证代码,发现还是比较好用的。我主要是把Pear里面的RSA类扒出来了,稍微改了一点点,然后做了一套测试系统。简单的代码如下,详细的见附件。

代码:

/*

Global.php  通用函数,调用RSA类提供加密解密功能。

云舒 , 2007年10月1日

*/
function encrypt( $plain_text )
{
    
$public_key = 'YTozOntpOjA7czozMjoiS1vW5NNLH39farB+HPE/U0A1fs1I7ja81GJxGrrjsYEiO2k6MTtzOjM6IgEAASI7aToyO3M6NjoicHVibGljIjt9';
    
    
$key = Crypt_RSA_Key::fromString($public_key);
    check_error(
$key);
    
$rsa_obj = new Crypt_RSA;
    check_error(
$rsa_obj);

    
$enc_text = $rsa_obj->encrypt($plain_text, $key);
    check_error(
$rsa_obj);
    
    
return $enc_text;
}

function decrypt( $enc_text )
{
    
$private_key = "YTozOntpOjA7czozMjoiS1vW5NNLH39farB+HPE/U0A1fs1I7ja81GJxGrrjsYEiO2k6MTtzOjMyOiIButTavL72eeXVEa8E5WkAJthoHqmHIyo3HblsSJG0aiI7aToyO3M6NzoicHJpdmF0ZSI7fQ==";
    
    
$key = Crypt_RSA_Key::fromString($private_key);
    check_error(
$key);
    
$rsa_obj = new Crypt_RSA;
    check_error(
$rsa_obj);
    
$rsa_obj->setParams(array('dec_key' => $key));
    check_error(
$rsa_obj);

    
$number = $rsa_obj->decrypt($enc_text);
    
    
return $number;
}

代码:
/*

水印需求方,随机生成字符串,然后加密发送给水印生成方

云舒 , 2007年10月1日

*/
require_once 'Global.php';

$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$str_a = $chars;
$str_b = $chars;
$str_c = $chars;
$str_d = $chars;

$str = $str_a.$str_b.$str_c.$str_d;
$enc_data = encrypt( $str );

echo '<html><head><title>test</title></head><body><img src="CreateImg.php?number=' .rawurlencode$enc_data ). '" /></body></html>';

代码:
/*

水印提供方,获取需求方传递过来的参数,解密,画出图形

云舒 , 2007年10月1日

*/
require_once 'Global.php';

header('Content-type: image/gif');
ifisset$_GET["number"] ) )
{
    
$enc_number = rawurldecode$_GET["number"] );
}
else
{
    
exit;
}

$de_number = decrypt( $enc_number );
$chars = preg_split'//', $de_number );

$im = imagecreate(75,30);

< /span>$bg = imagecolorallocate ($im,& nbsp;255< span style="color: #000000;">,
 255 , 255 );//背景< /span>
$font_color = imagecolorallocate ($im,& nbsp;0,& nbsp;0,& nbsp;0); //< span style="color: #008000;">

imagestring(
$im, mt_rand(5,9), mt_rand(0,5), mt_rand(0,5), $chars[1], $font_color);
imagestring(
$im, mt_rand(5,9), mt_rand(15,25), mt_rand(0,5), $chars[2],  $font_color);
imagestring(
$im, mt_rand(5,9), mt_rand(30,40), mt_rand(0,5), $chars[3],  $font_color);
imagestring(
$im, mt_rand(5,9), mt_rand(45,50), mt_rand(0,5), $chars[4],  $font_color);

< /span>// 随机点
for ($i=1$i<=10$i++)
{
    imagestring(
$im,mt_rand(0,5),mt_rand(-5,63),mt_rand(-5,23),".",imageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)));
}
    
imagegif(
$im);
imagedestroy (
$im);

三. 防御伪造域的垃圾邮件

垃圾邮件现在也是网络上很头疼的一个问题,使用非对称算法的签名功能,可以对伪造域的垃圾邮件进行鉴别,需要邮件接收方服务器的支持。理论不多说了,直接举例。假设我是mail.icylife.net域,我给mail.ph4nt0m.org发邮件。但是有人自己架设了mail服务器,伪装成webmaster@icylife.net给webmaster@ph4nt0m.org发邮件,试图取得他的信任,这种问题如何处理?好办,使用非对称加密的签名验证功能。

首先,我在http://mail.icylife.net/publickey.txt存放我的公钥文件,私钥自己保存好。然后对邮件服务器进行一些改进,对于本域发出去的所有邮件,包括邮件正文和接受者一起做一个签名,把签名附在邮件中一起发出去。而mail.ph4nt0m.org域中的邮件服务器在接收邮件时,从http://mail.icylife.net/publickey.txt取得我的公钥,对签名进行验证,如果签名不对,马上提示用户遭受源域名伪造攻击。对于攻击者来说,他没有我的私钥,是不可能伪造出同样的签名的。

以上几个想法,一直一来有个朦胧的感觉,但是一直抓不住,前几天洗澡的时候,突然明朗起来了。或者有人说,RSA这些非对称加密是可以破解的,我只能说,地球都会毁灭,何况是加密算法。