Testuję aplikację opartą na wyroczni i znalazłem następujący kod:
Zapytanie = "WYBIERZ imię i nazwisko pracowników, GDZIE id = '" + PKID + "';"
tzn. ciąg zapytania zawiera cudzysłowy wokół wartości PKID, która jest uzyskiwana bezpośrednio z adresu URL.
Oczywiście jest to klasyczny wstrzyknięcie SQL, które czeka ... z wyjątkiem aplikacji, która stoi za CA SiteMinder, który blokuje przesyłanie dowolnego adresu URL z pojedynczym cytatem (w dowolnej formie) do aplikacji.
Czy jest jakiś sposób na wyrwanie się z łańcucha i wstrzyknięcie SQL bez użycia pojedynczego cudzysłowu?
Edycja: Przepraszam, powinienem być jaśniejszy - rozumiem, jak powinien być napisany, ale muszę przekonać ludzi, że jest to problem nadający się do wykorzystania. W tej chwili jest za siteminder, który blokuje pojedyncze cudzysłowy, więc będzie to poprawka o niskim priorytecie.
źródło
Odpowiedzi:
Tak, możliwe jest wykonanie iniekcji SQL bez podawania cudzysłowu w parametrze.
Można to zrobić wykorzystując exploit związany ze sposobem przetwarzania liczb i / lub dat. Na poziomie sesji można określić, jaki jest format daty lub liczby. Manipulując tym możesz nastrzyknąć dowolną postacią.
Domyślnie w Wielkiej Brytanii i USA przecinek jest używany do wskazania separatora tysięcy w liczbach i kropki po przecinku. Możesz zmienić te wartości domyślne, wykonując:
Oznacza to, że „P” jest teraz kropką dziesiętną, a „Z” to separator tysięcy. Więc:
Jest liczbą 0,01. Jeśli jednak utworzysz funkcję P01, odniesienie do obiektu zostanie odczytane przed konwersją liczb. Pozwala to na wykonywanie funkcji w bazie danych, zwiększając uprawnienia w następujący sposób:
Utwórz podstawową funkcję „get by id”:
Utwórz także funkcję P01, która robi coś niepożądanego (w tym przypadku po prostu tworzy tabelę, ale masz pomysł):
I możemy iść:
Nigdzie nie ma cytatów, ale nadal udało nam się uruchomić funkcję „ukrytego” P01 i utworzyć tabelę
t
!Chociaż może to być trudne w praktyce (i może wymagać wewnętrznej wiedzy / pomocy), pokazuje to, że można wstrzykiwać SQL bez konieczności podawania cudzysłowów. Zmiana
nls_date_format
może pozwolić na podobne działania.Oryginalne ustalenia dotyczące liczb pochodzą od Davida Litchfielda. Możesz przeczytać jego artykuł tutaj . Dyskusję Toma Kyte'a na temat wykorzystania dat można znaleźć tutaj .
źródło
Prawdopodobnie możesz przeciążyć używany typ danych, co spowoduje, że instrukcja się nie powiedzie. To, co nastąpi później, może zostać uruchomione.
Może wysłanie go jako tablicy bajtów Unicode załatwi sprawę i przeniesie cię z tej instrukcji do innej.
Jeśli jest dziura otwarta, będzie nadużywana. A blokowanie wszystkich ciągów za pomocą jednego cytatu nie jest dobrym pomysłem, ponieważ ludzie o nazwisku „O'Brian” nie mogą być Twoimi klientami (między innymi).
źródło
Spróbuj użyć zmiennej powiązania. Możesz zadeklarować go jako liczbę, co powinno zapobiec szkodliwemu wstrzyknięciu SQL.
DODATEK: zmienne wiązania również zwiększają wydajność i skalowalność, ponieważ plan zapytań jest kompilowany i przechowywany do ponownego użycia. Po prostu coś innego do dodania do argumentu. :)
źródło