Coldfusion SQL注入?未能通过web应用程序检查

Coldfusion SQL注入?未能通过web应用程序检查,coldfusion,sql-injection,Coldfusion,Sql Injection,好的,我被难住了,我有一个CF11 web应用程序在SQL注入的web应用程序审计报告中失败,这个报告是由Acunetix制作的 无论如何,该报告在我的站点上提供了10个易受sql注入攻击的页面,但我检查了代码,事实上,我在每个实例中都使用了cfqueryparam 处理程序调用的一个查询的示例 <cfquery datasource="#application.DSN#" name="qResult" result="r"> update #table# s

好的,我被难住了,我有一个CF11 web应用程序在SQL注入的web应用程序审计报告中失败,这个报告是由Acunetix制作的

无论如何,该报告在我的站点上提供了10个易受sql注入攻击的页面,但我检查了代码,事实上,我在每个实例中都使用了cfqueryparam

处理程序调用的一个查询的示例

<cfquery datasource="#application.DSN#" name="qResult" result="r">
        update  #table# s
        set s.loader_status = <cfqueryparam cfsqltype="cf_sql_varchar" value="#ucase(arguments.status)#">
        <cfif isDefined("bio_loader_status") and bio_loader_status neq ''>
         , s.bio_loader_status = <cfqueryparam cfsqltype="cf_sql_varchar" value="#ucase(bio_loader_status)#">
         </cfif>
         , s.session_id = NULL
         , s.session_expiration = NULL
         <cfif isDefined("arguments.rowid") and arguments.rowid neq ''>
                where s.rowid = CHARTOROWID(<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.rowid#">)
         </cfif>

    </cfquery>

谁能解释一下我做错了什么?还是报告的假设不正确

进一步支持Alex的主张:


他们希望您优雅地处理rowid不是数字这一事实,他们不希望看到标准错误消息


我以前的雇主定期对他们的应用进行渗透测试。CF输出的错误消息只会在屏幕上呈现攻击字符串。这适用于非生产、非QA环境,您需要或希望调试信息显示在屏幕上。在生产环境中,您永远不想知道代码在哪里出错

错误消息GET/index.cfm/status?rowid=1“%22&type=billing HTTP/1.1告诉攻击者可以进一步攻击的文件及其路径以及URL参数。如果该文件是请求堆栈中的一个包含文件,并且可以直接请求该文件,则您可能会受到进一步的攻击。您需要捕获此错误并输出一条消息

如果您必须登录才能访问此URL,这是一件事。公共URL不应包含任何特定于问题的信息。不要输出类似的内容,rowID必须是整数或rowID无效。那只会引起更多的攻击。如果出现公共URL错误,则请求无效

现在,我们来谈谈实际上无法阻止注射攻击的情况。我以前所在公司的一些遗留存储过程使用动态SQL。与CF中的情况非常相似,字符串将在proc中连接,SQL execute命令将运行最终的SQL字符串。可以将编码的字符串传递给,然后在将其拼凑在一起时将其注入到进程内部的SQL字符串中。为此,我们必须更新成堆的旧进程来验证字符串参数,寻找要拒绝的特定字符串


如果可能,您应该向基础结构中添加一个。明天将有一个关于CF应用程序的基于软件的WAF的演示。如果你不能参加,我肯定会被记录下来的。我昨天晚上刚刚把我当前的CF站点迁移到AWS,为了安全起见,我们确保将它们添加到我们的堆栈中。这并不意味着我们不需要正确地捕获错误并显示适当的消息,但当您可以让它在请求到达应用服务器之前拒绝已知的攻击向量时,它确实会减轻负载

所以,报告声称你的代码在应该出现的情况下抛出了一个错误?@KevinB哈哈,我不知道!我想是的,我的意思是我不确定为什么它声称这是一个成功的sql注入,它似乎不是,它在寻找什么条件来确定它是成功的?200状态码响应?表从何而来?他们希望您优雅地处理rowid不是数字这一事实,他们不希望看到执行数据库查询时出现的标准错误消息,他们希望看到类似这样的信息,嘿,没有这样的rowid,所有绝地武士都留下了。在生产中,你永远不想知道代码在哪里出错。好的,太棒了,很抱歉这个冗长的问题,但这非常有帮助,因为它不是一个公共url,它位于防火墙后面,需要vpn登录,并且在浏览器中进行两步身份验证,我觉得这太过分了,但这可能是所有前端开发人员都说的
URL encoded GET input rowid was set to 1'"
Error message found: Error Executing Database Query
GET /index.cfm/status?rowid=1'%22&type=billing HTTP/1.1