一个网络安全学习爱好者在学习过程中记录下的笔记,希望在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);
第二个参数
第三个参数
往期文章: