Прокачал сканер на Rust: теперь он не верит каждому 200 OK 🦀🔍
Прокачал сканер на Rust: теперь он не верит каждому 200 OK 🦀🔍 В прошлом посте я показал асинхронный сканер путей, который собрал за 30 минут и запустил на локальном OWASP Juice Shop. На этом решил не останавливаться: доработал инструмент - и заодно поймал ловушку, из-за которой сканер может радостно находить то, чего на сервере нет. Что добавил: - Внешний словарь: пути теперь читаются из файла, а не зашиты в исходник. - Аргументы командной строки: можно задать адрес стенда, словарь, лимит одновременных запросов и прокси. - Ограничение конкурентности через Semaphore в Tokio: количество запросов в работе теперь контролируется. - Прокси для Burp Suite: запросы можно разбирать в HTTP history, а не судить о результате только по терминалу. Но самое интересное началось после запуска. Сканер показал 200 OK для /.env, /.git, /admin и других путей. На первый взгляд - праздник баг-хантера. Только шампанское оказалось преждевременным. 😏 Сервер отвечает - это ещё не находка На нашем стенде приложение возвращало HTML-заглушку даже при обращении к несуществующему пути. Поэтому проверка «получил 200 - значит, нашёл файл» давала ложные срабатывания. Добавил калибровку: перед проходом по словарю сканер запрашивает заведомо выдуманный путь и измеряет размер тела ответа. Затем отбрасывает ответы с такой же длиной. В вывод также добавил размер и Content-Type - теперь видно не только статус, но и характер ответа. На моём стенде размер заглушки составил 9984 байта. После фильтрации из словаря на 13 путей в выводе остались: [200] [28 байт] [text/plain] /robots.txt [200] [26227 байт] [text/plain] /metrics [200] [26411 байт] [application/json] /api/Products Это результат конкретного локального прогона, а не список подтверждённых уязвимостей. Зато шума стало заметно меньше: вместо пачки одинаковых HTML-страниц - ответы, которые можно разбирать дальше. Как запускаю ./target/release/juice_scanner \ -u http://127.0.0.1:3000 \ -w paths.txt \ -t 5 \ -p http://127.0.0.1:8080 Здесь -t 5 задаёт лимит пяти одновременно выполняющихся запросов, а -p направляет трафик через Burp Suite. Проверку провожу на своём локальном полигоне. Важная оговорка: фильтр пока сравнивает только длину тела ответа. Совпадение размеров не доказывает, что содержимое одинаковое, поэтому считать такую проверку универсальной защитой от ложных срабатываний я не буду. Это полезная эвристика прототипа, а не магия. Главный апгрейд здесь даже не новые флаги. Я перестал считать зелёную строку в терминале доказательством находки. Написать сканер, который радуется каждому 200 OK, несложно. Научить его сомневаться - вот где начинается интересная инженерная работа. 💻