Kilka razy marudziłem, że sqlmap jest bardzo dobrym narzędziem, tylko w praktyce nie działa. Dziś krótka historia przypadku, który doprowadził mnie do lekkiej irytacji.
Co chciałbym mieć w sqlmap
Było sobie SQLi, które pięknie nadawało się do blind SQLi. Sama składnia była dość prosta, wystarczyło coś takiego:
' AND 1=(SELECT 1/0 WHERE 1=1) --
Oczywiście w miejsce 1=1 wstawić należy bardziej skomplikowane wyrażenie, które jest "sercem" całego ataku. W przypadku, gdy wyrażenie to było prawdziwe, następował błąd dzielenia przez zero, o czym system grzecznie informował przy pomocy błędy 500 oraz stosownego komunikatu. Jeśli natomiast wyrażenie było nieprawdziwe, system zachowywał się inaczej, nie ważne jak. Istotne było to, że błąd 500 był na tyle charakterystyczny, by dobrze wiedzieć co wyrocznia ma na myśli. Kluczowa natomiast była szybkość wystąpienia obu odpowiedzi. Przy blind SQLi ilość wysyłanych zapytań jest duża, więc im szybciej, tym lepiej.
Skoro jest tak oczywisty przykład SQLi, to chciałoby się sięgnąć po standardowe narzędzie i przystąpić do konsumpcji znaleziska, czyli wyciągania danych. Zamiast tego nastąpiła długa batalia z sqlmap o to, by łaskawie zadawał odpowiednie zapytania. Batalia ostatecznie przegrana.
Wydaje mi się, że wystarczająca do ukojenia moich nerwów byłaby prosta funkcja "szablonu" zapytania. Tak, by nie tylko wskazać parametr, w który ma być atakowany, ale również to, jak powinna wyglądać jego wartość. Coś w stylu:
' AND 1=(SELECT 1/0 WHERE {sqli}) --
W miejsce {sqli} narzędzie powinno wstawiać odpowiednie wyrażenie przyjmujące wartości prawda/fałsz. I życie stałoby się prostsze. Tak, wiem. Jest --prefix oraz --postfix, czasami nawet udaje mi się z tego z sukcesem skorzystać. A może ja o czymś nie wiem i to, o czym piszę jest już możliwe w sqlmap?
Może w końcu zbiorę się w sobie i zasugeruję implementację tej funkcji w sqlmap. Do tej pory miałem umiarkowaną motywację, bo kilka własnych skryptów do exploitowania takich przypadków mam. Właściwie to jeden skrypt i kilka jego wcieleń dla konkretnych przypadków. A przypadki były różne, zwykle i tak narzędzia typu sqlmap by sobie z nimi nie poradziły.
ps. To był drugi raz jak mi sqlmap pomieszał szyki - pierwszy raz na pewnym niesławnym dla mnie wargame.
A skoro mowa o tym, ile sqlmap ma funkcji - zwykle puszczam to narzędzie przez local proxy, przynajmniej na początku jego pracy, by zobaczyć czy do roboty zabiera się zgodnie z moimi oczekiwaniami. Zapytania SQL, które zadaje sqlmap, zdecydowanie nie spełniają postulatu KISS
Z połowy tych zagnieżdżeń można zrezygnować.