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