在你提供的PHP代码中,create_function() 用于创建一个匿名函数,但在最新版本的PHP中,create_function() 已经被弃用,因为它可能引起安全问题。
不过,这段代码看起来是一个有意设计的挑战或练习,目的是要求我们绕过某些限制来执行 phpinfo() 函数。
这里有一些关键点需要注意:
- 1. 不能在 name 和 cmd 变量中使用等号(=)。
- 2. md5(cmd) 会被执行,因此 cmd 不能直接是想要执行的代码,否则其输出将是无用的md5散列值。
- 3. create_function() 需要两个参数:参数列表(参数名)和函数体代码。
要绕过这些限制,我们可以这样做:
- 1. 利用 PHP 的弱类型特性来绕过等号的限制。
- 2. 确保 name 参数通过 base64 编码得到的值是一个合法的参数名。
- 3. 在不使用等号的情况下构造 cmd 参数。
这里有一个可能的绕过方法:
- - name 可以是 base64编码后的 phpinfo(不带任何参数)。
- - cmd 可以是一个不包含任何实际命令的字符串,因为我们不关心 md5() 的输出。因为md5的输出会被忽略,我们可以传递任何值,只要它没有等号即可。
综上,我们可以构造如下的HTTP GET请求:
http://target.com/script.php?name=cGhwaW5mbw==&cmd=anything
在这个请求中:
- - name 的值是 phpinfo 函数名的 base64 编码。
- - cmd 只是一个任意字符串,因为 md5() 的输出将不会被使用。
但是,因为 create_function 被执行时需要两个参数,一个是参数列表,一个是函数体,而我们这里只提供了函数体,所以还需要修改 name 参数,让它能够成为一个有效的函数体。
我们不能直接使用 phpinfo() 因为这已经是一个完整的函数调用了,我们需要的是可以在 create_function 的函数体部分运行的代码。
但是在这个例子中,由于 create_function 的第一个参数(参数列表)是通过 base64 解码 name 变量获得的,我们可能需要更加巧妙的方法来构建这个参数,以便 create_function 不会因为缺少参数而失败。
请注意,尽管这里提供了理论上的方法,但实际操作可能存在风险,特别是在一个不受你控制的系统上尝试执行 phpinfo() 或其他PHP函数可能违反安全政策或法律法规。
这应该仅在你有权限操作的环境和合法的情况下进行。
在实际的环境中,建议总是使用安全的编码实践,并避免使用诸如 create_function 这样已经弃用并且可能引入安全漏洞的函数。 |