|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
小试一下身手,大概是没问题了,那么交给你个任务,做个留言本吧,这和HELLOWORLD有一比啊!^_^,同是新手面临的第一道关。这几天wordpress的谁人反序列毛病对照火,详细毛病我就不做剖析了,看这篇吧http://drops.wooyun.org/papers/596,你也能够往看英文的原文http://vagosec.org/2013/09/wordpress-php-object-injection/。wp官网打了补钉,我试图往bypass补钉,但让我自觉得乐成的时分,发明我无邪了,并没有乐成绕过wp的补钉,但却发明了unserialize的一个小特征,在此和人人分享一下。1.unserialize()函数相干源码:- if((YYLIMIT-YYCURSOR)<7)YYFILL(7);yych=*YYCURSOR;switch(yych){caseC:caseO:gotoyy13;caseN:gotoyy5;caseR:gotoyy2;caseS:gotoyy10;casea:gotoyy11;caseb:gotoyy6;cased:gotoyy8;casei:gotoyy7;caseo:gotoyy12;caser:gotoyy4;cases:gotoyy9;case}:gotoyy14;default:gotoyy16;}
复制代码 上边这段代码是判别序列串的处置体例,如序列串O:4:"test":1:{s:1:"a";s:3:"aaa";},处置这个序列串,先猎取字符串第一个字符为O,然后caseO:gotoyy13yy13:yych=*(YYMARKER=++YYCURSOR);if(yych==:)gotoyy17;gotoyy3;从上边代码看出,指针挪动一名指向第二个字符,判别字符是不是为:,然后gotoyy17- yy17:yych=*++YYCURSOR;if(yybm[0+yych]&128){gotoyy20;}if(yych==+)gotoyy19;.......yy19:yych=*++YYCURSOR;if(yybm[0+yych]&128){gotoyy20;}gotoyy18;
复制代码 从上边代码看出,指针挪动,判别下一名字符,假如字符是数字间接gotoyy20,假如是+就gotoyy19,而yy19中是对下一名字符判别,假如下一名字符是数字gotoyy20,不是就gotoyy18,yy18是间接加入序列处置,yy20是对object性的序列的处置,以是从上边能够看出:O:+4:"test":1:{s:1:"a";s:3:"aaa";}O:4:"test":1:{s:1:"a";s:3:"aaa";}都可以被unserialize反序列化,且了局不异。2.实践测试:- <?phpvar_dump(unserialize(O:+4:"test":1:{s:1:"a";s:3:"aaa";}));var_dump(unserialize(O:4:"test":1:{s:1:"a";s:3:"aaa";}));?>输入:object(__PHP_Incomplete_Class)#1(2){["__PHP_Incomplete_Class_Name"]=>string(4)"test"["a"]=>string(3)"aaa"}object(__PHP_Incomplete_Class)#1(2){["__PHP_Incomplete_Class_Name"]=>string(4)"test"["a"]=>string(3)"aaa"}
复制代码 实在,不但object范例处置能够多一个+,其他范例也能够,详细测试不做过量形貌。3.我们看下wp的补钉:- functionis_serialized($data,$strict=true){//ifitisntastring,itisntserializedif(!is_string($data))returnfalse;$data=trim($data);if(N;==$data)returntrue;$length=strlen($data);if($length<4)returnfalse;if(:!==$data[1])returnfalse;if($strict){//output$lastc=$data[$length-1];if(;!==$lastc&&}!==$lastc)returnfalse;}else{//input$semicolon=strpos($data,;);$brace=strpos($data,});//Either;or}mustexist.if(false===$semicolon&&false===$brace)returnfalse;//ButneithermustbeinthefirstXcharacters.if(false!==$semicolon&&$semicolon<3)returnfalse;if(false!==$brace&&$brace<4)returnfalse;}$token=$data[0];switch($token){cases:if($strict){if("!==$data[$length-2])returnfalse;}elseif(false===strpos($data,")){returnfalse;}casea:caseO:echo"a";return(bool)preg_match("/^{$token}:[0-9]+:/s",$data);caseb:casei:
复制代码 补钉中的return(bool)preg_match("/^{$token}:[0-9]+:/s",$data);能够多一个+来绕过,固然我们经由过程这个办法把序列值写进了数据库,但从数据库中提取数据,再次考证的时分却没法绕过了,我这个加号没能使数据收支数据库产生任何变更,我团体以为这个补钉绕太重点在于数据收支数据的前后变更。4.总结虽热没有绕过wp补钉,但这个unserialize()的小特征大概会被良多开辟职员疏忽,招致程序呈现平安缺点。以上的剖析有甚么毛病请留言指出。5.参考《WordPress<3.6.1PHPObjectInjection》http://vagosec.org/2013/09/wordpress-php-object-injection/《var_unserializer.c源码》https://github.com/php/php-src/b.../var_unserializer.c《PHPstring序列化与反序列化语法剖析纷歧致带来的平安隐患》转自http://zone.wooyun.org/content/1664转自:https://forum.90sec.org/thread-6694-1-1.html作者:L.N.即使你理解不了PHP,但是也必须先跟它混个脸熟,看,一遍遍的看,看的同时一边琢磨,一边按照它所教的打代码,即使你搞不清楚那些代码到底是干嘛的,但是起码你应该找找感觉。 |
|