php中eval和system的细节使用(配合文件上传漏洞)

一.简单介绍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括号里正确的语法跟的都是字符串参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值