如何绕过 mysql_real_escape_string 来利用 SQLi 漏洞?

信息安全 Web应用程序 php 开发 sql注入 mysql
2021-09-03 04:43:28

我试图找到一些可以绕过应该防止 sql 注入漏洞的函数的 SQL 注入漏洞,例如mysql_real_escape_string. 我发现了一个漏洞,作者描述了这个漏洞并发布了易受攻击的代码:

<?php
 if(isset($_GET['pagename'])){
  $name=$_GET['pagename'];
  $query=sprintf("SELECT* FROM ".PREFIX."page WHERE
  pagename = '%s' AND publish = 'Y'",$xx_con->real_escape_string($name));
}

但他没有描述如何绕过保护,即功能real_escape_string代码中是否存在真正的 SQLi 漏洞,攻击者如何利用它?

1个回答

更新:请参阅下面有关正确实施的评论。


原始答案,在知道这是正式记录之前:

在已引用的字符串中使用real_escape_string带有替换的函数看起来非常可疑。%s'%s'

很可能存在漏洞,如果

  • 如果real_escape_string设计不正确,
  • 或未按照其文档使用。(误用,可能带有额外的引号'或其他内容)

我强烈建议使用更标准的方法在 PHP 中解决 SQLi。一种涉及?替代的方法是最好的。但是,可能还有其他可用的声音编码方法。此类方法通常在内部添加自己的引号,在这种情况下',无需在代码中添加引号。

我确实注意到了关于该代码的另一件事。从哪里来PREFIX如果这是用户提供的,那么您显然有一个 SQLi 漏洞。另一方面,如果它只是一个硬编码或经过良好清理的值,那么你可以接受它。