鱼C论坛

 找回密码
 立即注册
查看: 302|回复: 2

绕过create_function

[复制链接]
发表于 2024-3-4 00:34:10 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 好故事慢慢来 于 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()

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-4 19:59:41 | 显示全部楼层
竟然在玩ctf
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-7 18:59:05 | 显示全部楼层
在你提供的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请求:

  1. 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 这样已经弃用并且可能引入安全漏洞的函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 16:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表