1. 程式人生 > >BugKu Web WP

BugKu Web WP

變數1

這道題要好好說一下,因為以前不太知道這個套路。

我們來看看原始碼:

這個程式碼最重要的兩部分:一是 正則匹配,對我們輸入的進行檢查。  二是  var_dump($$args)  這句程式碼。

我們可以想到 如果我們的 $args 的值 剛好是 這個php程式碼中的一個變數名稱,那麼我們 是不是就可以通過 $$args  將這個變數打印出來了。例如:

那麼接下來,我們就該想到,我們的 $args 應該是什麼,才能把 flag 打印出來呢? 

我們來了解一下 php 中的一個全域性陣列變數 GLOBALS

$GLOBALS 是一個關聯陣列,每一個變數為一個元素,鍵名對應變數名,值對應變數的內容。$GLOBALS 之所以在全域性範圍內存在,是因為 $GLOBALS 是一個超全域性變數。以下範例顯示了超全域性變數的用處:

所以我們可以將 $args 的值設為 GLOBALS, 這樣我們會將 Php程式碼中的所有變數全都打印出來。


Web5

提示了JSFuck, 直接看網頁原始碼,然後發現了一大堆JSFuck的編碼,直接解碼即可


頭等艙

感覺是為了讓大家熟悉 burp suite 的用法,直接抓包看響應包頭即可。


網站被黑

這道題重點是為了告訴大家在實戰中善用掃描器。

不過,我剛開始使用指令碼掃描沒有掃到這個 shell.php, 後來換了御劍掃描器,就掃到了。

訪問 shell.php, 這裡應該就很簡單了,弱密碼可以直接使用 burp suite 爆破解密。


Web4

我們檢視原始碼,裡面是 url 加密的。

我將上面的進行url 解密整理之後,得到了如下程式碼: 所以很簡單,我們就得到了password的值。

 


Cookies欺騙

這道題涉及到檔案包含的問題,大家可以自己多去了解一下檔案包含漏洞。

我們可以發現這裡訪問的filename 是 一個base64加密的,所以我們對其進行解密,發現他是 keys.txt。 所以我們更改他的值為 index.php, 讀取 index.php的內容。讀取的第一行如下:

當我們將整個index.php讀取完的程式碼如下:

這個程式碼邏輯很簡單,我們只需要將我們的cookie設定為 margin 就可以讀取 keys.php的內容。

那麼我們用burp suite 將cookie設定為 margin,將 filename 設定為 keys.php 的base64加密。


成績單

這道題是一個 sql 注入。

題目正常,沒有對我們的注入語句進行過濾,所以我們可以按照正常的注入語句,一步一步爆出flag。

下面是 爆表  爆列名 爆flag 的注入語句:

0'Union select 1, table_name ,3,4 from information_schema.tables where table_schema = 'skctf_flag'#

0' union select 1,column_name,3,4 from information_schema.columns where table_name='fl4g' #


0' union select 1,skctf_flag,3,4 from fl4g #

 


點選一百萬次

這道題我們直接檢視JS,發現 我們點選的次數需要 > 100000, 剛開始我以為只需要修改本地JS的程式碼,就準備將 1000000 修改小一點,後來發現不行。是因為 他會將我們的點選次數傳送給後臺,所以我們這裡需要修改的是我們的 點選次數。

那麼我們直接使用 hackbar 工具,將我們的 clicks 變數修改為 1000000 傳送給 伺服器。

 


請輸入密碼

這道題,直接使用 burp suite 進行爆破


flag在index裡

看到如下的url 形式,我們就想到了和上面類似的漏洞 本地檔案包含漏洞,所以我們直接讀取 index.php的內容,為了將

index.php的內容一次讀取完,我們將其進行 Base64 編碼,然後在進行解密。

解密的程式碼如下:


Never give up

直接檢視原始碼:

發現了一個網址,我們訪問,但是這裡發現訪問這個網址會被重定向到另一個網頁,所以我們直接檢視這個網頁的原始碼:

我們發現了許多加密的密文,這段密文首先需要先用 url 解密,再用 base64 解密,解密之後的程式碼如下:

";if(!$_GET['id'])
{
	header('Location: hello.php?id=1');
	exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
	echo 'no no no no no no no';
	return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
	require("f4l2a3g.txt");
}
else
{
	print "never never never give up !!!";
}
?>

這裡就是一個程式碼審計的問題了:

首先 $id == 0, 這個可以通過 PHP 的弱比較,直接繞過。

然後是  $b 需要長度大於 5, 同時 eregi("111".substr($b,0,1),"1114"),也就是 111 和 $b 的第一個字元連線 需要和 1114匹配,還有  substr($b,0,1)!=4   $b的 第一個字元不能是4。 那麼這個如何繞過呢?  我們想到了  0x00 截斷, 也就是 substr($b,0,1) 函式在讀取$b中的字元時,如果中途遇見了 0x00 也就是空格,那麼他就會停止讀取,直接返回。  如果我們這裡將  $b 的第一個字元設定為 0x00,那麼再讀取到 $b 的第一個字元時,碰見空格, substr就會返回。 同時 111 與 1114 匹配。  $b的第一個字元為空格不為4。  所以我們就成功進行了 繞過。

最後  $data = @file_get_contents($a,'r');   $data=="bugku is a nice plateform!"   。也就是 從 $a 檔案中讀取出來的內容要為 這個字串。

看到 file_get_contents() 函式,我們就想到了 檔案寫漏洞, 我們可以使用 php://input, 將我們的 post 的內容寫入  $a 這個檔案。 關於這個漏洞其實是和 檔案包含漏洞一體的,大家可以自行研究。

那麼我們最終的輸入如下:

此處,注意 $b 的第一個字元 如果輸入  0x00, 那麼在上傳時也會被截斷,所以我們將其修改為 url 編碼 的 %00。


過狗一句話

這道題我們根據提示,其實可以發現是  assert() 命令執行漏洞。 那麼我麼可以 將  $s 的值設為我們想要執行的命令。

那麼我們可以輸入檢視當前路徑檔案 命令,這個命令我找了很久也找了很多個,最終發現這個可以成功,其他的都沒有嘗試成功, 找到了有一個 flag.txt。 直接進去檢視即可。


前女友

看到這題,題目感覺像是 出題人的真實情感經歷,哈哈!

程式碼審計: md5 這個都很熟悉了, 主要是有兩種繞過方法: 一是我們傳入陣列物件,因為陣列物件在進行md5 加密時,都會返回 false, 所以因為 弱比較我們可以直接繞過。  第二種是:因為弱比較,所以如果我們比較一個  以數字開頭但是後面是字母的 字串時, 弱比較只會比較剛開始的數字是否相同。 所以這裡就存在一個漏洞,我們可以查詢那些 md5值 的開頭數字值相同的 字串,這樣也可以繞過,下面我放幾個我經常用的這種字串,他們產生的md5 值 都是以 0e 開頭:

接下來繞過 strcmp() 函式,這個函式同樣可以傳入 陣列繞過:


login1

題目已經很明白的說了 是約束攻擊,根據下面的連結瞭解一下原理,很簡單就能做出來:

https://blog.csdn.net/qq_32400847/article/details/54137747