一個網絡安全小白在學習過程中記錄下的筆記,希望在CSDN能和大家一起成長,學習,分享,進步,下面分享的是代碼審計中代碼執行漏洞的案例,希望對入門網安的朋友們有所幫助,大神有興趣看看即可,勿噴感謝,同時也歡迎各位師傅私聊交流學習。文章有所參考,也感謝教授我網安知識的師父們,感謝出生在這個互聯網時代,知識觸手可及。
代碼執行漏洞
原理:web應用本身過濾不嚴,即參數可控,導致攻擊者可以通過惡意請求將代碼注入到應用中執行。
挖掘思路:
1、用戶能夠控制函數輸入
2、存在能夠執行代碼的危險函數
常見的危險函數有:
eval、assert、回調函數、動態函數執行、preg_replace函數
案例:
eval、assert
<?php
if(isset($_GET['cmd'])) {
$cmd = $_GET['cmd'];
eval("\$cmd = $cmd");
}else{
echo "FAIL!";
}
傳入參數?cmd=system(ipconfig);
回調函數call_user_func、call_user_func_array、array_map
語法:
call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed
//call_user_func(函數名,參數)
<?php
function CallBack() {
global $b;
eval($b);
}
if(isset($_GET['cmd'])){
$b = $_GET['cmd'];
}
call_user_func('CallBack',$b);
或者
$b = "phpinfo()";
call_user_func($_GET['a'],$b);
動態函數
$_GET['a']($_GET['b']);
或者
$_GET['a']($_POST['b']);
preg_replace正則
重點:$pattern 存在/e模式修正符修飾允許代碼執行
正則表達式語法規則->/表達式[修正符]/
(1)普通字符作爲原子
preg_match
preg_match('/a.*d/','asddassdasd',$match);
var_dump($match);
preg_match_all
preg_match_all("/a.*d/","asddassdasd",$matchs);
var_dump($matchs);
(2)特殊字符作爲原子,即需要反斜槓轉義
preg_match_all("/\[php\]/","[php]",$matchs);
var_dump($matchs);
(3)通用字符類型作爲原子
詳見網絡安全自學篇-PHP代碼審計(二)
preg_match_all("/\d/","[php]as334535das",$matchs);
var_dump($matchs);
(4)自定義原子表作爲原子
preg_match_all("/[AJ]sp/","[php]Jsp34535dAsp",$matchs);
var_dump($matchs);
(5)限定符
$pattern1 = '/ba*du/'; //匹配出現0次或1次或多次
$pattern2 = '/ba+du/'; //匹配出現1次或多次
$pattern3 = '/ba?du/'; //匹配出現0次或1次
preg_match_all($pattern1,"baaaaaadu",$matchs);
var_dump($matchs);
pattern1
pattern2
pattern3
(6)邊界限定
$pattern1 = '/^baidu/';
$pattern2 = '/baidu$/';
$pattern3 = '/^baidu$/';
preg_match_all($pattern3,"baidu",$matchs);
var_dump($matchs);
(7)反向引用
匹配日期
$pattern1 = '/\d{4}(-)\d{2}\\1\d{2}/';
preg_match_all($pattern1,"2020-06-06",$matchs);
var_dump($matchs);
(8)/e修飾
第一個參數
$cmd = $_GET['cmd'];
$str = '<php>system(ipconfig);</php>';
preg_replace("/<php>(.*?)$cmd","\\1",$str);
第二個參數
第三個參數
往期文章: