php特性
函數(shù)特性
is_file()繞過
is_file() 如果輸入的是存在且正常的文件就返回true,利用函數(shù)所能處理的長(zhǎng)度限制進(jìn)行目錄溢出,超過is_file能處理的最大長(zhǎng)度就不認(rèn)為是個(gè)文件了。
/proc/self/root為根目錄,經(jīng)過實(shí)驗(yàn)21個(gè)/proc/self/root加上/var/www/html/flag.php便可以繞過
is_numeric()
%0c,%09,%20都可以讓is_numeric()函數(shù)為true
include()
文件中有<? 就會(huì)將 <? 后識(shí)別成php代碼
assert()
執(zhí)行命令不需要;
usleep()
返回值 NULL
parse_str()
用來將字符串轉(zhuǎn)換成變量的函數(shù)
如:
<?php
$str = "name=Peter&age=43";
parse_str($str, $output);
echo $output['name']; // 輸出: Peter
echo $output['age']; // 輸出: 43
preg_match()
繞過方法:
- 該函數(shù)當(dāng)檢測(cè)的變量是數(shù)組的時(shí)候會(huì)報(bào)錯(cuò)并返回0
- 利用正則回溯最大次數(shù)上限繞過繞
php為了防止dos攻擊,可以設(shè)置preg_match()正則回溯最大限制。preg_match()默認(rèn)是1000000次(實(shí)測(cè)回溯為100w次,5.3.7版本以前是10w次),可在php.ini中查詢。- 無回溯匹配正則
/ab{1,3}c/ 匹配 abbbc時(shí),則無回溯 - 有回溯匹配正則
/ab{1,3}c/ 匹配 abbc時(shí),則會(huì)產(chǎn)生回溯- 貪婪量詞
{1,3}為貪婪量詞,盡可能匹配更多個(gè)字符
用/ab{1,3}c/匹配 abbc 會(huì)匹配 bb - 惰性量詞
{1,3}?為惰性量詞,可能匹配少個(gè)字符
/ab{1,3}?c/匹配 abbc {1,3}?只會(huì)匹配1個(gè)b
參考文章:https://blog.csdn.net/yourdawntown/article/details/120558237
- 貪婪量詞
- 無回溯匹配正則
- 換行繞過
__autoload()
當(dāng)進(jìn)行類判斷的時(shí)候自動(dòng)調(diào)用 php版本<7.2
intval()
- 該函數(shù)不能用于 object,否則會(huì)產(chǎn)生 E_NOTICE 錯(cuò)誤并返回 1。輸入空數(shù)組會(huì)返回0 非空返回1
- 開頭+和空格會(huì)當(dāng)正數(shù)或刪除 如:+100 --> 100 %20100-->100
- 第二個(gè)參數(shù) $base 允許為空。
- 當(dāng) base 為空時(shí),默認(rèn)值是 0,會(huì)根據(jù) $var 的格式來調(diào)整轉(zhuǎn)換的進(jìn)制。
如果 $var 以 0 開頭,就使用 8進(jìn)制
如果 $var 以0x開頭,就使用 16進(jìn)制
https://blog.csdn.net/wangyuxiang946/article/details/131156104
create_function()
語法:
create_function(string $args, string $code)
string $args //聲明的函數(shù)變量部分
string $code //執(zhí)行的方法代碼部分
其會(huì)創(chuàng)造一個(gè)匿名函數(shù)。
如:
$a=create_function("$a","echo($a);");
//創(chuàng)建一個(gè)叫做lamvda_1的函數(shù)。
//這等價(jià)于:
function lambda_1($a){
echo($a);
}
$a("I'm Liu"); 調(diào)用函數(shù)等價(jià)于 lambda_1("I'm Liu");
利用:
在其第二個(gè)參數(shù)做手腳。
如
$a=create_function("$a","echo($a);}system('ls');/*");
則創(chuàng)建后變成如下:
function lambda_1($a){
echo($a);
}
system('ls');
/*
}
如此便能執(zhí)行命令。
https://blog.csdn.net/snowlyzz/article/details/127171931#create_function()簡(jiǎn)介
md5()
該函數(shù)傳入數(shù)組,會(huì)返回NULL
in_arry()
該函數(shù)有漏洞 沒有設(shè)置第三個(gè)參數(shù) 就可以形成自動(dòng)轉(zhuǎn)換,如:1.php自動(dòng)轉(zhuǎn)換為1
parse_str()
函數(shù)把查詢字符串解析到變量中。
注釋:如果未設(shè)置 array 參數(shù),由該函數(shù)設(shè)置的變量將覆蓋已存在的同名變量
eregi()
可以使用%00繞過匹配(PHP5版本,該函數(shù)在PHP7中被棄用)
如:a%00b 只會(huì)匹配a
strcmp()
傳入數(shù)組返回 NULL
basename()
在使用默認(rèn)語言環(huán)境設(shè)置時(shí),basename() 會(huì)刪除文件名開頭的非 ASCII 字符和中文,
_()和gettext()
_() 函數(shù)即 gettext() 函數(shù),可以將參數(shù)翻譯成指定語言,一般就是原封不動(dòng)的輸出參數(shù)
get_defined_vars 函數(shù)可以輸出所有變量的信息,兩者結(jié)合拿到flag
call_user_func()
調(diào)用類中函數(shù)的方式
<?php
class myclass {
static function say_hello()
{
echo "Hello!\n";
}
}
$classname = "myclass";
call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello');
$myobject = new myclass();
call_user_func(array($myobject, 'say_hello'));
?>
https://www.php.net/manual/zh/function.call-user-func.php
其他特性
1.超過精確度的弱類型問題
超過精確度的數(shù)字(小數(shù)點(diǎn)后超過17位)在進(jìn)行弱類型比較時(shí),會(huì)出 現(xiàn)相等的情況。例如var_dump(0.99999999999999999==1)的結(jié)果 為True。
2.NULL、0、"0"、array()、字母、進(jìn)制的比較
- NULL、0、"0"、array()在使用==和false比較時(shí),都會(huì)返回true。
- 字母和數(shù)字進(jìn)行弱類型比較的時(shí)候,會(huì)轉(zhuǎn)換為NULL。
- 弱類型比較時(shí),對(duì)于進(jìn)制(十六進(jìn)制、八進(jìn)制、二進(jìn)制等)格式的字 符串,會(huì)將其轉(zhuǎn)換為數(shù)字。
3.$GLOBALS數(shù)組包含當(dāng)前腳本內(nèi)定義成全局范圍的所有變量的引用。 數(shù)組的鍵就是變量的名字。
4.作用域:php函數(shù)中無法調(diào)用外部變量
5.$_REQUEST可以接受GET、POST請(qǐng)求
6.$_SERVER['argv']- cli模式(命令行)下,第一個(gè)參數(shù)
$_SERVER['argv'][0]是腳本名,其余的是傳遞給腳本的參數(shù). - 在web頁(yè)模式下必須在php.ini開啟
register_argc_argv配置項(xiàng),$_SERVER['argv']才會(huì)有效果。
此時(shí)的$_SERVER['argv'][0]=$_SERVER['QUERY_STRING'],及為url/?后的值,列如:127.0.0.1/?abc=23值則為abc=23
- cli模式(命令行)下,第一個(gè)參數(shù)
其他
- php檢查兩數(shù)組是否相等的時(shí)候,不會(huì)檢查指針是否相等,而是會(huì)檢查元素是否相等
- php運(yùn)算符優(yōu)先級(jí)
| 無 | clone new | clone 和 new |
|---|---|---|
| 左 | [ | array() |
| 右 | ++ – ~ (int) (float) (string) (array) (object) (bool) @ | 類型和遞增/遞減 |
| 無 | instanceof | 類型 |
| 右 | ! | 邏輯運(yùn)算符 |
| 左 | * / % | 算術(shù)運(yùn)算符 |
| 左 | + – . | 算術(shù)運(yùn)算符和字符串運(yùn)算符 |
| 左 | << >> | 位運(yùn)算符 |
| 無 | == != === !== <> | 比較運(yùn)算符 |
| 左 | & | 位運(yùn)算符和引用 |
| 左 | ^ | 位運(yùn)算符 |
| 左 | | | 位運(yùn)算符 |
| 左 | && | 邏輯運(yùn)算符 |
| 左 | || | 邏輯運(yùn)算符 |
| 左 | ? : | 三元運(yùn)算符 |
| 右 | = += -= *= /= .= %= &= | = ^= <<= >>= => |
| 左 | and | 邏輯運(yùn)算符 |
| 左 | xor | 邏輯運(yùn)算符 |
| 左 | or | 邏輯運(yùn)算符 |
| 左 | , | 多處用到 |
| 3.反射類new ReflectionClass() 根據(jù)邏輯創(chuàng)建不同類時(shí)使用反射類。 | ||
| echo new ReflectionClass('類名');可以輸出此類中的屬性和方法名。 |
浙公網(wǎng)安備 33010602011771號(hào)