ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php代码执行漏洞

2021-10-10 02:32:04  阅读:170  来源: 互联网

标签:PHP 函数 str 代码 assert 漏洞 代码执行 eval php


产生原因

因为对用户可控参数过滤不严,导致通过相关函数将php代码注入到Web应用中通过Web容器执行。

相关函数

PHP:eval()、assert()、call_user_func_array()、preg_replace()、call_user_func()等常规函数和动态函数$a($b) (比如$_GET($_POST["xxx"])

其中eval()和assert()区别

eval:eval() 函数把字符串按照 PHP 代码来计算和执行,该字符串必须是合法的 PHP 代码,且必须以分号结尾。如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

<?php
$string = "beautiful";
$time = "winter";
 
$str = "This is a $string $time morning!";
echo $str. "<br />";
 
eval("\$str = \"$str\";");#等同于:$str = "$str";而双引号中的代码会优先执行并替换
echo $str;
?> 

值得注意的是:

1.eval函数的参数的字符串末尾一定要有分号,在最后还要另加一个分号(这个分号是php限制)。
2.注意单引号,双引号和反斜杠的运用。如果参数中带有变量时,并且变量有赋值操作的话,变量前的$符号前一定要有\来转义,如果没有赋值操作可以不需要。

assert:
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。程序员断言在程序中的某个特定点该的表达式值为真(为真才能继续执行)。如果该表达式为假,就中断操作.
assert ( mixed $assertion [, Throwable $exception ] )
漏洞:如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。跟eval(),和eval()函数区别在于参数不需要分号;结尾

eval(" phpinfo()"); <错误>
eval(" phpinfo();"); <正确>
assert(" phpinfo()"); <正确>

其他函数

preg_replace(),call_user_func(),动态函数,以及双引号引起的对内容的二次解释引发的代码执行漏洞。
参考https://blog.csdn.net/qq_45521281/article/details/106162786

标签:PHP,函数,str,代码,assert,漏洞,代码执行,eval,php
来源: https://www.cnblogs.com/lulu-3214536072/p/15388389.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有