preg_replace()的意外危险 C/C++ java

admin 8月前 118

preg_replace()的意外危险

PHP的preg_replace()函数的晦涩和危险的特性,它可能导致代码在某些非常见情况下执行。我最近发现了一些容易受到野外攻击的代码,因此我想为那些可能不熟悉这种危险的渗透测试人员和PHP编码人员编写一份快速的摘要。

让我们从一个代码示例开始:

<?php
$in = 'Somewhere, something incredible is waiting to be known';
echo preg_replace($_GET['replace'], $_GET['with'], $in);
?>

该代码将采用用户提供的正则表达式,并将其匹配的内容替换为用户提供的字符串。所以如果我们打电话给preg_replace.php?replace = /已知/ i&with =吃,脚本将执行不区分大小写的正则表达式搜索( 一世修饰符)并在某处回声,令人难以置信的事情正在等待被食用。看起来足够安全,对吧?

你刚刚被拥有

上面的代码易于注入代码,因为它无法解决输入字符串中的危险PCRE修改标志。大多数修饰符都是无害的,可让您执行不区分大小写和多行搜索之类的操作,但是一个修饰符“Ë”将导致PHP执行 preg_replace()作为PHP代码进行操作。我再说一遍:

设置 Ë regex修饰符将使PHP以代码的形式执行替换值。

为什么PHP有此选项?我不知道,由于它不计后果的不安全特性,它在以后的版本(PHP> = 5.5.0)中实际上已被弃用。许多人仍在使用PHP 5.2或向PHP 5.3迁移,即使不推荐使用该选项仍然有效(默认情况下,它将在关闭日志级别时生成警告),因此问题仍然存在一段时间。

利用代码

要利用此代码,攻击者所需要做的就是提供一些PHP代码来执行,生成一个正则表达式,用该代码替换部分或全部字符串,并设置 Ë 正则表达式上的修饰符:

这里的所有都是它的。在此示例中,当系统() 调用被执行,然后是匹配项被替换为输出的最后一行的字符串(即 系统() 返回)。

空字节问题

通常会找到代码,在这些代码中,编码器手动设置了正则表达式定界符及其要使用的任何修饰符:

<?php
$in = 'Somewhere, something incredible is waiting to be known';
echo preg_replace('/' . $_GET['replace'] . '/i', $_GET['with'], $in);?>

该代码似乎是安全的,因为攻击者无法再使用自己的修饰符来结束正则表达式。但是,安全是一种幻想,因为preg_replace()处理空字节。

通过传入“欺骗的”结束定界符,并Ë 修饰符后跟一个空字节追赶者,代码中的结束定界符和修饰符永远不会得到处理。

相反,攻击者的带有执行修饰符的字符串将终止表达式并导致代码执行。

保护代码

PHP提供了一个方便的函数,名为preg_quote(),它将引用输入字符串中的所有讨厌字符并防止代码注入。即使使用此功能,也要注意您的自定义正则表达式定界符可能不在功能范围之内。使用第二个参数来指定您选择的定界符:

<?php
$in = 'Somewhere, something incredible is waiting to be known';
echo preg_replace('#' . preg_quote($_GET['replace'], '#') . '#', $_GET['with'], $in);?>

使用 preg_quote()使所有正则表达式字符变为惰性,因此,如果需要允许某些访问以使用正则表达式,则需要手动转义分隔符。但是要非常小心,这种方法容易出错。您还需要转义转义符,否则攻击者可以使用自己的转义符逃避您的逃避。

这个问题的影响范围广泛。它的微妙而致命的特性使其很容易在开发和审查代码时被遗漏。在那里要小心,并始终考虑如何使用输入。

更新:请注意,如果在代码中搜索与正则表达式替换有关的问题,还请检查其他易受攻击的函数变体,例如ereg_replace()eregi_replace()mb_ereg_replace()mb_eregi_replace()


少客联盟- 版权声明 1、本主题所有言论和图片纯属会员个人意见,与少客联盟立场无关。
2、本站所有主题由该帖子作者发表,该帖子作者admin少客联盟享有帖子相关版权。
3、少客联盟管理员和版主有权不事先通知发贴者而删除本文。
4、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者admin少客联盟的同意。
5、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任。
6、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
7、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意。
8、官方反馈邮箱:chinasuc@chinasuc.cn


上一篇:当网站不允许上传ASP,CGI,CER,CDX,HTR
下一篇:Java,实例,8211,字符串优化
Whatever is worth doing is worth doing well. juvenile hacker league
最新回复 (0)
    • 少客联盟
      2
        登录 注册 QQ登录(停用)
返回