網路安全自學篇(四)| 實驗吧CTF實戰之WEB滲透和隱寫術解密
- 2020 年 3 月 12 日
- 筆記
作者;楊秀璋
介紹;自幼受貴州大山的熏陶,養成了誠實質樸的性格。經過寒窗苦讀,考入BIT,為完成自己的教師夢,放棄IT、航天等工作,成為貴財一名大學教師,並想把自己所學所感真心傳授給自己的學生,幫助更多陌生人。
排版來源;安全+
一.WEB之這是什麼
題目地址:
http://www.shiyanbar.com/ctf/56
解題鏈接:
http://ctf5.shiyanbar.com/DUTCTF/1.html
題目描述:

打開鏈接如下圖所示,確實是什麼鬼東西。

題目解析:
1.它們其實是Jother編碼,它是一種運用於Javascript語言中利用少量字元構造精簡的匿名函數方法對於字元串進行的編碼方式,其中少量字元包括"[","]","{","}","(",")","!","+"。這些字元就能完成對任意字元串的編碼,本質上是一種Javascript的編碼,其優點是程式碼字元就那麼幾個,比較好記,缺點是編碼極其冗長和複雜。
2.這種編碼一般現在只會出現在CTF比賽中,實際開發中用的到就很少了。
2.打開Chrome瀏覽器,按F12鍵選擇控制台Console,將程式碼複製過去回車即可得到flag值。

3.得到該題的密碼:Ihatejs。

正確答案:Ihatejs
參考鏈接:
https://www.writeup.top/391.html

二.隱寫術之水果
隱寫術是一門關於資訊隱藏的技巧與科學,所謂資訊隱藏指的是不讓除預期的接收者之外的任何人知曉資訊的傳遞事件或者資訊的內容。隱寫術的英文叫做Steganography,來源於特里特米烏斯的一本講述密碼學與隱寫術的著作Steganographia,該書書名源於希臘語,意為「隱秘書寫」。在CTF題目中,圖片隱寫題屬於雜項的一部分,題目較為簡單。
題目地址:
http://www.shiyanbar.com/ctf/1903
解題鏈接:
http://ctf5.shiyanbar.com/stega/pic.png
題目描述:

打開網頁如下圖所示,顯示一張水果的圖片 ,flag就隱藏在圖片中。作者第一反應是查看源程式碼,哈哈~原諒我這個小白第一次學習。


題目解析:
1.將圖片另存為本地。
2.從CSDN下載Stegsolve工具,它是用於影像解析的工具,然後導入本地圖片,按方向鍵右鍵不斷切換,直到出現下圖的二維碼。

如下圖所示:

3.使用手機掃描二維碼,得到一串數字,我們根據數值可以分析,這是十進位的ASCII碼。

4.將數字轉換為ASCII,45對應「-」、46對應「.」、32對應空格。
45 46 45 46 32 -.-. 45 32 - 46 46 45 46 32 ..-. 46 45 46 46 32 .-.. 46 46 46 32 ... 45 46 46 46 32 -... 46 46 45 45 46 45 32 ..--.- 45 46 46 46 32 -... 46 46 46 32 ... 46 45 46 46 32 .-..
5.它們就是傳說中的摩斯密碼。根據下面的對照表,其結果為:CTFLSB_BSL

摩爾斯電碼(又譯為摩斯密碼,Morse code)是一種時通時斷的訊號程式碼,通過不同的排列順序來表達不同的英文字母、數字和標點符號。它發明於1837年,發明者有爭議,是美國人塞繆爾·莫爾斯或者艾爾菲德·維爾。摩爾斯電碼是一種早期的數字化通訊形式,但是它不同於現代只使用零和一兩種狀態的二進位程式碼,它的程式碼包括五種:點、劃、點和劃之間的停頓、每個字元之間短的停頓、每個詞之間中等的停頓以及句子之間長的停頓。
正確答案:CTF{lsb_bsl}
參考鏈接:
https://blog.csdn.net/miko2018/article/details/81627130
https://www.cnblogs.com/nul1/p/9594387.html
https://blog.csdn.net/u012486730/article/details/8201670

三.隱寫術之小蘋果
題目原理和上一題一樣。
題目地址:
http://www.shiyanbar.com/ctf/1928
解題鏈接:
http://ctf5.shiyanbar.com/stega/apple.png
題目描述:

題目打開也是一張圖片,中國結。

題目解析:
1.下載圖片至本地並打開,得到如下二維碼:

2.二維碼包含如下數字
u7f8au7531u5927u4e95u592bu5927u4ebau738bu4e2du5de5
這是unicode編碼的方式,讓我們在相關網站(搜索「unicode解碼即可」)中進行解碼,得到中文「羊由大井夫大人王中工」,這是一種從未見過的加密方式。

3.通過百度了解到該加密為當鋪密碼,曾在CTF題目中出現過,我們按照編碼規則進行解碼,得到數字:9158753624。

當鋪密碼是一種將中文和數字進行轉化的密碼,演算法相當簡單:當前漢字有多少筆畫出頭,就是轉化成數字幾。「羊由大井夫大人王中工」對應的數字為「9158753624」
4.再回頭分析圖片可知,裡面包含了一個壓縮文件,我們通過修改擴展名為.ZIP並解壓,得到了apple.mp3的音頻文件。

5.使用mp3隱寫術工具MP3Stego的Decode.exe對其進行解碼,密碼就是我們剛剛得到的那串數字9158753624。解碼後得到字串Q1RGe3hpYW9fcGluZ19ndW99。
6.通過嘗試,在base64解碼中得到了正確的結果:CTF{xiao_ping_guo}。
正確答案:CTF{xiao_ping_guo}

四.WEB之天網管理系統
題目地址:
http://www.shiyanbar.com/ctf/1810
解題鏈接:
http://ctf5.shiyanbar.com/10/web1/index.php
題目描述:

題目顯示如下圖所示,需要輸入正確的用戶名和密碼獲取flag。

考點:PHP弱類型
題目解析:
1.查看網頁源程式碼如下所示,注意注釋的提示。
<!-- $test=$_GET['username']; $test=md5($test); if($test=='0') -->

2.需要用戶名傳入一個字元串,並且它經過md5加密後要等於0。注意,PHP某些情況會把類數值數據(如含有數字的字元串等)轉換成數值處理。在使用「= =」 運算符對兩個字元串進行比較時,PHP會把類數值的字元串轉換為數值進行比較,如果參數是字元串,則返回字元串中第一個不是數字的字元之前的數字串所代表的整數值。比如: 『3』 == '3ascasd』結果為true。
因此只要找到一個字串加密後第一個字元為0即可,這裡提供幾個:240610708、aabg7XSs

3.用戶名輸入「aabg7XSs」,此時返回的提示資訊如下圖所示。
http://ctf5.shiyanbar.com/10/web1/user.php?fame=hjkleffifer

4.訪問該頁面顯示內容如下圖所示:
函數serialize()是對輸入的數據進行序列化轉換,把變數和它們的值編碼成文本形式。
函數unserialize()是還原已經序列化的對象,對單一的已序列化的變數進行操作,將其轉換回反序列化 PHP 的值。
$unserialize_str = $_POST['password']; $data_unserialize = unserialize($unserialize_str); if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???') { print_r($flag); }

這段程式碼是將Post提交的密碼值經過unserialize()函數 反序列化處理,得到一個數組,要求數組裡的user和pass都等於值「???」,此時輸出flag。那麼,這個「???」又是什麼內容呢?
5.此時「成也布爾,敗也布爾」提醒我們。bool類型的true跟任意字元串可以弱類型相等。因此我們可以構造bool類型的序列化數據 ,無論比較的值是什麼,結果都為true。(a代表array,s代表string,b代表bool,而數字代表個數/長度)
<?php error_reporting(0); $test=''; $test=array("user"=>1,"pass"=>1); echo var_dump($test); echo var_dump(serialize($test)); $test1=''; $test1=array("user"=>true,"pass"=>true); echo var_dump($test1); echo var_dump(serialize($test1)); ?>
找個在線PHP網站進行測試,輸出如下圖所示:string(36) 「a:2:{s:4:「user」;i:1;s:4:「pass」;i:1;}」

6.構造password值為:a:2:{s:4:「user」;b:1;s:4:「pass」;b:1;},輸出最後的flag。

正確結果:ctf{dwduwkhduw5465}
參考鏈接:
https://blog.csdn.net/dongyanwen6036/article/details/77650921
https://www.cnblogs.com/ssooking/p/5877086.html

五.WEB之忘記密碼
題目地址:
http://www.shiyanbar.com/ctf/1808
解題鏈接:
http://ctf5.shiyanbar.com/10/upload/step1.php
題目描述:

題目顯示如下圖所示,需要輸入正確的郵箱找回密碼。

考點:vim備份文件泄露
題目解析:
1.首先我們隨便輸入一個密碼,如「123456」看返回結果。

返回如下圖所示,注意「step2.php」頁面。

2.查看源程式碼,發現提醒用戶名為admin,輸入郵箱為「[email protected]」。

輸入該郵箱發現Scripts提醒變成了「郵箱已送到管理員郵箱了,你看不到」,真是逗~

3.這裡有個細節,Step2.php頁面跳轉了一下,然後又跳轉回step1,說明step2裡面有貓膩!頁面跳轉這麼快,那我們該怎麼去看這個頁面呢?這時候要用到一個名叫Burp Suite的神器,抓包攔截。
Step2.php顯示立刻跳轉:

方法一:在Target查看目錄樹發現有個「submit.php」文件。

方法二:使用Repeater,查看響應Response。

將GET方法的網址修改為step2.php,然後響應表單提交為「submit.php」。

4.趕緊查看該網頁,結果提醒「you are not an admin」,有許可權訪問該頁面,但不是管理員不透露資訊。有意思~

5.再回到最初step1.php的源程式碼,這裡有個非常重要的提示資訊——編輯器採用的是VIM。


VIM備份文件(參考Sp4rkW大神) 默認情況下使用VIM編程,在修改文件後系統會自動生成一個帶 ~ 的備份文件,某些情況下可以對其下載進行查看。例如,index.php普遍意義上的首頁,它的備份文件則為index.php~。VIM中的swp即swap文件,在編輯文件時產生,它是隱藏文件,如果原文件名是submit,則它的臨時文件「.submit.swp」。如果文件正常退出,則此文件自動刪除。
這個題目叫備份文件泄露,我們知道這個VIM編輯器可以存放臨時文件,而臨時文件會存放資訊,咱們可以嘗試一下訪問臨時文件,格式如下:
ctf5.shiyanbar.com/10/upload/.submit.php.swp
PS:因為vim備份文件是隱藏文件,所以需要加上一個點「.submit.php.swp」。

6.嘗試打開.submit.php.swp文件。

重點是後面的if判斷語句,這個條件必須要滿足token的長度必須等於10,並且token的值為0,咱們可以構造十個0試試。
........這一行是省略的程式碼........ if(!empty($token)&&!empty($emailAddress)){ if(strlen($token)!=10) die('fail'); if($token!='0') die('fail'); $sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'"; $r = mysql_query($sql) or die('db error'); $r = mysql_fetch_assoc($r); $r = $r['num']; if($r>0){ echo $flag; }else{ echo "失敗了呀"; } }
7.最終構造的結果如下:
http://ctf5.shiyanbar.com/10/upload/[email protected]&token=0000000000
然後訪問得到如下結果:

正確答案:flag is SimCTF{huachuan_TdsWX}
參考鏈接:
https://www.cnblogs.com/ECJTUACM-873284962/p/7860788.html
https://blog.csdn.net/wy_97/article/details/76559354

六.WEB之false
題目地址:
http://www.shiyanbar.com/ctf/1787
解題鏈接:
http://ctf5.shiyanbar.com/web/false.php
題目描述:

題目顯示如下圖所示。

考點:PHP程式碼審計(PHP Code Audit)
題目解析:
1.首先隨便輸入內容,點擊「Login」按鈕。
http://ctf5.shiyanbar.com/web/false.php?name=1&password=2

2.點擊「View the source code」獲取源程式碼如下所示。
<?php if (isset($_GET['name']) and isset($_GET['password'])) { if ($_GET['name'] == $_GET['password']) echo '<p>Your password can not be your name!</p>'; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else echo '<p>Invalid password.</p>'; } else{ echo '<p>Login first!</p>'; ?>
它的含義是GET獲取name和password,然後進行判斷。
(1)if ($ _GET[『name』] == $ _GET[『password』]),用戶名和密碼相等,提示如下。

(2)else if (sha1($ _GET[『name』]) === sha1($ _GET[『password』])),用戶名名和密碼的sha1加密散列值相等,執行die函數。
(3)以上都不是返回「Invalid password」。
(4)未輸入用戶名和密碼,提示「Login first」。
3.函數說明:
- die()函數:停止程式運行,輸出內容
- sha1()函數:計算字元串 「Hello」 的 SHA-1 散列。默認的傳入參數類型是字元串型
- isset()函數:檢測變數是否已設置並且非 NULL。
- 若變數不存在則返回 FALSE, 若變數存在且其值為NULL,也返回 FALSE ,若變數存在且值不為NULL,則返回 TURE。同時檢查多個變數時,每個單項都符合上一條要求時才返回 TRUE,否則結果為 FALSE。
參考官網:https://www.php.net/manual/zh/function.isset.php
<?php $a = array ('test' => 1, 'hello' => NULL, 'pie' => array('a' => 'apple')); var_dump(isset($a['test'])); // TRUE var_dump(isset($a['foo'])); // FALSE var_dump(isset($a['hello'])); // FALSE // 鍵 'hello' 的值等於 NULL,所以被認為是未置值的。 // 如果想檢測 NULL 鍵值,可以試試下邊的方法。 var_dump(array_key_exists('hello', $a)); // TRUE // Checking deeper array values var_dump(isset($a['pie']['a'])); // TRUE var_dump(isset($a['pie']['b'])); // FALSE var_dump(isset($a['cake']['a']['b'])); // FALSE ?>
4.這裡需要執行「if (sha1($ _GET[『name』]) === sha1($ _GET[『password』]))」語句。
重點:sha1()函數默認的傳入參數類型是字元串型,也可以傳入其他類型,使其返回值為false,如數組類型。再加上題目標題false,可以想到構造FALSE===FALSE拿到flag。

= =:比較運算符號 不會檢查條件式的表達式的類型 ===:恆等計算符 , 同時檢查表達式的值與類型。
構造網址:
http://ctf4.shiyanbar.com/web/false.php?name[]=1&password[]=2
5.name和password為數組,並且值不相等,提交即可獲得flag。

正確結果:Flag: CTF{t3st_th3_Sha1}

七.WEB之天下武功唯快不破
題目地址:
http://www.shiyanbar.com/ctf/1854
解題鏈接:
http://ctf5.shiyanbar.com/web/10/10.php
題目描述:

題目顯示如下圖所示,提醒「You must do it as fast as you can!」。

考點:Python腳本
題目解析:
1.嘗試SQL注入都無反應,接著查看源程式碼,發現一個提示資訊:
<!-- please post what you find with parameter:key -->

2.根據題目內容,試圖將網頁鏈接速度放慢,這裡可以采Burp Suite抓包,Proxy的intercept載入網頁,並將抓到的資訊發到repeater中Go一下,會發現一個FLAG值。另一種方法,Chrome瀏覽器審查網路狀態。

3.在響應頭中發現了FLAG,看起來像是一個Base64編碼,嘗試在線解碼。

但是該值每次生成的值是隨機的。
FLAG:UDBTVF9USElTX1QwX0NINE5HRV9GTDRHOnZhbmRmQXp1Zg==
解碼:P0ST_THIS_T0_CH4NGE_FL4G:vandfAzuf
FLAG:UDBTVF9USElTX1QwX0NINE5HRV9GTDRHOktsSVBLWmVkOQ==
解碼:P0ST_THIS_T0_CH4NGE_FL4G:KlIPKZed9
4.回想之前的注釋(please post what you find with parameter:key)以及解密後的FLAG值,需要快速提交POST,故採用Python腳本實現。哈哈,又回到熟悉的語言。
# -*- coding: utf8 -*- import requests import base64 url = 'http://ctf5.shiyanbar.com/web/10/10.php' s = requests.session() response = s.get(url) #獲取FLAG值 #FLAG: UDBTVF9USElTX1QwX0NINE5HRV9GTDRHOnZhbmRmQXp1Zg== head = response.headers flag = base64.b64decode(head['FLAG']).split(':')[1] print(flag) #設置POST請求 pdata = {'key': flag} result = s.post(url=url, data=pdata) print(result.text) #響應
5.運行得到如下結果。

正確答案:CTF{Y0U_4R3_1NCR3D1BL3_F4ST!}
參考鏈接:
https://www.jianshu.com/p/11b5c1bd62d0
https://blog.csdn.net/miko2018/article/details/83314088
https://blog.csdn.net/dongyanwen6036/article/details/77358693

原文鏈接:
https://blog.csdn.net/Eastmount/article/details/98529597