Как ищут уязвимости в по
Как ищут секьюрити уязвимости
Всем привет. Меня зовут Тетка Андрей и я работаю в компании Checkmarx. Мы занимаемся разработкой статических и динамических анализаторов кода на поиск секьюрити уязвимостей и сегодня я хотел бы разобрать какие есть подходы для поиска проблем в коде.
Начнём с того, что есть несколько основных подходов для анализа кода:
Здесь мы рассмотрели основные подходы для поиска секьюрити уязвимостей и как мы видим они абсолютно разные. Где то мы анализируем код, где то мы пытаемся в реальном времени обнаружить атаку и предотвратить её. Обычно все эти подходы используются совместно, на разных этапах разработки приложения.
Но как же конкретно искать секьюрити уязвимости. Давайте на примере SAST рассмотрим два основных подхода для их поиска на примере SQL инъекций.
Первый и наверное самый известный это построение дерева кода и его анализ. В таком случае наш SAST строит внутри себя дерево по которому уже видно какой метод что вызывает и может проанализировать когда мы заходим в какой то метод и передаем параметры, которые могут быть потенциально опасными.
Второй метод это простой анализ текста (который используется в checkmarx). Здесь мы просто анализируем текст программы и при нахождении точки входа(например GET запрос), мы смотрим какие параметры мы передаем туда и следим за ними чтобы они не передавались сразу в базу данных. Нету никакого дерева или других дополнительных структур как у первого варианта, мы просто следим за всеми входящими параметрами и пытаемся их проанализировать, чтобы они не попали напрямую в базу данных. Если при получении параметра мы видим что этот параметр пишется в базу данных без санитайзинга, то мы сразу подсвечиваем это как потенциальную секьюрити уязвимость.
В целом это были основные способы искать секьюрити уязвимости. Какие то варианты работают лучше, какие то хуже, но обычно все они используются совместно, так как могут дополнять друг друга и находить разные типы уязвимостей. Как правило они так же используются на разных этапах разработки программного обеспечения, как показано на картинке чуть выше. Так же поиск секьюрити уязвимостей часто объединяют с проверкой качества кода, так как используются схожие механизмы, что позволяет не только предотвратить потенциальную угрозу, но и так же сохранить продукт более жизнеспособным на долгом промежутке времени.
Анализаторы кода уже давно стали обязательным стандартом при разработке какого либо софта. Уже давно прошёл то время когда софт разрабатывался без тестов, так как тесты стали стандартом нашей индустрии. Так и программные анализаторы кода уже стали им, по этому не принебрегайте программным анализом кода в своём приложении и узнаете много нового о том, что творится в вашем приложении.
Всем спасибо за внимания, если знаете другие подходы, то будет интересно почитать о них в комментариях.
Безопасность веб-приложений: от уязвимостей до мониторинга
Уязвимости веб-приложений возникают тогда, когда разработчики добавляют небезопасный код в веб-приложение. Это может происходить как на этапе разработки, так и на этапе доработки или исправления найденных ранее уязвимостей. Недостатки часто классифицируются по степени критичности и их распространенности. Объективной и наиболее популярной классификацией уязвимостей считается OWASP Top 10. Рейтинг составляется специалистами OWASP Project и актуализируется каждые 3-4 года. Текущий релиз выпущен в 2017 году, а следующий ожидается в 2020-2021.
Распространенные уязвимости
Для начала рассмотрим типовые уязвимости, которым подвержены многие веб-приложения.
Инъекции
Как и полагается, атаки класса «Инъекции» занимают лидирующую строчку рейтинга OWASP Top 10, встречаясь практически повсеместно и являясь крайне разнообразными в реализации. Уязвимости подобного класса начинаются SQL-инъекциями, в различных его вариациях, и заканчивая RCE — удаленным выполнением кода.
Межсайтовый скриптинг — уязвимость, встречающаяся на данный момент куда реже, чем раньше, если верить рейтингу OWASP Top 10, но несмотря на это не стала менее опасной для веб-приложений и пользователей. Особенно для пользователей, ведь атака XSS нацелена именно на них. В общем случае злоумышленник внедряет скрипт в веб-приложение, который срабатывает для каждого пользователя, посетившего вредоносную страницу.
LFI/RFI
Уязвимости данного класса позволяют злоумышленникам через браузер включать локальные и удаленные файлы на сервере в ответ от веб-приложения. Эта брешь присутствует там, где отсутствует корректная обработка входных данных, которой может манипулировать злоумышленник, инжектировать символы типа path traversal и включать другие файлы с веб-сервера.
Атаки через JSON и XML
Веб-приложения и API, обрабатывающие запросы в формате JSON или XML, также подвержены атакам, поскольку такие форматы имеют свои недостатки.
JSON (JavaScript Object Notation) — это облегченный формат обмена данными, используемый для связи между приложениями. Он похож на XML, но проще и лучше подходит для обработки с помощью JavaScript. Многие веб-приложения используют этот формат для обмена данными между собой и сериализации/десериализации данных. Некоторые веб-приложения также используют JSON для хранения важной информации, например, данных пользователя. Обычно используется в RESTful API и приложениях AJAX.
JSON чаще всего ассоциируется с API, тем не менее, часто используется даже в обычных и хорошо известных веб-приложениях. Например, редактирование материалов в WordPress производится именно через отправку запросов в формате JSON:
JSON Injection
Простая инъекция JSON на стороне сервера может быть выполнена в PHP следующим образом:
Простая инъекция JSON на стороне клиента может быть выполнена следующим образом:
JSON Hijacking
Захват JSON — атака, в некотором смысле похожая на подделку межсайтовых запросов (CSRF), при которой злоумышленник старается перехватить данные JSON, отправленные веб-приложению с веб-сервера:
XML External Entity
Атака внешней сущности XML (XXE) — это тип атаки, в котором используется широко доступная, но редко используемая функция синтаксических анализаторов XML. Используя XXE, злоумышленник может вызвать отказ в обслуживании (DoS), а также получить доступ к локальному и удаленному контенту и службам. XXE может использоваться для выполнения подделки запросов на стороне сервера (SSRF), заставляя веб-приложение выполнять запросы к другим приложениям. В некоторых случаях c помощью XXE может даже выполнить сканирование портов и удаленное выполнение кода.
XML (Extensible Markup Language) — очень популярный формат данных. Он используется во всем: от веб-сервисов (XML-RPC, SOAP, REST) до документов (XML, HTML, DOCX) и файлов изображений (данные SVG, EXIF). Для интерпретации данных XML приложению требуется анализатор XML, известный как XML-процессор. XML можно использовать не только для объявления элементов, атрибутов и текста. XML-документы могут быть определенного типа. Тип указывается в самом документе, объявляя определение типа. Анализатор XML проверяет, соответствует ли XML-документ указанному типу, прежде чем обрабатывать документ. Вы можете использовать два варианта определений типов: определение схемы XML (XSD) или определение типа документа (DTD). Уязвимости XXE встречаются в последнем варианте. Хотя DTD можно считать устаревшими, но он все еще широко используются.
Фактически, объекты XML могут поступать практически откуда угодно, включая внешние источники (отсюда и название XML External Entity). При этом, XXE может стать разновидностью атаки подделки запросов на стороне сервера (SSRF). Злоумышленник может создать запрос, используя URI (известный в XML как системный идентификатор). Если синтаксический анализатор XML настроен для обработки внешних сущностей, а по умолчанию многие популярные анализаторы XML на это настроены, веб-сервер вернет содержимое файла в системе, потенциально содержащего конфиденциальные данные.
Злоумышленник, разумеется, не ограничивается системными файлами. Можно легко заполучить и другие локальные файлы, включая исходный код, если известно расположение файлов на сервере или структура веб-приложения. Атаки на внешние объекты XML могут позволить злоумышленнику выполнять HTTP-запросы к файлам в локальной сети т.е. доступным только из-за брандмауэра.
Поиск уязвимостей. Пособие для Чайников.
а я спасибо скажу.
у нас на работе обязали каждый день на сайте тыкать кнопку «я начал работать» и «я закончил работать». это пзц же. вот и мне захотелось написать скрипт который бы эту кнопку нажимал утром и вечером автоматом каждый день.
Закрыта десятилетняя уязвимость в sudo
Специалисты по IT-безопасности компании Qualys опубликовали отчёт об обнаруженной «дыре» в популярной консольной Linux-утилите sudo. Как оказалось, используя баг, которому недавно исполнилось почти десять лет, злоумышленники могут получить root-доступ без прохождения аутентификации в ряде популярных дистрибутивов.
В ходе исследования экспертам удалось запустить сразу три эксплойта с root-правами для выполнения произвольного кода и сброса содержимого стека sudo, а также подстановки нового пользователя с повышенными привилегиями. Другими словами, с помощью уязвимости злоумышленник может получить права администратора в системе и перехватить управление компьютером.
Уязвимость государственных веб-сайтов. Как зайти в администраторскую панель с помощью admin admin?
В декабре 2020 году мною были обнаружены уязвимости на государственных веб-сайтах такие как «Законодательство Российской Федерации» и «Мониторинг государственных веб-сайтов».
На веб-сайте «Законодательство Российской Федерации» было обнаружено, что логин и пароль для авторизации в администраторскую панель присвоен стандартный: admin (логин), admin (пароль). Также на этом веб-сайте была обнаружена отражённая XSS уязвимость.
На веб-сайте «Мониторинг государственных веб-сайтов» была обнаружена хранимая XSS уязвимость, которая позволит злоумышленнику перехватить cookie пользователей (в том числе администраторов, которые имеют функционал администрирования веб-сайтом) и пользоваться аккаунтами в своих личных целях!
Также данные уязвимости существуют и на других государственных веб-сайтах!
Детские смарт-часы и иллюзия безопасности
Вы родитель молодого чада и подумываете о том, что бы купить ему смарт-часы и иметь хоть какой-то контроль над перемещением ребёнка, а так же повысить его безопасность? Но имейте ввиду, что не все устройства выполняют в полной мере функции, возложенные на них. Ниже моя история.
Как отец первокласника, я задумался о том, что бы купить смарт-часы для своего ребёнка. Изучив имеющиеся предложения на рынке, я купил часы Fixitime 3 от российской компании Elari. Ещё бы, их же даже Wylsacom рекомендовал рекламировал.
Вроде бы недешевый гаджет и безопасность данных должна быть на уровне, тем более, когда идёт речь о безопасности детей. Но так как имею некоторые представления о программировании и безопасности мобильных приложений, я полез смотреть трафик последнего. И вот незадача, буквально пол часа спустя я в плане эксперимента смог добавить устройства других детей в своё приложение.
Как видно на скриншоте сверху, один ребёнок мой, остальные добавлены произвольным образом.
Теперь, будь я злоумышленником, я бы смог без проблем следить за любым ребёнком, который использует часы этого производителя, а на самом деле любые часы, произведённые китайской компанией Wherecom под разными брендами. О последствиях даже думать не хочется. Для меня стал вопрос, либо возвращать часы продавцу либо пытаться что-то исправить. Я выбрал второй вариант.
Поэтому я написал письма вендеру, китайским разработчикам, в общем тем, кто причастен к созданию и распространению этого чудо-гаджета. Было это не просто, так как на мои сообщения ни кто не хотел отвечать. Так как я живу в Украине, я написал в украинское и в российское представительства Elari, а так же китайским разработчикам сервиса, на сервере которых часы хранят всю информацию. Да, вы правильно поняли, личные данные пользователей отправляются на китайский сервер и что хуже всего, вендор не имеет ни какого контроля над этими данными. Это и не удивительно, ведь в мобильном приложении нет ни какого лицензионного соглашения, а соответственно не прописано, куда передаются ваши личные данные и кто за это будет отвечать. Поэтому, выбирая часы, обращайте на это внимание.
Дело движется, но вяло, китайские разработчики неспеша закрывают бреши в безопасности, на которые я им указал, но главная уязвимость всё ещё не закрыта. Вы спросите, а что же Elari? Российское представительство спустя 4 недели мне так и не ответило, а украинскому только и остаётся, что транслировать ответы российского вендора, которые им в свою очередь строчат китайские разработчики.
Деталей уязвимости я по понятным причинам не выкладываю, жду, пока их все не закроют.
Для себя я условно решил дождаться 1-го сентября. Если к тому моменту проблема не решится, буду возвращать часы с фомулировкой, что они не выполняют возложенных на них функций.
Чем искать уязвимости веб-приложений: сравниваем восемь популярных сканеров
Сканеры веб-приложений — довольно популярная сегодня категория софта. Есть платные сканеры, есть бесплатные. У каждого из них свой набор параметров и уязвимостей, возможных для обнаружения. Некоторые ограничиваются только теми, что публикуются в OWASP Top Ten (Open Web Application Security Project), некоторые идут в своем black-box тестировании гораздо дальше.
В этом посте мы собрали восемь популярных сканеров, рассмотрели их подробнее и попробовали в деле. В качестве тренировочных мишеней выбрали независимые точки на двух платформах (.NET и php): premium.pgabank.com и php.testsparker.com.
OWASP ZAP
Как можно догадаться по названию, за выпуск OWASP ZAP отвечает та самая организация OWASP, что мы упомянули во вступлении. Это бесплатный инструмент для тестирования на проникновение и для поиска уязвимостей в веб-приложениях.
Основные возможности OWASP ZAP:
Интерфейс программы переведен на русский, что будет удобно для некоторых пользователей. Рабочая область OWASP ZAP складывается из нескольких окон. Внизу — вкладки с текущими заданиями и процесс их выполнения, слева — дерево сайтов, дополнительно можно вывести в правую часть окна запросов и ответов.
С помощью маркетплейса можно немного расширить функциональность сканера.
У каждого компонента программы есть много настраиваемых параметров. Например, мы можем настроить входящие векторы для активного сканирования, сгенерировать динамические SSL-сертификаты, добавить идентификаторы HTTP-сессий и т.д.
Перейдем к тестам. При сканировании сайта php.testsparker.com была найдена Blind SQL Injection. На этом критичные уязвимости заканчиваются.
На premium.bgabank.com мы видим более интересные результаты: найдена возможность Server Side Include (SSI) и Reflected Cross Site Scripting.
Все результаты сканирования можно экспортировать в отчет (поддерживается *.pdf, *.html, *.xml, *.json). В отчете подробно описываются уязвимости, найденные векторы, а также методы «закрытия» уязвимостей.
В целом работать с OWASP ZAP нам понравилось. Есть все необходимые инструменты для пентеста веб-приложения, простой и понятный интерфейс, быстрое сканирование в один клик. И при этом гибкие, глубокие настройки для более детального сканирования, что может послужить отправной точкой для дальнейшего ручного поиска уязвимостей. Ниже мы еще расскажем о сканере Burp Suite Pro, который имеет с OWASP ZAP много общего. По количеству и качеству найденных уязвимостей первый рассмотренный нами сканер показал очень неплохой результат. Рекомендован к использованию в работе.
W9scan
W9scan — это бесплатный консольный сканер уязвимостей сайта с более чем 1200 встроенными плагинами, которые могут определять отпечатки веб-страниц, портов, проводить анализ структуры веб-сайта, находить различные популярные уязвимости, сканировать на SQL Injection, XSS и т. д.
W9scan автоматически генерирует отчеты о результатах сканирования в формате HTML. Для запуска сканирования требуется только указать URL сайта и плагины, которые будут использоваться. Можно выбрать сразу все, дописав «all».
При сканировании php.testsparker.com W9scan нашел svn и возможные пути загрузки payload. Из менее критичного — определил версии используемых сервисов, возможные векторы проведения XXE, XXS-атак, нашел конфигурационные файлы сервера и провел поиск субдоменов.
На сайте premium.bgabank.com ничего критичного найдено не было. Но сканер определил возможные векторы проведения атак, определены версии сервисов, директории и субдомены.
По результатам сканирования W9scan автоматически генерирует файл отчета в формате HTML.
W9scan сканер подойдет для быстрого запуска в одну команду и мы рекомендуем использовать его как вспомогательный инструмент для определения версий сервисов, а также потенциальных векторов атак.
Wapiti
Ещё один неплохой консольный сканер. Так же, как и W9scan, готов к старту в одну команду, при этом имеет больше разных настроек сканирования.
Wapiti производит поиск следующих уязвимостей:
При сканировании сайта php.testsparker.com были найдены уязвимости Blind SQL Injection, Cross Site Scripting, Commands execution. На premium.bgabank.com Wapiti в сравнении с другими сканерами показывает не такие выдающиеся результаты: был обнаружен только Cross Site Scripting.
По результатам работы сканера также формируется отчет в формате HTML, в котором содержатся категории и число найденных уязвимостей, их описание, запросы, команды для curl и советы о том, как закрыть найденные дыры в безопасности.
Как и следовало ожидать, Wapiti до уровня OWASP ZAP, конечно, не дотягивает. Но все же он отработал качественнее W9scan, хотя не был произведен поиск директорий, субдоменов и определение версий сервисов.
Arachni
Мощный бесплатный комбайн для теста защищенности веб-приложений и поиска уязвимостей. Имеет графический интерфейс и огромную функциональность, о которой более подробно можно почитать на официальном сайте.
Внушительно, не правда ли? Но и это не все. В «паутину» завернута ещё куча плагинов, например Passive Proxy, Dictionary attacker for HTTP Auth, Cookie collector, WAF Detector и др.
Сканер имеет приятный и лаконичный веб-интерфейс:
И вот что нашел Arachni на наших тестовых сайтах. Php.testsparker.com:
На premium.bgabank.com из критичного была обнаружена только возможность межсайтовой подделки запросов (CSRF).
Отдельно отметим, какие симпатичные отчеты выдает нам Arachni. Поддерживается немало форматов — HTML, XML, text, JSON, Marshal, YAML, AFR.
В общем, Arachni оставляет после работы только положительные впечатления. Наше мнение: это «маст хэв» в арсенале любого уважающего себя спеца.
Paros
Еще один сканер веб-уязвимостей с графическим интерфейсом. По умолчанию включен в дистрибутив Kali Linux и установлен там локально. Имеет встроенный прокси, через который добавляются сайты для анализа, встроенный веб-паук, способный анализировать сайт и строить карту запросов.
Для сканирования личного кабинета пользователя необходимо авторизоваться в браузере с включенным перенаправлением трафика через прокси Paros. Сканер будет использовать авторизованные куки в процессе сканирования. Отчет о работе можно экспортировать в HTML. Он сохраняется в файл root/paros/session/LatestScannedReport.htm и в дальнейшем перезаписывается. Если вы хотите сохранить результат предыдущего сканирования, то перед началом следующего сканирования необходимо создать копию имеющегося файла.
Основные возможности (с оглядкой на OWASP TOP 10 2017):
В финальном отчете к каждому типу уязвимостей есть более подробная информация и некоторые рекомендации о способе устранения.
В нашем тестировании Paros показал довольно слабые результаты. На php.testsparker.com были найдены:
H: SQL injection
M: XSS
M: Устаревшие файлы с исходным кодом
M: Использование автозаполнения в формах с важной информацией (пароли и прочее).
L: Раскрытие внутренних IP
На premium.bgabank.com и того меньше:
M: Directory browsing
M: Использование автозаполнения в формах с важной информацией (пароли и прочее).
В итоге, хотя сканер Paros прост и достаточно удобен в использовании, слабые результаты сканирования заставляют отказаться от его использования.
Tenable.io
Платный многофункциональный облачный сканер, который умеет находить большое число веб-уязвимостей и почти полностью покрывает OWASP TOP 10 2017.
Сервис имеет встроенного веб-паука. Если в настройках сканирования указать данные авторизации (запрос авторизации, логин и пароль, авторизованные куки), то сканер проверит и личный кабинет (зону авторизованного пользователя).
Кроме сканирования веб-приложений, Tenable.io умеет сканировать сеть — как на предмет известных уязвимостей, так и для поиска хостов. Возможно подключение агентов для сканирования внутренней сети. Есть возможность экспортирования отчета в различные форматы: *.nessus, *.csv, *.db, *.pdf.
На скриншоте все домены «тестовые»
Дополнительные профили сканирования. В данной статье не затрагиваются
После сканирования становится доступна статистика и приоритизация найденных уязвимостей — critical, high, middle, low, information
В карточке уязвимости представлена дополнительная информация о ней и некоторые рекомендации по ее устранению.
Сканируем php.testsparker.com. Уязвимости с приоритетом high:
H: Уязвимости компонентов
— вышедшая из поддержки версия PHP
— вышедшая из поддержки версия Apache
H: Code injection
H: SQLinj
H: XSS
H: LFI
H: Path Traversal
Теперь premium.bgabank.com. Уязвимости с приоритетом high:
H: Уязвимости компонентов
Сканер Tenable.io показал себя хорошо, нашел множество уязвимостей. Работу с ним упрощает удобный графический интерфейс и представление данных. Еще один плюс — наличие дополнительных профилей сканирования, в которые мы пока решили не зарываться. Важной особенностью является облачная структура сервиса. С одной стороны, сервис не использует локальные вычислительные ресурсы рабочего компьютера. С другой — не сможет просканировать веб-приложения в локальной сети.
Burp Suite Pro
Burp Suite — это комплексное решение для проверок веб-приложений. Оно включает в себя разнообразные утилиты, позволяющие улучшить и ускорить поиск уязвимостей веб-приложений.
В составе Burp Suite есть следующие утилиты:
На вкладке Issue Definition представлен полный список всех уязвимостей, которые способен выявить данный сканер. Следует отметить, что список весьма внушительный.
Все уязвимости разделены на 3 категории: high, medium, low. Также есть категория information, к которой относятся механизмы сбора различной полезной информации о сканируемом ресурсе.
При запуске сканирования в окне Scan queue мы можем наблюдать за прогрессом по этапам. «Цветовая дифференциация штанов» присутствует.
На вкладке Options выполняется основная настройка параметров сканирования.
Для удобства опции разбиты по категориям. При необходимости можно получить справку по каждой категории прямо из окна настройки.
В целом Burp Suite Pro показал неплохой результат. При сканировании php.testsparker.com было найдено и классифицировано достаточно уязвимостей чтобы получить полный контроль над веб приложением и его данными — это и OS command injection, и SSTI, и File path traversal.
На сайте premium.bgabank.com были найдены:
H: Cross-site scripting (reflected)
M: SSL cookie without secure flag set
M: SSL certificate (not trusted or expired)
L: Cookie without HttpOnly flag set
L: Password field with autocomplete enabled
L: Strict transport security not enforced
Если для веб-пентеста вы часто используете Burp Suite, вам нравится его экосистема, но хотелось бы как-то автоматизировать процесс поиска уязвимостей, то эта утилита отлично впишется в ваш арсенал.
Acunetix
В заключение — еще один весьма неплохой коммерческий сканер. Его очень активно продвигают с помощью рекламы, но Acutenix не добился бы успеха без своей обширной функциональности. Среди доступных ему для обнаружения уязвимостей — все виды SQL injection, Cross site scripting, CRLF injection и прочие радости пентестера веб-приложений. Стоит отметить, что для качественного сканирования требуется выбрать правильный профиль.
Интерфейс дашборда приятный:
Все выявленные уязвимости по традиции раскладываются на четыре категории: High, Medium, Low. Ну и куда же без категории Information, в которую включаются все интересные, по мнению сканера, данные.
На вкладке Scans мы можем наблюдать прогресс сканирования и прочую диагностическую информацию.
После завершения сканирования на вкладке Vulnerabilities мы можем ознакомиться с тем, что и в каком количестве было найдено. Цветовая дифференциация на месте.
В тесте на php.testsparker.com сканер показал неплохой результат, а вот с premium.bgabank.com откровенно подкачал.
php.testsparker.com:
H: Apache 2.2.14 mod_isapi Dangling Pointer
H: Blind SQL Injection
H: Cross site scripting
H: Cross site scripting (verified)
H: Directory traversal
H: File inclusion
H: PHP code injection
H: Server-side template injection
H: SVN repository found
H: User controllable script source
M: Access database found
M: Apache 2.x version older than 2.2.9
M: Apache httpd remote denial of service
M: Apache httpOnly cookie disclosure
M: Application error message
M: Backup files
M: Directory listing
M: HTML form without CSRF protection
M: Insecure clientaccesspolicy.xml file
M: Partial user controllable script source
M: PHP hangs on parsing particular strings as floating point number
M: PHP preg_replace used on user input
M: Source code disclosure
M: User credentials are sent in clear text
L: Apache 2.x version older than 2.2.10
L: Apache mod_negotiation filename bruteforcing
L: Clickjacking: X-Frame-Options header missing
L: Login page password-guessing attack
L: Possible relative path overwrite
L: Possible sensitive directories
L: Possible sensitive files
L: TRACE method is enabled
premium.bgabank.com:
L: Clickjacking: X-Frame-Options header missing
Acunetix имеет большие возможности и подойдет, если вы ищете stand-alone решение. Веб-интерфейс прост и понятен, инфографика и отчеты выглядят вполне удобоваримо. Возможны осечки при сканировании, но, как говорил Тони Старк: «С мужиками такое случается. Не часто. Один разок из пяти».
Общие итоги
А теперь выводы по всем протестированным сканерам.