Fuzzery są fajne. Są zdecydowanie szybsze niż ludzie, wykonają więc więcej testów. Tylko... jak sprawdzić jaki jest skutek tego fuzzowania?
Fuzzing i co dalej?
Umówmy się, że w nieco bardziej poważnych aplikacjach nie można zwykle liczyć na oczywiste komunikaty błędów. Zdarzają się, ale jest to raczej wyjątek od reguły. Należy się raczej spodziewać innych komunikatów, problem w tym, że nie do końca wiadomo jakich...
Moim podstawowym sposobem działania jest porównywanie odpowiedzi serwera w odpowiedzi na oryginalne żądanie z odpowiedzią na żądanie modyfikowane (przypadek testowy). W tym celu korzystam z WinMerge, które prostym skryptem podpiąłem sobie pod Fiddlera (domyślnie jest w Fiddlerze możliwość skorzystania z WinDiff).
Powyższy sposób w przypadku działania masowego sprawdza się jednak umiarkowanie. Ciekawe rozwiązanie tego problemu znajduje się w w3af. Dostępny jest tam moduł Fuzzy request a w nim funkcja Cluster response. Sam moduł fuzzingu nie wyróżnia się niczym specjalnym. Podstawowy mechanizm jego działania jest prosty, przygotowuje się odpowiednie żądanie, w które "wkłada się" generatory uruchamia i zbiera odpowiedzi. Może wygląda to topornie, nie jest ślicznie klikane, nie jest klikalne, ale po prostu działa.
A rezultat "klastrowania" odpowiedzi wygląda mniej więcej tak:

W tym wypadku parametrem, który został użyty do określenia dystansu między poszczególnymi odpowiedziami jest wielkość odpowiedzi. Inne dostępne możliwości to kod odpowiedzi serwera oraz Levenshtein distance, możliwe jest też definiowania własnej funkcji. Ciekawy jestem jakie efekty dawałby fuzzy hashing.
Do samego GUI można mieć sporo zastrzeżeń. Brakuje mi tu łatwego podglądu poszczególnych żądań (jakie żądanie wygenerowało tak bardzo odległą odpowiedź), oraz wskazanie "wzorca", od którego odległość innych żądań chciałbym wyliczyć. Ogólnie pomysł jednak bardzo mi się podoba. Może ktoś napisze plugin do Fiddlera, który potrafi generować takie wykresy?