ctf知識點總結
php的序列化和反序列化:serialize()和unserialize()函式的作用是把複雜的資料型別壓縮到一個字串中來傳輸
例如:我們要傳輸一個數組
$stooges
=
array
(
'Moe'
,
'Larry'
,
'Curly'
);
$new
= serialize(
$stooges
);
print_r(
$new
);
echo
"<br />"
;
print_r(unserialize(
$new
));
這個數組裡有三個元素,這三個元素有不同的資料型別,因此我們可以通過這個序列化函式將陣列的鍵值和大小分別儲存起來,這個例子的輸出結果便是:
結果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}在進行傳遞這些序列化的資料時會對這些資料進行urlencode進行傳輸
php偽協議的利用
php偽協議的利用常常和我們的檔案包含來一起使用接下來先講解一下php中的檔案包含的函式
include
require
include_once
require_once
highlight_file
show_source
readfile
file_get_contents
fopen
file
這些便是常用的檔案包含函式,這些函式雖然使用方便但是常常伴隨一些漏洞但是這些函式的使用和一些配置檔案有關
PHP.ini:
allow_url_fopen :on 預設開啟 該選項為on便是激活了 URL 形式的 fopen 封裝協議使得可以訪問 URL 物件檔案等。
allow_url_include:off 預設關閉,該選項為on便是允許 包含URL 物件檔案等。
為了能夠儘可能的列舉所有情況本次測試使用的PHP版本為>=5.2 具體為5.2,5.3,5.5,7.0;PHP版本<=5.2 可以使用%00進行截斷。
接下來是一些例子:
http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt
<?php
include($_GET['file'])
?>
這個便是一個檔案包含的例子如果沒有對使用者提交的資料進行過濾,便可以訪問伺服器的任意檔案了
情況二:需要截斷:
在php版本<=5.2中進行測試是可以使用%00截斷的。
http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt%00
<?php
include($_GET['file'].’.php’)
?>
這個表示使用%00截斷,這是函式的漏洞,記住即可
php的偽協議有php://input、 php://stdin、 php://memory ,php://filter和 php://temp 等等
file://協議可以訪問本地的檔案,但是必須是絕對路徑
php://filter 讀取原始碼並進行base64編碼輸出,不然會直接當做php程式碼執行就看不到原始碼內容了。
這個返回的base64編碼的字串
php://input 可以訪問請求的原始資料的只讀流, 將post請求中的資料作為PHP程式碼執行
這個函式的工作原理便是將post方式提交的資料讀取出來,並當作命令來執行,因此便會返回這個頁面
以上內容都是參考他人的部落格