Po co robić input sanitization?

Odpowiedz Nowy wątek
2019-06-11 21:01
1

Od zawsze chyba wszystkie tutoriale, książki, kursy itd. o tym trąbiły, a właściwie po co robić sanityzować dane z wejścia?

Doszedłem do wniosku, że niewiele to daje i chciałbym się skonsultować :D

edytowany 4x, ostatnio: WeiXiao, 2019-06-11 21:46

Pozostało 580 znaków

2019-06-11 22:07
0

Czym się różni input sanitization od walidacji?


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.
Tłumaczeniem może? - lion137 2019-06-11 22:07

Pozostało 580 znaków

2019-06-11 22:07
0

@danek:

What Is Input Validation and Sanitization?

Validation checks if the input meets a set of criteria (such as a string contains no standalone single quotation marks).

Sanitization modifies the input to ensure that it is valid (such as doubling single quotes).

Sanityzacja = np. escapowanie znaczków "abc" => \"abc\"

Walidacja = np. sensowne dane np. PESEL o długości 1 znak => do odrzucenia.

edytowany 5x, ostatnio: WeiXiao, 2019-06-11 22:12
Aaaa, niuanse są:) - lion137 2019-06-11 22:08
Źródło by się przydało. - Silv 2019-06-11 23:16
Dzięki. :) - Silv 2019-06-11 23:17

Pozostało 580 znaków

2019-06-11 22:13

Oh sweet summer child... I jeszcze ta ślepa wiara w W tych czasach chyba każde współczesne środowisko oferuje parametryzowanie zapytań oraz jeszcze pewnie więcej trików typu analiza AST zapytania, więc jak Ty chcesz ten sql injection robić? :D

Zobacz sobie:

oraz
i może jeszcze
;)


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
Widziałem to z Googla, html to zło... - WeiXiao 2019-06-11 22:13
eee tam, ŁeiSiajo ma najnowocześniejszy framework, który sam filtruje takie dyrdymały :] - Wibowit 2019-06-11 22:20
@Shalom: W tych czasach chyba każde współczesne środowisko oferuje parametryzowanie zapytań oraz jeszcze pewnie więcej trików typu analiza AST zapytania, więc jak Ty chcesz ten sql injection robić? :D że niby nawet z parametryzowaniem da się zrobić sqli? - WeiXiao 2019-06-11 22:20
@Wibowit: nie bajeruj, to z frameworkiem odnosiło się do sqli, a nie xss. - WeiXiao 2019-06-11 22:23

Pozostało 580 znaków

2019-06-11 22:23
0

Dość często kleję ręcznie URLe, jeśli chodzi o zapytania GET. Są na to jakieś ciekawe exploity? Taki URL może zawierać np dane wyciągnięte z bazy.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2019-06-11 22:24

Pozostało 580 znaków

2019-06-11 22:35
0

@Shalom:

To teraz pytanie

Czy na całą aplikacje webową nakładacie jakiś globalny filtr, który escapuje wam każdego stringa?

A później te escapnięte stringi trzymacie bazie? np San José => San Jos\u00E9?

Przecież takie dane są mega problematyczne do działania na.

edytowany 2x, ostatnio: WeiXiao, 2019-06-11 22:37
Pokaż pozostałe 2 komentarze
Kalki z angielskiego nie są fajne. - Azarien 2019-06-14 09:25
Bo mi się nie podobają :-) Po prostu nie uważam angielskiego za jakiś strasznie prestiżowy język, żebym miał pod niego naginać swój własny. - Azarien 2019-06-14 13:43
@Azarien: a, w ten deseń. Mnie to na przykład wszystko jedno, bylem potrafił zrozumieć. - Silv 2019-06-14 14:00

Pozostało 580 znaków

2019-06-11 22:39
0

Zamiast dodatkowego escape'owania można zrobić whitelistę znaków.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2019-06-11 22:51
0

@Wibowit:

I w każdym miejscu, dla każdego inputu robisz coś takiego?

Ewentualnie jakiś global http request filter?

@Controller
@RequestMapping("/kontroler")
public class KotyController {

    @RequestMapping("/metoda")
    public String metoda(Input data) {
        if (!WhiteListCheck(data))
        {
            return err;
        }
    }

    public bool WhiteListCheck(object something){
        // pseudo code i to bardzo

        foreach property in something
            if typeof(property) == string
                if (!WhiteListValueCheck(property.Value))
                    return false

        return true;
    }

    private bool WhiteListValueCheck(string value){
        char[] allowedChars = new char[]{'a', 'b');

        foreach char in value
            if char not in allowedChars
                return false;

        return true;            
    }   
}

public class Input{
    public string FirstName { get; set; }
    public string Address { get; set; }
    public string PhoneNumber { get; set; }
    public string Description { get; set; }
}
edytowany 9x, ostatnio: WeiXiao, 2019-06-11 23:04
Pokaż pozostałe 6 komentarzy
Powiedzmy że piszesz takie 4p - jakbyś zaimplementował sanityzacje? - WeiXiao 2019-06-12 00:49
@Wibowit: Zakładamy, że jak już ktoś ma dostęp do systemu to raczej nie jest hakierem. wow, albo macie klientów w miarę obeznanych w it albo lubicie życie na krawędzi :D - WeiXiao 2019-06-12 00:56
Na 4p zacząłbym od whitelisty. A w naszym systemie mamy logowanie akcji związanych z wbijaniem danych. W logach pokazuje się, że np osobnik o mejlu [email protected] zmienił nazwę grupy z bolek i lolek na ' and drop table users. - Wibowit 2019-06-12 00:58
Mogę używać każdego znaczka, bo nie ma whitelisty :D Nie zastanawiałem się głębiej nad tematem. Prawdopodobnie poszukałbym artykułów w sieci na temat zabezpieczania aplikacji webowych i tyle. Poleganie tylko i wyłącznie na zabezpieczeniach we frameworkach jest średnie, bo i tak w odpowiednio skomplikowanej aplikacji znajdzie się mnóstwo obejść dobrych praktyk i mechanizmów z frameworka. - Wibowit 2019-06-12 01:07
Na samym 4p masz pewnie z 20 miejsc gdzie możesz wprowadzić cokolwiek chcesz, a zatem w 20 miejscach wywołasz metodę, która na każdym stringu z inputa wywoła checka? dużo tego :P - WeiXiao 2019-06-12 01:09

Pozostało 580 znaków

2019-06-11 22:53
2

@WeiXiao o panie z unikodem to nie ma żartów, widziałem kiedyś wybuch bazy na produkcji z tym związany, bo tabela miała ustawione chyba to śmieszne 3bajtowe kodowanie unicode w mysqlu/mariadb (które się nazywa mylnie utf8) a aplikacja w konektorze mówiła że jest utf-8 no i ktoś wrzucił sobie emoji gdzieś a takie emoji to 4 bajtowy unicode... ;]


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2019-06-11 22:54

Pozostało 580 znaków

2019-06-11 23:28
0

@Shalom:

Co do tego XSSa

Masz jakieś api, które z bazy zwraca ten nasz niefortunny <noscript><p title="</noscript><img src=x onerror=alert(1)>">, który normalnie się wykona i walnie alert

(nawet z tym escapem taki kod <noscript><p title=\"</noscript><img src=x onerror=alert(1)>\"> się wykona, ale mniejsza z tym)

no i zazwyczaj takie dane są wyrzucane do użytkownika jakimś np. Angularem i rozważmy taki kod:

<!doctype html>
<html ng-app>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.8/angular.min.js"></script>
  </head>
  <body>
    <div>
      <label>Name:</label>
      <input type="text" ng-model="yourName" placeholder="Enter a name here">
      <hr>
      <h1>Hello {{yourName}}!</h1>
    </div>
  </body>
</html>

https://jsfiddle.net/d2evhorb/

I jeżeli wrzucisz tam ten swój xss <noscript><p title="</noscript><img src=x onerror=alert(1)>">, to wyświetli się on jako napis bo Angular też escapuje https://docs.angularjs.org/api/ngSanitize/service/$sanitize

więc gdzie gdzie problem przy takim współczesnym stacku?

edit: OPS, przecież jsa i tak by nie wykonał przy takim wstrzyknięciu (bo to nie refresh strony), nawet bez escape, ale z drugiej strony można przetestować na <i> test </i>, który i tak nie zostanie wyrenderowany w w/w Angularowym kodzie, a tu zostanie:

<div id="1">

</div>

<button onclick="html_inject()">

</button>

<script>
function html_inject()
{
    document.getElementById("1").innerHTML = "<i> test </i>";
}
</script>
edytowany 8x, ostatnio: WeiXiao, 2019-06-11 23:39
Damn, to ci goście z googla tacy głupi że tego nie ogarnęli! Weź do nich pisz, 500k i posada w MV czeka na ciebie :D :D :D - Shalom 2019-06-11 23:40
@Shalom: no w sumie oni sami sobie przywrócili już fixniętego buga, bo niby im coś na UI się wywalało (twoje video) :D :D :D https://github.com/google/clo[...]62fee57e68739c00e16b9934c0ffa - WeiXiao 2019-06-11 23:48

Pozostało 580 znaków

2019-06-12 11:43
0

@WeiXiao: nawet jak masz prepared statements to jesteś w stanie zrobić kiszkę bardzo łatwo - SELECT id FROM foos WHERE name ILIKE ? gdzie ktoś Ci poda jako parametr %%du%pa%% i potrafi to całkiem brutalnie zarżnąć DB. Więc w ogólności to nie jest takie proste by zabezpieczyć się przed wszystkim przy pomocy samej tylko sanityzacji(?) wejścia. Injection attacks to nie jedyne problemy jakie można napotkać jak "ślepo" akceptujemy dane od użyszkodników, może być DoS (jak pokazane wyżej) lub przejęcie kont.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: Yandex