【问题标题】:Securing ARP3 - AutoResponse Plus installation against SQL injection attacks保护 ARP3 - AutoResponse Plus 安装以防止 SQL 注入攻击
【发布时间】:2013-08-09 02:23:11
【问题描述】:

我正在使用自动回复电子邮件软件 (AutoResponse Plus - ARP3)。这是一个安装在 cgi-bin 目录中的 perl 脚本。上周有人入侵了该软件并使用该软件从我的服务器发送了大量垃圾邮件。很少有研究表明该软件没有防止 SQL 注入的机制。

如果您在同一条船上,请联系供应商进行修复。看起来没有简单的解决方案可以 100% 修复它,因为该软件的源代码已被缩小和混淆。

【问题讨论】:

  • 您展示的程序示例被故意缩小和混淆。在处理它之前,人们必须对其进行分解和解开。没有什么灵丹妙药可以防止 SQL 注入,除了: 永远不要将变量插入到 SQL 查询中。相反,可以使用占位符。如果代码使用 DBI 接口,那么更改代码以使其使用占位符可能非常容易。但这不能通过在顶部添加一些简单的额外行来完成。
  • 运行perl -p 's/\"(\\x\w\w)+\"/$&/gee' the_script,它的可读性会大大降低。
  • 如果你熟悉 php,为什么不创建一个包装 php CGI 脚本来读取 POST 变量,然后创建一个合适的 CGI 环境(即设置一些环境变量,REQUEST_METHOD="GET",QUERY_STRING ="...") 用于混淆的 perl 脚本?
  • 我在 shell 中运行了这个命令 # perl -p 's/\"(\\x\w\w)+\"/$&/gee' arp3-new.pl 并出现错误无法打开 perl 脚本 "s/\"(\\x\w\w)+\"/$&/gee": 没有这样的文件或目录
  • @Vij mob 忘记了一个标志,它应该是perl -pe,而不是perl -p

标签: sql code-injection


【解决方案1】:

你似乎很困惑。注入错误是编码错误,而不是验证问题。就是在生成代码的时候没有把文本转换成合适的字面量。

例如,

my $stmt = "
   SELECT *
     FROM Table
    WHERE $field='$value'
";

应该是

my $stmt = "
   SELECT *
     FROM Table
    WHERE ".$dbh->quote_identifier($field)."=".$dbh->quote($value)."
";

my $stmt = "
   SELECT *
     FROM Table
    WHERE ".$dbh->quote_identifier($field)."=?
";
# Followed by ->execute($value) instead of ->execute()

【讨论】:

  • 脚本被混淆后如何使用这个建议?
  • 闭源软件的问题之一是你不能自己修复它。您必须与获得脚本许可的人交谈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2012-03-19
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多