PHP编程:php反序列unserialize的一个小特征
小试一下身手,大概是没问题了,那么交给你个任务,做个留言本吧,这和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;从上边代码看出,指针挪动一名指向第二个字符,判别字符是不是为:,然后gotoyy17yy17:yych=*++YYCURSOR;if(yybm&128){gotoyy20;}if(yych==+)gotoyy19;.......yy19:yych=*++YYCURSOR;if(yybm&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)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;switch($token){cases:if($strict){if("!==$data[$length-2])returnfalse;}elseif(false===strpos($data,")){returnfalse;}casea:caseO:echo"a";return(bool)preg_match("/^{$token}:+:/s",$data);caseb:casei:补钉中的return(bool)preg_match("/^{$token}:+:/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,但是也必须先跟它混个脸熟,看,一遍遍的看,看的同时一边琢磨,一边按照它所教的打代码,即使你搞不清楚那些代码到底是干嘛的,但是起码你应该找找感觉。 学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。 ,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
页:
[1]