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

Jay*_*zzi 0 coldfusion sql-injection

好吧,我很难过,我有一个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>
Run Code Online (Sandbox Code Playgroud)

我读过的所有内容都告诉我,我可以防止sql攻击(使用cfquery param,使用datasurce和table变量等),但报告另有说法

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
Run Code Online (Sandbox Code Playgroud)

有人能说清楚我做错了吗?或者报告的假设是否正确?

Adr*_*eno 8

继续亚历克斯的断言:

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

我以前的雇主对他们的申请进行了定期渗透测试(笔测试).从CF输出的错误消息只会在屏幕上呈现攻击的字符串.这适用于您需要或希望在屏幕上显示调试信息的非生产,非QA环境.在制作中,您永远不会想到代码绊倒的地方.

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

如果您必须登录才能访问此URL,那就是一件事.公共URL不应包含任何特定于该问题的信息.不输出类似的东西,The rowID must be an IntegerrowID is invalid.这只会导致更多的攻击.Invalid request适用于公共URL错误.

现在,到<cfqueryparam>实际无法停止注射攻击的情况下.我以前公司的一些旧存储过程使用动态SQL.与CF类似,字符串将在proc中连接,SQL execute命令将运行最终的SQL字符串.可以将编码的字符串传递给<cfqueryparam>它,然后将它拼接到proc中的SQL字符串中.为此,我们必须更新成堆的旧proc以验证字符串参数,查找要拒绝的某些字符串.

如果可能,您应该将Web应用程序防火墙添加到您的基础结构中.在网上的ColdFusion Meetup网站组正在对基于WAF的CF应用明天一个软件演示.如果你不能参加,我相信它会被记录下来.我刚刚昨晚完成了将当前的CF站点移至AWS,我们确保将其WAF添加到我们的堆栈中以确保安全.这并不意味着我们不需要正确捕获错误并显示适当的消息,但在请求甚至到达应用程序服务器之前,它确实可以减轻负载.