标题
一.简单介绍eval()和system()
1.eval()
2.system()
具体使用细节
一.简单介绍eval()和system():
1.eval():函数用于执行作为字符串提供的 PHP 代码。这意味着它将一个 PHP 代码字符串作为参数,并执行它,就像它是常规的 PHP 代码一样。
2.system(): 函数用于在 PHP 脚本中执行外部程序或者 shell 命令。它将命令传递给命令行并输出结果。
二.具体使用细节
1.eval()
这里配合文件上传漏洞进行讲解
靶场环境ctfshow-web151:
创捷文件名为123.php的文件,写入代码:
<?php
$a = $_GET['a'];
eval($a);
?>
由于是前端验证直接改掉前端的js就可以了,这里就不演示了。
上传成功,现在进行命令执行。
成功执行。
现在开始提问:
为什么a=phpinfo();后面需要加上分号";"
我们知道源代码,如果加上分号就会变成eval( phpinfo(); ); 显然这是违法php语法规则的
(后面回答太长没截图了)
那么问题出现在哪呢?答案是使用 eval() 函数时,需要将要执行的代码作为字符串传递给它
正确的语法应该是:
eval('phpinfo();');
由于$a = $_POST[‘a’];
而 $_POST[‘a’];它返回的类型是字符串,所以需要加上分号
注意的是:
eval(phpinfo());是一个错误的语法,但我通过实验发现它仍然会执行(但会报错误提示),初学者容易搞错。
所以可以暂且认为:
eval(‘phpinfo();’)=eval(phpinfo())
2.system()
通过简单的测试就能得出:
*使用system(‘dir’)正常 而使用system(dir)会警告但仍然执行
所以姑且:
system(‘’)=system()
另外这道ctfshow的web题上传eval()成功后可以使用eval(system())嵌套来执行系统命令。
总结:不管是system还是eval括号里正确的语法跟的都是字符串参数