Хорошо, я в тупике, у меня есть веб-приложение CF11, которое не дает отчета об аудите веб-приложения для SQL-инъекции, этот отчет сделан 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>

Все, что я прочитал, говорит мне, что я защищен от атак sql (с использованием параметра cfquery, с использованием переменных данных и таблиц и т.д.), но в отчете утверждается иное

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

Может кто-нибудь пролить свет на то, что я делаю не так? или отчет неверен в своих предположениях?

0
Jay Rizzi 13 Дек 2017 в 22:37

1 ответ

Лучший ответ

Подтверждая утверждение Алекса:

Они хотят, чтобы вы учли тот факт, что rowid не является числом, они не хотят видеть стандартное сообщение об ошибке.

Мой предыдущий работодатель регулярно проводил тесты на проникновение (тесты на проникновение) для своих приложений. Сообщения об ошибках, выводимые из CF, будут просто отображать строки атаки на экране. Это нормально для непроизводственных сред, не связанных с контролем качества, где вам нужно или вы хотите, чтобы отладочная информация отображалась на экране. В производственной среде вы никогда не захотите показывать, где произошел сбой кода.

Сообщение об ошибке GET /index.cfm/status?rowid=1'%22&type=billing HTTP/1.1 сообщает злоумышленнику, какой файл и его путь, а также параметр URL-адреса, который он может атаковать. Если этот файл был включен в ваш стек запросов и этот файл можно запросить напрямую, вы можете подвергнуться дальнейшим атакам. Вам нужно отловить эту ошибку и вывести сообщение.

Если вам нужно войти в систему, чтобы получить доступ к этому URL-адресу, это одно. Общедоступный URL-адрес не должен содержать никакой информации, относящейся к проблеме. Не выводите что-то вроде The rowID must be an Integer или rowID is invalid. Это вызовет больше атак. Invalid request подходит для ошибки общедоступного URL.

Теперь о случае, когда <cfqueryparam> фактически не может остановить атаку инъекции. Некоторые устаревшие хранимые процедуры в моей предыдущей компании используют динамический SQL. Как и в CF, строки будут объединены внутри процедуры, а команда выполнения SQL запустит последнюю строку SQL. Можно передать закодированную строку в <cfqueryparam>, которая затем будет вставлена ​​в строку SQL внутри процедуры, когда она будет собрана вместе. Для этого нам пришлось обновить груды старых процедур, чтобы проверить строковые параметры, ища определенные строки, которые нужно отклонить.

Если возможно, вам следует добавить в свою инфраструктуру брандмауэр веб-приложений. Online ColdFusion Meetup Group завтра проведет презентацию одного программного обеспечения на основе WAF для приложений CF. . Я уверен, что это будет записано, если ты не сможешь присутствовать. Вчера вечером я закончил перенос моего текущего сайта CF на AWS, где мы обязательно добавили их WAF в наш стек для безопасности. Это не означает, что нам не нужно должным образом отлавливать ошибки и показывать соответствующие сообщения, но это, как правило, облегчает нагрузку, когда вы можете отклонить известные векторы атаки до того, как запрос даже попадет на сервер приложений.

8
Adrian J. Moreno 14 Дек 2017 в 03:40