ďťż

Bezpieczenstwo aplikacji internetowych

       

Podstrony


telcocafe

Czy można stworzyć aplikacje, która nie będzie czyściła danych przychodzących przy pomocy np strip_tags, mysql_real_escape_string etc a jednocześnie będzie bezpieczna? Odpowiedz uzasadnij (jeśli wcześniej nikt nie napisał tego samego ;-))
Użytkownik Bełdzio edytował ten post 24 lipiec 2007, 11:17


Ja bym powiedział, że można sprawdzając na wybiegu czy np. user nie zastosował znaków, które mogą popsuć nasz skrypt. Np szukając w łańcuchu, który przesłał user, znaku " ' ". Jeżeli jest to wywalamy błąd inaczej puszczamy dalej. Akurat to mi przyszło do głowy - jak coś jeszcze wykombinuje to dodam ;)

hmmm nie wiem jak to opisać dokładnie :-) chodzi mi o cos takiego ze pobieramy dane i na zywca wrzucamy je do bazy hmm nie wiem jak ktos cos rozumie to piscie ;-)

//edyta
może tak :-) nic nie kasujemy, nic nie blokujemy - pozwalamy na SQL Injection, a mimo to jestesmy bezpieczni :) możliwe?
Użytkownik Bełdzio edytował ten post 23 lipiec 2007, 23:05

może tak :-) nic nie kasujemy, nic nie blokujemy - pozwalamy na SQL Injection, a mimo to jestesmy bezpieczni :) możliwe?
tak, ponieważ mysql_query pozwala na wykonanie tylko 1 zapytania.

spotkałem się ze strona gdzie jest takie zapytanie:

"SELECT * FROM users WHERE user_id='".$_GET['id']."' OR user_name='".$_GET['id']."'"

wszystko tu wchodzi ładnie czarno na Białym, lecz nie da się w nijaki sposób tego wykorzystać :<

stronka do testów dostępna tutaj



jest coś takiego jak UNION SLECT :-) czyli np SELECT * FROM users WHERE id = $_GET['id'] => SELECT * FROM users WHERE id = 5 UNION SELECT haslo FROM users WHERE login = "admin"; :)

http://hmt.pl/users.php?id=731231231231...0user_id='1 <- union select nie znam struktury bazy wiec działam tylko na id :) moze byc?
Użytkownik Bełdzio edytował ten post 23 lipiec 2007, 23:51
Przy wstawianiu lub aktualizacji rekordów w bazie warto wykorzystać mechanizm podpinania. Wtedy tylko musimy usunąć znaki <, >, &, itd., gdy jest potrzeba.
/*Plik edycji bannerów*/ #Dane $q->bindValue(':gid',$_POST['b_gid'],1); //1 = INT $q->bindValue(':name',Clean($_POST['b_n'])); $q->bindValue(':ison',$_POST['b_on'],1); $q->bindValue(':code',$_POST['b_c']); if($q->execute()) Info($lang['saved']); /*Funkcja Clean() w kernel.php*/ #Encje + trim() function Clean($val,$max=0) { if($max) $val=substr($val,0,$max); return trim(htmlspecialchars($val)); }
Gdy wstawiamy dane bezpośrednio do bazy danych:
ID=(int)$_GET['id'];
W F3Site jeżeli zmienne GET - ID oraz PAGE - istnieją i mają nienumeryczną wartość, skrypt przerywa dalsze wykonywanie się już w kernel.php. Inne trzeba sprawdzać, używając np. Clean() bądź rzutując - (int).

Można przeszukiwać też zmienne GET w poszukiwaniu znaczników <script>, <object>... jednak powinno się raczej uniemożliwiać wstawianie HTML-a, o ile to możliwe.
Użytkownik Ferrari edytował ten post 24 lipiec 2007, 07:45
a co ja napisałem? :-) nic nie kasujemy, nic nie blokujemy czyli nic nie zmieniamy :-)


jednak powinno się raczej uniemożliwiać wstawianie HTML-a, o ile to możliwe.
Czy można stworzyć aplikacje, która nie będzie czyściła danych przychodzących przy pomocy np strip_tags, mysql_real_escape_string etc a jednocześnie będzie bezpiec
zna? Odpowiedz uzasadnij (jeśli wcześniej nikt nie napisał tego samego ;-))


Każda aplikacja jest bezpieczna... niektóre tylko mniej.

Przy pobieraniu jeśli nie filtrujemy danych strona nadal możę być bezpieczna.
$page->query('SELECT * FROM '.$db_prefix.'news WHERE author = " '.$_GET['author'].' " ');
/index.php?author=1%20union%20select%20*%20from%20news%20where%201=1
Strona nie zwróciła mi w wyniku ani jednego rekordu.

"...która nie będzie czyściła danych przychodzących..."
-> mozna więc czyścić dane zanim zostaną dodane do bazy ;-)
-> np. kodem z jednego z numerów eksperta:
foreach ($_POST as $name => $value) { $_POST[$name] = funkcja_czyszczaca($value); }

IMO nie ma skryptu który jest w 100% bezpieczny ;-)

Pozatym... kto pisząc strone ( poza początkującymi którzy nie są w temacie ) nie zabezpieczył by swojej strony ? :)

Wiele o błędach w zabezpieczeniach można przeczytać na
http://ha.ckers.org/xss.html
Użytkownik fenekpl edytował ten post 24 lipiec 2007, 09:21
http://ha.ckers.org/xss.html
Hoho,aż się zacząłem bać :P To już wiem,że choć troszkę bezpieczniej jest używać bbcode :D
A co do tematu . . . Jeżeli przedstawiłeś takie argumenty to jesteśmy pewni,że nie da się :P Chyba że dane są przekazywane metodą post wtedy już jest problem typów danych. Metoda post wrzuca backslashe przed apostrofy i cudzysłowy . . .
I jak stwierdził fenekpl , kto chociaż nie próbuje zabezpieczyć pisanego skryptu,chociaż nie do końca wszystko można zrobić do końca na bank bezpieczne,jak pokazują na stronie . . .


Przy pobieraniu jeśli nie filtrujemy danych strona nadal możę być bezpieczna.
$page->query('SELECT * FROM '.$db_prefix.'news WHERE author = " '.$_GET['author'].' " ');
/index.php?author=1%20union%20select%20*%20from%20news%20where%201=1
Strona nie zwróciła mi w wyniku ani jednego rekordu.

bo popełniłeś błąd :-)


foreach ($_POST as $name => $value) {<BR>     $_POST[$name] = funkcja_czyszczaca($value);<BR> }
czyścisz dane, a nie można :-)


Pozatym... kto pisząc strone ( poza początkującymi którzy nie są w temacie ) nie zabezpieczył by swojej strony ? :)
ogólnie ma być filtracja, mój chory pomysł ma inne zadanie, napisałem o braku filtracji dlatego, że nawet jak jej nie będzie to chory pomysł  ma nas bronić - znowu bełkocze :D


Wiele o błędach w zabezpieczeniach można przeczytać na
http://ha.ckers.org/xss.html

znam dobrze tą stronę :)


A co do tematu . . . Jeżeli przedstawiłeś takie argumenty to jesteśmy pewni,że nie da się

Chyba że dane są przekazywane metodą post wtedy już jest problem typów danych.

Metoda post wrzuca backslashe przed apostrofy i cudzysłowy . . .

I jak stwierdził fenekpl , kto chociaż nie próbuje zabezpieczyć pisanego skryptu,chociaż nie do końca wszystko można zrobić do końca na bank bezpieczne,jak pokazują na stronie . . .

ad1. właśnie mój chory pomysł przewiduje coś innego
ad2. w php nie ma typów prostych jeśli o taki typy Ci chodzilo :-)
ad3. dodawane są tylko wtedy gdy jest to włączone - w demie mam wyłączone
ad4. e tam :-) wsio da się zrobić w tym zabezpieczyć:-)
Użytkownik Bełdzio edytował ten post 24 lipiec 2007, 11:10

jest coś takiego jak UNION SLECT :-) czyli np SELECT * FROM users WHERE id = $_GET['id'] => SELECT * FROM users WHERE id = 5 UNION SELECT haslo FROM users WHERE login = "admin"; :)

http://hmt.pl/users.php?id=731231231231...0user_id='1 <- union select nie znam struktury bazy wiec działam tylko na id :) moze byc?


Dzięki za informację o dziurze, już poprawiona. Zaznaczam, że całą stronę od deski do deski pisałem sam, włącznie z forum, więc drobne błędy się wkradają czasem. Cały myk polegał na tym, że poza id uzytkownika, można było tez podać jego nick, więc uzycie intval(); odpadało, ale jakimś cudem wcale nie było tam nic filtrowane :blink:
No cóż, tak to jest, jak się pisze wielki portal samemu i nikt nas nie sprawdza, muszę się lepiej przyjrzeć stronie, bo akurat pracuję nad nową poprawioną wersją portalu.
Ahh, te błędy :P

Hm... pewnie skrypt może być bezpieczny :) Wszystko zależy od podejścia i pomysłu.

powiedział Kodie po zapoznaniu się z Calypso ;-)
Użytkownik Bełdzio edytował ten post 24 lipiec 2007, 12:27
moze nie do dyskusji ale sonda jest bezsensowna bo odpowiedzi brzmia NIE - bezpieczne programy czy bazy danych to takie ktore znajduje sie na wylaczonym komputerze bez fizycznego dostepu taka prawda niestety

@CJ_HNO bezsensowny to jest Twój post bo 1. nic nie wnosi do temat 2. jakos nie widze potwierdzenia Twojego stwierdzenia...

Bełdzio, czy ty masz jakiegoś asa w rękawie ? :)

w sumie to CJ_HNO ma racje -> bezpieczne będzie tylko jeśli strona znajduje sie na wyłączonym pc.
Użytkownik fenekpl edytował ten post 24 lipiec 2007, 17:13
coś tam mam :-), a to z wyłączonym pc to bulshit :)

a nie prościej pobrać na początku wszystkie dane z danej tabeli a następnie wyświetlić potrzebne za pomocą if 'a. Wtedy wszystkie dane przychodzące nie będą mieć kontaktu z zapytaniem do bazy. Coś takiego
$result = $page->query('SELECT * FROM news'); if ($db->num_rows($result)) { while ($row = $db->fetch_array($result)) { if ($row['id_news'] == $_GET['id'] { echo "bleblebelbble"; } }
Można także zamiast standardowego przesyłania metodą GET czyli (index.php?modules=news&id=1&action=view) użyć kombinacji ' / . żeby adres wyglądał mniej wiecej tak (index.php/news'1.view) a następnie w skrypcie obciąć index.php żeby został sam ciąg /news'1.view . A potem użyć wyrażeń...

zrób to na bazie, która ma kilka / kilkanaście tyś rekordów :-)

pobawicie się prostym demem :-)

http://www.beldzio.com/calypso/
http://www.beldzio.c...lypso/index.txt

żeby złamać system trzeba się do niego zalogować tudzież opisać zabezpieczenie :-) najlepiej na pw zeby nie psuc zabawy innym

wiem wiem pierwsze rozwiązanie jest mało wydajne ale za to skuteczne (i chyba o to chodziło w tym temacie więc przymrużmy oko na przypadki kiedy są pobierane dane z parotysięcznej bazy a skrypt wykonuje się dość długo).

A co z drugim sposobem :>

"a następnie w skrypcie obciąć" <- ile razy mam pisac ze nie modyfikujemy danych wejsciowych?

demoBanan v1 ;-) "Niestety" moja metoda została już naprawiona ;>

poprawiona, poprawiona :) bo to nie był hack metody tylko jej obejście :) ale dał radę :) tak to jest jak sie pisze skrypt 30 min :P

Nav jak na razie rox ;]

Rozumiem że na podpowiedź rzędu "czy tabela users zawiera jakieś przemilczane kolumny, a jeśli tak to jakie" nie możemy liczyć? ;]

masz możliwość wykonania SQL Injection :) sprawdź sam :)

Bełdzio: dlatego napisalem na samym poczatku posta ze nie do dyskusji aczkolwiek przekazalem prawdziwy fakt. Aby to udowodnic: czy wiesz ze istnieja rozne klasy bezpieczenstwa systemow operacyjnych? jest ich kilka tylko najwyzsze sa dopuszczone do uzycia np. w wojsku, ale najlepsze jest to ze punktem odniesienia jest klasa ktora reprezentuje wlasnie komputer odciety od swiata i to nie jest zart czy glupota tylko od tego zaczyna sie skala bo zaden inny komputer z jakimkolwiek systemem czy programami NIGDY nie bedzie bardziej bezpieczny bo ZAWSZE znajdzie sie jakas luka problem w tym kto pierwszy ja znajdzie - autor czy niedobry czlowiek ;-) mam nadzieje ze wystarczajaco rozwinalem moja mysl to tyle.


Rozumiem że na podpowiedź rzędu "czy tabela users zawiera jakieś przemilczane kolumny, a jeśli tak to jakie" nie możemy liczyć? ;]
Lepsza by była podpowiedź dotycząca zawartości pliku calypso.php. Coś mi się wydaje, że "to coś" modyfikuje/zabezpiecza cookies, bo o dziwo pierwsze zapytanie działa z tymi danymi, a drugie już nie.
Użytkownik kiperoman edytował ten post 26 lipiec 2007, 12:12
już mówiłem, że nie ma żadnej modyfikacji danych, skoro coś nie działa, to znaczy że coś robisz źle :)

Hehe,chłopaki. Ruszcie szare komórki :P A jeżeli nie to polecam lekturę :D Mam nadzieję,że Bełdzio nie będzie zły bo tam jest wszystko :P Tylko trzeba umieć szukać,panowie ;)

nic tam nie ma ;-) btw jeśli zalogowałeś się to podeślij dane do logowania na pw

A tak,nie ma ale jest o XSS,a mój mózg działa tak niestabilnie,że pomylił to ze SQL Injection i udało mi się :P Chociaż sam nie wiem jak -.-

huh :D pewna informacj :) login test się nie liczy - dane te były podane publicznie

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.