0%

PHP语法构造和变量函数

昨天我发现了一个问题

1
2
3
4
<?php
$a='693741';
$a=base_convert($a,10,36);
$a(system("dir"));

$a是36进制的eval转换成的10进制

所以这个代码其实就是eval(system("dir"));,但是运行的时候却报错了

1
PHP Fatal error:  Uncaught Error: Call to undefined function eval()

然后去网上了解了才知道

eval 属于PHP语法构造的一部分,并不是一个函数,所以不能通过 变量函数 的形式来调用`

类似的语法构造还有:echoprintunset()isset()empty()includerequire

就比如

1
2
3
4
5
6
7
8
9
print "asdasd";
>asdasd

function myprint($a)
{
print $a;
}
myprint "asdasdasd";
>Parse error: syntax error, unexpected '"asdasdasd"' (T_CONSTANT_ENCAPSED_STRING)

直接print "asdasd"就可以打印出字符,但是自己构造的函数却没有办法这样。

所以网上有的一句话木马来调用eval的其实都不可以,换成assert就可以了。