ColdFusion sql issue



对URL运行安全扫描并收到以下报告:

此漏洞影响

/rolecall.cfm , bbb_id

这是rolecall.cfm代码:

<cfscript>
if (isDefined("url") and isDefined("url.bbb_id")) {
if (url.dept_id eq -1)
_include("sql", "getB");
else
_include("sql", "getBNow");
}
/*...*/
_include("sql", "getDPlaces");
/*Set up the model and go*/
model = {
add    = 1,
edit   = 0,
remove = 0,
places   = getDPlaces
};
</cfscript>

如果您使用的是 IIS,则应阅读本文,了解如何将 SQL 注入保护直接添加到 Web 服务器。这将阻止攻击请求到达ColdFusion。

小心他们建议你拒绝的字符串:

<denyStrings>
<add string="--" />
<add string=";" />
<add string="/*" />
<add string="@" />

请确保永远不要将电子邮件地址作为查询字符串参数的值传递,否则将拒绝合法请求。如果需要,您可以允许@符号。

我还强烈建议您查看HackMyCF,如果存在,它将向您展示许多其他安全问题。

SQL 注入通过将恶意 sql命令填充到不需要的查询中来利用数据库。诱骗查询执行与其设计目的不同的操作,例如执行 DROP 或 DELETE 而不是 SELECT。

  1. 使用如下原始客户端参数的查询容易受到攻击:

    WHERE policy_funct_id = #url.dept_id#
    

    相反,始终将客户端提供的参数包装在 cfqueryparam 中。它可以防止它们作为命令执行。我不知道您的列数据类型,因此请根据需要修改 cfsqltype。

    WHERE policy_funct_id = <cfqueryparam value="#url.dept_id#" cfsqltype="cf_sql_integer">
    
  2. 所有动态表名称都是另一个(潜在(漏洞,例如:

    -- potential sql-injection risk
    SELECT * FROM #db.root#
    

    如果#db.root#是用户提供的,则存在 sql-i 风险。不幸的是,cfqueryparam 不能用于表名。这些必须手动(并仔细(验证。


其他一些与SQL注入无关的建议:

  • 所有嵌套的(select * from...)语句都会降低可读性。请改用单级 JOIN。

  • 使用 JOIN 时,最好为所有列指定源表(或表别名(。这样可以避免歧义,并提高您自己和审阅代码的任何其他人的可读性。无需猜测哪些列来自哪个表。

-- psuedo example
SELECT  root.ColumnA
, root.ColumnB
, dept.ColumnC
, subcat.ColumnC
, etc... 
FROM #db.root# root 
INNER JOIN #db.content# content ON root.policy_root_id = content.content_id
INNER JOIN #db.dept# AS dept ON ON content.dept_id = dept.policy_funct_id
INNER JOIN #db.subcat# subcat ON subcat.dept_id = dept.policy_funct_id
WHERE dept.policy_funct_id = <cfqueryparam value="#url.dept_id#" cfsqltype="cf_sql_integer">
AND   content.is_newest = 1

最新更新