如何用eclipse做網(wǎng)站全媒體運(yùn)營(yíng)師報(bào)考條件
目錄
[WUSTCTF 2020]樸實(shí)無(wú)華
[FSCTF 2023]源碼!啟動(dòng)!?
[LitCTF 2023]Flag點(diǎn)擊就送!?
相關(guān)知識(shí)點(diǎn)
1.intval 繞過(guò)
繞過(guò)的方式:
2.session偽造攻擊
[WUSTCTF 2020]樸實(shí)無(wú)華
1.進(jìn)入頁(yè)面幾乎沒(méi)什么可用的信息,所以想到使用disearch掃描,發(fā)現(xiàn)robots.txt文件,這里也可以通過(guò)源代碼中聯(lián)想到robots文件
?2.訪問(wèn)robots文件,發(fā)現(xiàn)一個(gè)php文件,訪問(wèn)該php文件得到一個(gè)假的flag
3.再根據(jù)掃描的文件,發(fā)現(xiàn)有一個(gè)fl4g.php文件,訪問(wèn)該文件,得到一長(zhǎng)串php代碼
4.接下來(lái)就是進(jìn)行代碼審計(jì),首先是第一關(guān)卡
if (isset($_GET['num'])){$num = $_GET['num'];if(intval($num) < 2020 && intval($num + 1) > 2021){echo "我不經(jīng)意間看了看我的勞力士, 不是想看時(shí)間, 只是想不經(jīng)意間, 讓你知道我過(guò)得比你好.</br>";}else{die("金錢(qián)解決不了窮人的本質(zhì)問(wèn)題");}
}else{die("去非洲吧");
}
這串代碼主要的作用是使用了
intval()
函數(shù),該函數(shù)用于獲取變量的整數(shù)值。它嘗試從給定的變量中獲取整數(shù)。接下來(lái)的if條件是一個(gè)邏輯與(&&)操作,它檢查兩個(gè)條件是否都為真?
注意:intval()這個(gè)函數(shù)是強(qiáng)制轉(zhuǎn)換為int類(lèi)型。?
舉個(gè)例子:
<?php
echo '3e5' ;
?>
//結(jié)果為3e5
<?php
echo '3e5' + 1;
?>
//結(jié)果為300001
這是因?yàn)樵诘谝粋€(gè) echo
語(yǔ)句中,'3e5'
被視為字符串,因此會(huì)直接輸出其內(nèi)容 '3e5'
。而在第二個(gè)語(yǔ)句中,雖然 '3e5'
被當(dāng)作字符串,但由于與數(shù)字相加,PHP 嘗試將其轉(zhuǎn)換為數(shù)字。在這種情況下,它將 '3e3'
解釋為科學(xué)記數(shù)法表示 3 乘以 10 的 5次方,即 300000,然后再加上 1,所以結(jié)果為 300001。
5.使用如上方法,繞過(guò)第一關(guān)?
6.接下來(lái)就是第二關(guān)
//level 2
if (isset($_GET['md5'])){$md5=$_GET['md5'];if ($md5==md5($md5))echo "想到這個(gè)CTFer拿到flag后, 感激涕零, 跑去東瀾岸, 找一家餐廳, 把廚師轟出去, 自己炒兩個(gè)拿手小菜, 倒一杯散裝白酒, 致富有道, 別學(xué)小暴.</br>";elsedie("我趕緊喊來(lái)我的酒肉朋友, 他打了個(gè)電話, 把他一家安排到了非洲");
}else{die("去非洲吧");
}
//這串代碼主要涉及到了弱比較
?補(bǔ)充:==弱類(lèi)型比較中,字符'0e123'和字符'0e456'雖然是字符類(lèi)型,但是因?yàn)?#61;=比較不比較數(shù)據(jù)類(lèi)型,只比較值,而值就是科學(xué)計(jì)數(shù)法的表示格式,結(jié)果都是0,所以相等,返回true ===強(qiáng)類(lèi)型比較中,字符'0e123'和字符'0e456'在比較數(shù)據(jù)類(lèi)型的時(shí)候就被當(dāng)作字符類(lèi)型,而字符'0e123'和字符'0e456'當(dāng)然不相等,所以返回false
7.接下來(lái)就是第三關(guān),這串代碼的關(guān)鍵就是過(guò)濾空格和cat,用其他的替換即可
代替cat: more、less、head、tail、sort、ca\t
代替空格:$IFS、${IFS}、$IFS$1、$IFS$9
//get flag
if (isset($_GET['get_flag'])){$get_flag = $_GET['get_flag'];if(!strstr($get_flag," ")) //strstr() 函數(shù)搜索字符串在另一字符串中是否存在,如果是,返回該字符串及剩余部分,否則返回 FALSE。
{$get_flag = str_ireplace("cat", "wctf2020", $get_flag);//str_replace() 函數(shù)替換字符串中的一些字符(區(qū)分大小寫(xiě))。這里的意思是將get_flag字符串中的"cat"替換成"wctf2020"echo "想到這里, 我充實(shí)而欣慰, 有錢(qián)人的快樂(lè)往往就是這么的樸實(shí)無(wú)華, 且枯燥.</br>";system($get_flag);}else{die("快到非洲了");}
}else{die("去非洲吧");
}
?資料參考:PHP strstr() 函數(shù) | 菜鳥(niǎo)教程
PHP str_replace() 函數(shù) | 菜鳥(niǎo)教程
8.按要求傳參,先傳個(gè)la看看,發(fā)現(xiàn)有回顯
9.繞過(guò)最后一個(gè)關(guān)卡,得到flag?
[FSCTF 2023]源碼!啟動(dòng)!?
1.進(jìn)入頁(yè)面,想到查看源代碼,發(fā)現(xiàn)禁用了右鍵,于是在更多工具中看源代碼,得到flag
[LitCTF 2023]Flag點(diǎn)擊就送!?
資料:【python】Flask之session使用_python flask session-CSDN博客
1.根據(jù)提示很容易想到要抓包,進(jìn)入頁(yè)面,是如下的頁(yè)面
2.隨便輸入一個(gè)名字,出現(xiàn)以下頁(yè)面
3.點(diǎn)擊拿flag,出現(xiàn)以下回顯,只有管理員可以
4.接下來(lái)使用抓包工具,發(fā)現(xiàn)cookie中有session的值,并根據(jù)題目可知這個(gè)題可能是session偽裝漏洞
5. 打開(kāi)kali,輸入以下命令進(jìn)行加解密session的值
這里要使用到python腳本,如果載虛擬機(jī)中操作,還涉及到將腳本保存在虛擬機(jī)的文件中
#!/usr/bin/env python3
""" Flask Session Cookie Decoder/Encoder """
__author__ = 'Wilson Sumanang, Alexandre ZANNI'# standard imports
import sys
import zlib
from itsdangerous import base64_decode
import ast# Abstract Base Classes (PEP 3119)
if sys.version_info[0] < 3: # < 3.0raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4from abc import ABCMeta, abstractmethod
else: # > 3.4from abc import ABC, abstractmethod# Lib for argument parsing
import argparse# external Imports
from flask.sessions import SecureCookieSessionInterfaceclass MockApp(object):def __init__(self, secret_key):self.secret_key = secret_keyif sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4class FSCM(metaclass=ABCMeta):def encode(secret_key, session_cookie_structure):""" Encode a Flask session cookie """try:app = MockApp(secret_key)session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.dumps(session_cookie_structure)except Exception as e:return "[Encoding error] {}".format(e)raise edef decode(session_cookie_value, secret_key=None):""" Decode a Flask cookie """try:if(secret_key==None):compressed = Falsepayload = session_cookie_valueif payload.startswith('.'):compressed = Truepayload = payload[1:]data = payload.split(".")[0]data = base64_decode(data)if compressed:data = zlib.decompress(data)return dataelse:app = MockApp(secret_key)si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.loads(session_cookie_value)except Exception as e:return "[Decoding error] {}".format(e)raise e
else: # > 3.4class FSCM(ABC):def encode(secret_key, session_cookie_structure):""" Encode a Flask session cookie """try:app = MockApp(secret_key)session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.dumps(session_cookie_structure)except Exception as e:return "[Encoding error] {}".format(e)raise edef decode(session_cookie_value, secret_key=None):""" Decode a Flask cookie """try:if(secret_key==None):compressed = Falsepayload = session_cookie_valueif payload.startswith('.'):compressed = Truepayload = payload[1:]data = payload.split(".")[0]data = base64_decode(data)if compressed:data = zlib.decompress(data)return dataelse:app = MockApp(secret_key)si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.loads(session_cookie_value)except Exception as e:return "[Decoding error] {}".format(e)raise eif __name__ == "__main__":# Args are only relevant for __main__ usage## Description for helpparser = argparse.ArgumentParser(description='Flask Session Cookie Decoder/Encoder',epilog="Author : Wilson Sumanang, Alexandre ZANNI")## prepare sub commandssubparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')## create the parser for the encode commandparser_encode = subparsers.add_parser('encode', help='encode')parser_encode.add_argument('-s', '--secret-key', metavar='<string>',help='Secret key', required=True)parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',help='Session cookie structure', required=True)## create the parser for the decode commandparser_decode = subparsers.add_parser('decode', help='decode')parser_decode.add_argument('-s', '--secret-key', metavar='<string>',help='Secret key', required=False)parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',help='Session cookie value', required=True)## get argsargs = parser.parse_args()## find the option chosenif(args.subcommand == 'encode'):if(args.secret_key is not None and args.cookie_structure is not None):print(FSCM.encode(args.secret_key, args.cookie_structure))elif(args.subcommand == 'decode'):if(args.secret_key is not None and args.cookie_value is not None):print(FSCM.decode(args.cookie_value,args.secret_key))elif(args.cookie_value is not None):print(FSCM.decode(args.cookie_value))
解密:python session.py decode -s “secret_key” -c “需要解密的session值”
加密:python session.py encode -s “secret_key” -t “需要加密的session值”
?首先進(jìn)行解密,發(fā)現(xiàn)是flask的session格式:
flask的session格式一般是由base64加密的Session數(shù)據(jù)(經(jīng)過(guò)了json、zlib壓縮處理的字符串) 、時(shí)間戳 、簽名組成的。
其次進(jìn)行加密,又因?yàn)樘崾臼潜仨毷枪芾韱T,所以是name:admin
將得到的session加密值傳給頁(yè)面的session,得到flag
?
相關(guān)知識(shí)點(diǎn)
1.intval 繞過(guò)
intval()?函數(shù)可以獲取變量的「整數(shù)值」。常用于強(qiáng)制類(lèi)型轉(zhuǎn)換
進(jìn)行加 1 時(shí)會(huì)先將$a的科學(xué)計(jì)數(shù)法解析然后再加 1 。也就是說(shuō)我們傳入 12e3 第一次intval會(huì)為12 ,+1后會(huì)取得12001,那么我們成功繞過(guò)了。
繞過(guò)的方式:
1.進(jìn)制類(lèi)型轉(zhuǎn)換
?繞過(guò)思路:當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以使用它的 8進(jìn)制/16進(jìn)制來(lái)繞過(guò)。
2.轉(zhuǎn)換數(shù)組
intval()?轉(zhuǎn)換數(shù)組類(lèi)型時(shí),不關(guān)心數(shù)組中的內(nèi)容,只判斷數(shù)組中有沒(méi)有元素。
?【空數(shù)組】返回 0
【非空數(shù)組】返回 1
如果傳入的?$var是數(shù)組中的某個(gè)值時(shí),則當(dāng)做變量來(lái)轉(zhuǎn)換,而不是當(dāng)做數(shù)組類(lèi)型。
$arr1 = array(8,6);var_dump(intval($arr1[0]));//輸出int(8)
繞過(guò)思路:對(duì)于弱比較(a==b),可以給a、b兩個(gè)參數(shù)傳入空數(shù)組,使弱比較為true。?
3.轉(zhuǎn)換小數(shù)
intval()?轉(zhuǎn)換小數(shù)類(lèi)型時(shí),只返回個(gè)位數(shù),不遵循四舍五入的原則。
繞過(guò)思路:當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以給它增加小數(shù)位來(lái)繞過(guò)。
4.轉(zhuǎn)換字符串
intval()?轉(zhuǎn)換字符串類(lèi)型時(shí),會(huì)判斷字符串是否以數(shù)字開(kāi)頭
- 如果以數(shù)字開(kāi)頭,就返回1個(gè)或多個(gè)連續(xù)的數(shù)字
- 如果以字母開(kāi)頭,就返回0
單雙引號(hào)對(duì)轉(zhuǎn)換結(jié)果沒(méi)有影響,并且 0 或 0x 開(kāi)頭也只會(huì)當(dāng)做普通字符串
?5.取反
intval()?函數(shù)支持一些特殊符號(hào)的,比如~取反。
繞過(guò)思路:當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以兩次取反來(lái)繞過(guò)。
6.算數(shù)運(yùn)算符
intval()?函數(shù)支持算數(shù)運(yùn)算符,如果傳入的?$var參數(shù)包含算數(shù)運(yùn)算符,會(huì)先運(yùn)算,再對(duì)運(yùn)算結(jié)果進(jìn)行轉(zhuǎn)換。
繞過(guò)思路:當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以使用算數(shù)運(yùn)算符繞過(guò)。?
7.浮點(diǎn)數(shù)精度缺失問(wèn)題
由于PHP中的浮點(diǎn)數(shù)是【弱類(lèi)型】,存在【精度丟失】的問(wèn)題,在轉(zhuǎn)換時(shí)可能會(huì)出現(xiàn)意料之外的情況。
資料參考:WEB攻防基礎(chǔ)|PHP|過(guò)濾函數(shù)intval()繞過(guò)原理及方法-CSDN博客
PHP intval()函數(shù)詳解,intval()函數(shù)漏洞原理及繞過(guò)思路_intval函數(shù)-CSDN博客
2.session偽造攻擊
(1)session的作用:
由于http協(xié)議是一個(gè)無(wú)狀態(tài)的協(xié)議,也就是說(shuō)同一個(gè)用戶第一次請(qǐng)求和第二次請(qǐng)求是完全沒(méi)有關(guān)系的,但是現(xiàn)在的網(wǎng)站基本上有登錄使用的功能,這就要求必須實(shí)現(xiàn)有狀態(tài),而session機(jī)制實(shí)現(xiàn)的就是這個(gè)功能。
用戶第一次請(qǐng)求后,將產(chǎn)生的狀態(tài)信息保存在session中,這時(shí)可以把session當(dāng)做一個(gè)容器,它保存了正在使用的所有用戶的狀態(tài)信息;這段狀態(tài)信息分配了一個(gè)唯一的標(biāo)識(shí)符用來(lái)標(biāo)識(shí)用戶的身份,將其保存在響應(yīng)對(duì)象的cookie中;當(dāng)?shù)诙握?qǐng)求時(shí),解析cookie中的標(biāo)識(shí)符,拿到標(biāo)識(shí)符后去session找到對(duì)應(yīng)的用戶的信息。
?(2)session偽造攻擊是一種非常流行的針對(duì)session的攻擊方式.它之所以流行的主要原因是:它是一個(gè)攻擊者獲得一個(gè)有效的SESSION ID(標(biāo)識(shí)符)最簡(jiǎn)單的方法,使用這種方法,可以模仿當(dāng)前用戶的SESSION ID,偽裝成這個(gè)用戶,然后進(jìn)一步進(jìn)行SESSION劫持攻擊
(3)flask session的儲(chǔ)存方式:
第一種方式:直接存在客戶端的cookies中
第二種方式:存儲(chǔ)在服務(wù)端,如:redis,memcached,mysql,file,mongodb等等,存在flask-session第三方庫(kù),flask的session可以保存在客戶端的cookie中,那么就會(huì)產(chǎn)生一定的安全問(wèn)題。
flask框架的session若存儲(chǔ)在客戶端,就需要解決session被惡意纂改的問(wèn)題,而flask通過(guò)一個(gè)secret_key,也就是密鑰對(duì)數(shù)據(jù)進(jìn)行簽名來(lái)防止session被纂改。
(4)flask的session格式:
flask的session格式一般是由base64加密的Session數(shù)據(jù)(經(jīng)過(guò)了json、zlib壓縮處理的字符串) 、時(shí)間戳 、簽名組成的。
(5)json的數(shù)據(jù)可以用花括號(hào){}或中括號(hào)[]包裹,對(duì)應(yīng)js中的object和array
對(duì)象:使用花括號(hào)
數(shù)組:使用方括號(hào)
字符串類(lèi)型:必須使用雙引號(hào)
整形、浮點(diǎn)型、布爾類(lèi)型還有null類(lèi)型
多個(gè)數(shù)據(jù)之間使用逗號(hào)分開(kāi)
json本質(zhì)上就是一個(gè)字符串
來(lái)看一段json數(shù)據(jù):
{"name":"admin","age":18}
資料:https://zhuanlan.zhihu.com/p/476520054?
Session攻擊-CSDN博客