VXCTF 2nd Web1000: DNA-Box Writeup

DNA-Box 是 Ozetta 出的一道題目,這裡可以打包下載

題目有兩個主要的功能:

  1. 上載一個檔案
  2. include 一個檔案

如果上面的兩個功能都沒有限制的話,那就是 baby steps 等級了:

  • 上載一個 PHP: <?=`$_GET['a']`;
  • Include 那個 PHP

然而難度在於條件:

  1. 上載的檔案不能超過 64KB,而且 ATCGatcg 以外的字元會被刪除。
  2. Include 的格式為  include($payload . ".inc.php");

所以如果上載剛剛那個 web shell 的話,你只會看到 Ta。那要怎麼辦呢?首先看一下基礎知識 (?)。


基礎知識 (1):Remote Code Execution (RCE)

PHP 的 include 函數除了可以 include path names 外,還可以用它內置的 wrapper -  php://

舉個例子, include("php://filter/convert.base64-encode/resource=a.php"); 就是把 a.php 以 base64 表示。我們可以經過 base64 decode 來查看 a.php 的源代碼。

又或者,如果 b.txt(是的,你用其他 extension 也可以)的內容如下:

那麼  include("php://filter/convert.base64-decode/resource=b.txt"); 則會出現以下東西:

可以 decode 兩次嗎?可以: include("php://filter/convert.base64-decode|convert.base64-decode/resource=b.txt");

然後輸出一片空白 - 那是因為內容會被 decode 成  <?php eval($_GET['trolled']); ?>,然後就 execute 起來了。

把網址改成 ?trolled=echo%20"Hello%20World!";,網頁會顯示 “Hello World!”:

把變數 trolled 換成 system('ls'); 就跟在 command line 輸入 ls  一樣 - 這意味著我們已經得到 web shell。

以下的 payload 為  ?trolled=echo%20%27<xmp>%27;%20system(%27ls%20-al%27);,但是可以改成其他東西的。


基礎知識 (2):Base64

這個我知道!

這個我就不詳細講了。

就講一下重點:PHP 的 base64 decode filter 會無視所有非 base64 的字元。如果把  Ok... 8-p 丟去 decode 的話,結果會跟 decode  Ok8p 時一樣。(試試看吧!)


正題

說了這麼多廢話,進入開始正題了:如何使用 DNA 來拼出 shell 呢?

要知道得到 base64 得天下,因為 base64 decode 就是 ASCII 了。

ATCGatcg  Base64 Charset  ASCII

那麼先定下一個目標 - 我們先向收集 base64 的字元出發:

過了一個回合之後,我們可以拼到 [1] 014678adfghijkmpqrBFLMNSZ+ 。

用以上字元繼續可以得到 [2] 0123456789abcdefghijkmnotuvwxzABCDEFGHIJKLMNOPQRSTVWXYZ+/=

要怎樣拼出 Y 呢? AAtCAAtGAGtAAAtC 可以 decode 成  BFkB,而 BFkB 可以 decode 成  B

用以上字元再拼一次,即可得到 base64 的所有字元。

ATCGatcg → [1][2] → Base64 Charset → ASCII

由於每一個箭頭代表一次 base64 decode - 把以下的內容 decode 四次後就可得到 shell。

你問我如何寫出上面的 payload?這是練習題。


發表迴響