phpmyadmin后台代碼執行分析復現


0X01首先我們來了解下這個漏洞的關鍵函數

preg_replace
CTF的老函數了
preg_replace() 的第一個參數如果存在 /e 模式修飾符,則允許代碼執行。
如果沒有 /e 修飾符,可以嘗試 %00 截斷。
正則表達式修正符:
因為$pattern中指定的是要搜索的模式字符串,一般使用的是正則表達式,正則表達式中
存在修正符,像/i 就是指定取消大小寫敏感,等。具體可參考:
但是其中一個修正符 “/e”;在替換字符串中對逆向引用作正常的替換,將其作為 PHP 代碼求值,並用其結果來替換所搜索的字符串。

 

 

 這里可以看見preg_peplace是/e模式 第二個參數可以被我們代碼執行

但是我們看這里 第二個執行函數不可控制了 那還能代碼執行嗎??

    對一個正則表達式模式或部分模式 兩邊添加圓括號 將導致相關 匹配存儲到一個臨時緩沖區 中,所捕獲的每個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩沖區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每個緩沖區都可以使用 '\n' 訪問,其中 n 為一個標識特定緩沖區的一位或兩位十進制數。

所以這里的 \1 實際上指定的是第一個子匹配項,我們拿 ripstech 官方給的 payload 進行分析,方便大家理解。官方 payload 為: /?.*={${phpinfo()}} ,即 GET 方式傳入的參數名為 /?.* ,值為 {${phpinfo()}} 。

 

 

 

 

所以這里我們也可以同樣造成代碼執行

具體文章參考
https://xz.aliyun.com/t/2557

0X02漏洞影響版本

Phpmyadmin -> 4.0.10.16之前的4.0.x版本
4.4.15.7 之前的 4.4.x版本
4.6.3之前的 4.6.x版本
Php版本: 4.3.0 ~5.4.6
Php 5.0 版本以上的將 preg_replace 的 /e修飾符給廢棄掉了

0x03漏洞分析

查詢資料:
首先找到preg_replace()函數的調用位置:
發現是在 /libraries/TableSearch.class.php 文件中,

 

 

 

從這里我們可以看出 $find,$replacewith,$raw參數就是函數要傳入地方 我們看看是在嗎傳入的 下斷點

 

 

 

找到find參數傳入的函數 也是在這個文件下

 

 

 這里調用了_getRegplaceRows類然后繼續F10單步 跟進 發現find傳入地點

現在針對這兩個的參數都尋找到了,就剩下 第三個參數了,繼續尋找。
第三個參數為 row[0]首先看到這個參數為一數組,猜想是由SQL語句查詢並返回的第一個值。

下斷點不難發現row是在sql執行的時候返回的參數

 

 

 跟進函數

SQL語句可理解為
Select $columnname ,1,cont(*) from database.table_name where $columnname rLike ‘$find’ collate $charset_bin Group BY $columnname order by $column ASC;

0X04構造payload

創建的數據庫為test 數據表為"cs" 該表中的first列 的值為“0/e” ,該值也就是通過$sql_qury sql語句中查詢得到的 $row[0]
        "find": "0/e\0",
        "replaceWith": payload,

 

 

db= db&table= table&token= token&goto= sql.php&find= 0/e\0&replaceWith= payload&columnIndex= 0&useRegex= on&submit= Go&ajax_request= true
參考文獻
https://www.exploit-db.com/exploits/40185
https://xz.aliyun.com/t/7836#toc-4
https://www.phpmyadmin.net/files/
https://www.php.net/preg_replace/

 

 

對一個正則表達式模式或部分模式 兩邊添加圓括號 將導致相關 匹配存儲到一個臨時緩沖區 中,所捕獲的每個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩沖區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每個緩沖區都可以使用 '\n' 訪問,其中 n 為一個標識特定緩沖區的一位或兩位十進制數。

所以這里的 \1 實際上指定的是第一個子匹配項,我們拿 ripstech 官方給的 payload 進行分析,方便大家理解。官方 payload 為: /?.*={${phpinfo()}} ,即 GET 方式傳入的參數名為 /?.* ,值為 {${phpinfo()}}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM