绕过create_function
本帖最后由 好故事慢慢来 于 2024-3-4 09:26 编辑<?
highlight_file(__FILE__);
error_reporting(0);
$cmd = $_GET['cmd'];
$name = $_GET['name'];
if(preg_match("/\=/i",$name) || preg_match("/\=/i",$cmd)){
die("cc还是不想给你flag");
}
create_function(base64_decode($name),md5($cmd))();
这个代码里面如何能绕过create_function函数,执行phpinfo() 竟然在玩ctf{:10_257:} 在你提供的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 这样已经弃用并且可能引入安全漏洞的函数。
页:
[1]