日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP危险函数总结

發布時間:2024/9/30 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP危险函数总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:PHP中有很多危險函數,如phpinfo() ,這次就來詳細總結一下PHP中的危險函數,并借助大師傅們的例子來進行代碼審計的練習。

一、PHP代碼執行函數

eval()函數

定義和用法:

eval() 函數把字符串按照 PHP 代碼來計算.
該字符串必須是合法的 PHP 代碼,且必須以分號結尾。

這個用法就會產生漏洞,通過一個例子來看一下:

<?php $var = "var"; if (isset($_GET["arg"])) {$arg = $_GET["arg"];eval("\$var = $arg;");echo "\$var =".$var; } ?>

輸入:http://127.0.0.1/1.php?arg=phpinfo()就會發現已經執行了eval函數

再輸入一串字符串,讓eval()函數作為命令執行

http://127.0.0.1/1.php?arg=var_dump(scandir('./')) #scandir()函數列出./(當前)目錄中的文件和目錄:


除此之外,還可以結合system()函數來獲取當前運行的服務的信息

http://127.0.0.1/1.php?a=system("net start");


這就是為什么這個函數是危險函數的原因了,將只要是合法并且符號PHP語法的字符串都可以進行解析,當然這里舉的例子都是沒有任何防護的,一般eval函數都是被加了黑名單的,但是如果存在這樣的漏洞,真的會造成很嚴重的后果。

assert()函數

定義和用法:

assert ( mixed $assertion [, Throwable $exception ] ) : bool
assert() 會檢查指定的 assertion 并在結果為 FALSE 時采取適當的行動。
判斷一個表達式是否成立。返回true or false。
如果 assertion 是字符串,它將會被 assert() 當做 PHP 代碼來執行。

一般情況下,黑名單都會禁用eval()函數,所以用assert來代替eval來執行具體操作。

例如:

assert("phpinfo()") <=> <?phpinfo()?>

與eval函數的區別:

assert()把整個字符串參數當php代碼執行,eval()把合法的php代碼執行。

preg_replace()函數

定義和用法:

preg_replace 函數執行一個正則表達式的搜索和替換。
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int KaTeX parse error: Expected 'EOF', got '&' at position 19: …it = -1 [, int &?count ]] ) : mixed

正常來說preg_replace()函數是用于正則表達式的,但preg_replace 函數也可能會導致命令執行。

如果subject 中有 pattern 的匹配則preg_replace 的 /e 修正符會將 replacement 參數當作 php 代碼,并且以 eval 函數的方式執行。

通過一個簡單的例子來看一下該函數的用法:


輸入payload:

?pat=/test/e&rep=phpinfo()&sub=jutst test 也可以為 ?pat=/test/e&rep=var_dump(`net user`)&sub=jutst test

create_function()函數

定義和用法:

string create_function ( string $args , string $code )
函數作用:從創建一個匿名函數傳遞的參數,并返回一個唯一的名稱

下面通過一個例子來了解一下這個函數

<?php error_reporting(0); $sort_by = $_GET['sort_by']; $sorter = 'strnatcasecmp'; $databases=array('1234','4321'); $sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);'; usort($databases, create_function('$a, $b', $sort_function)); ?> #usort() 使用用戶自定義的比較函數對數組進行排序

首先構造出匿名函數的原型:

function test($a,$b){return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);}

構造payload:

http://localhost/test/1.php?sort_by='"]);}phpinfo();/*


傳入后便可以得到:

return 1 * strnatcasecmp($a[""]);}phpinfo();/*"], $b[""]);}phpinfo();/*"]);

可以看到構造的語句中注釋符/*將后面"], $b[""]);}phpinfo();/*"]);這一段給注釋掉了

此時匿名函數就變成了

function test($a,$b){return 1 * strnatcasecmp($a[""]);}phpinfo();

因此可以注入成功

call_user_func函數

定義和用法:

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $… ]] )
第一個參數 callback 是被調用的回調函數,其余參數是回調函數的參數。

通過一個例子來了解一下這個函數:

<?php$filter= 'assert';$value = 'phpinfo()';call_user_func($filter, $value);?>

這里$filter作為回調函數進行調用,phpinfo()則是是回調函數的參數,所以可以執行命令

二、命令執行函數

exec()函數

定義和用法:

exec — 執行一個外部程序

shell_exec()函數

定義和用法:

通過 Shell 執行命令,并將執行結果作為字符串返回。

passthru()函數

定義和用法:

允許執行一個外部程序并回顯輸出,類似于 exec()。

escapeshellcmd()函數

定義和用法:

escapeshellcmd() 對字符串中可能會欺騙 shell 命令執行任意命令的字符進行轉義。
escapeshellcmd ( string $command ) : string

在DVWA中練習命令注入就會了解以上函數,這里就不再舉例。
DVWA_命令注入

三、包含函數

require()
include()
require_once()
include_once()

這些包含函數在之前的博客中也有過介紹,這里就不闡述了
DVWA——文件包含

四、文件操作函數

copy()------------------------拷貝文件
file_get_contents()---------將整個文件讀入一個字符串
file_put_contents()---------將一個字符串寫入文件
file()----------------------------把整個文件讀入一個數組中
fopen()------------------------打開文件或者url
move_uploaded_file()----將上傳的文件移動到新位置
readfile()----------------------輸出文件
rename()---------------------重命名一個文件或目錄
rmdir()------------------------刪除目錄
unlink & delete()-----------刪除文件

讀取:可以讀取配置等文件
寫入:可以寫入shell代碼相關的內容

總結:這次了解了PHP常用的一些危險函數,下次就通過做題將這些函數用于實踐。

參考博客:
常見危險函數及特殊函數
PHP代碼命令注入小結

總結

以上是生活随笔為你收集整理的PHP危险函数总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。