PL/SQL Injection - The Beginning - ilDBA Portal

PL/SQL Injection – The Beginning

15/09/2015 | פורסם על ידי
מי לא מכיר PL/SQL, כל מי שעובד עם Oracle הריץ פעמים רבות PL/SQL בין אם זה ב-Packages המסופקים ע"י Oracle או בין אם אילו קטעי קוד אשר נכתבו בארגון בו הוא עובד.
אבל רק מעטים ביננו יודעים שפרוצדורות ופונקציות הכתובות ב-PL/SQL יכולות להיות חשופות להתקפות מסוג SQL Injection.

לפני מספר שנים כתבתי באתר זה מאמר בסיסי המסביר את הבסיס של SbriQL Injection ולאחרונה חשבתי שיש מקום לשפרו, מקווה שתהנו, בואו נתחיל :

השלב הראשון, הכרת האוייב –Dynamic SQL !

כל מקום בו אנו עושים שימוש ב-Dynamic SQL קיים הפוטנציאל שהקוד שכתבו פגיע להתקפה מסוג PL/SQL Injection, לדוגמא בואו נתבונן בפרוצדורה הבאה :
CREATE OR REPLACE PROCEDURE list_salary_inject
(sal IN VARCHAR2,learn_mode in NUMBER := 0)
IS
TYPE cur_typ IS REF CURSOR;
c cur_typ;
d_sqlVARCHAR2(1024);
ename VARCHAR2(1024);
salary number;
BEGIN
d_sql  := 'SELECT SAL,ENAME FROM scott.emp WHERE sal> ' || sal;
OPEN c FOR d_sql;
LOOP
FETCH c INTO salary, ename;
EXIT WHEN c%NOTFOUND;
dbms_output.put_line(salary||' - '||ename);
END LOOP;
CLOSE c;
END;
בפרוצדורה זו אנו שולפים נתונים אודות עובדים בעלי משכורת גבוהה מ-X שהוא הפרמטר של הפרוצדורה. קטע הקוד הבעיתי פה הוא :
d_sql  := 'SELECT SAL,ENAME FROM scott.emp WHERE sal> ' || sal;
שורה זו משרשרת את כל מה שנמצא בפרמטר sal ל-SQL אחד אשר יורץ בפקודת EXECUTE IMMEDIATE.
קריאה רגילה לפרוצדורה תראה כך :
EXECUTE list_salary_inject('2000');
במקרה זה יוצגו לנו נתונים אודות המשתמשים אשר להם משכורת הגדולה מ-2000, אך מה דעתכם יקרה אם נקרא לפרוצדורה בצורה הבאה :
EXECUTE list_salary_inject('2000 or 1=1');
במקרה כזה נקבל את הפרטים על כלל האנשים בארגון, כל הנתונים בטבלה ישלפו שכן ה-SQL שנריץ יראה כך :
SELECT SAL,ENAME FROM scott.emp WHERE sal>2000 or 1=1;
אם נחשוב עוד קצת לעומק נראה שניתן אפילו להוציא מידע מטבלאות אחרות ע"י שימוש ב-UNION, לדוגמא :
EXECUTE list_salary_inject('2000 UNION SELECT 1,TABLE_NAME from ALL_TABLES');
יאפשר לנו לראות אילו טבלאות קיימות בבסיס הנתונים.
על מנת להמחיש את הדוגמאות שהוצגו לעיל צילמתי סרטון קצר המציג כיצד ניתן לנצל את פירצת אבטחת המידע בשיגרה הנ"ל ולדלות מידע חשוב מבסיס הנתונים.

PLSQL Injection – The Beginning

הפתרון הוא פשוט המנע משימוש ב-Dynamic SQL, ניתן לכתוב את השיגרה גם כך :
CREATE OR REPLACE PROCEDURE list_salary_inject
(in_salary IN VARCHAR2,learn_mode in NUMBER := 0)
IS
CURSOR c_salis
SELECT SAL,ENAME FROM scott.emp WHERE sal>in_salary;
salary number;
BEGIN
OPEN c_sal;
LOOP
FETCH c_salINTO salary, ename;
EXIT WHEN c_sal%NOTFOUND;
dbms_output.put_line(salary||' - '||ename);
END LOOP;
CLOSE c_sal;
END;
אם לא ניתן להימנע משימוש ב-Dynamic SQL עשו שימוש ב-Bing Variables:
CREATE OR REPLACE PROCEDURE list_salary_inject
(in_salary IN NUMBER)
IS
TYPE cur_typ IS REF CURSOR;
c cur_typ;
d_sqlVARCHAR2(1024);
ename VARCHAR2(1024);
salary number;
BEGIN
d_sql  := 'SELECT SAL,ENAME FROM scott.emp WHERE sal>  :salary';
OPEN c FOR d_sql USING in_salary;
LOOP
FETCH c INTO salary, ename;
EXIT WHEN c%NOTFOUND;
dbms_output.put_line(salary||' - '||ename);
END LOOP;
CLOSE c;
END;
מספיק להיום, בפעם הבאה נלמד קצת על Advanced PL/SQL Injection וכיצד ניתן למנוע.

לסיום, איך אפשר בלי הקומיקס xkcd שהמחיש בצורה מצויינת כמה SQL Injection יכול להיות מסוכן:

מקווה שנהניתם.

נתראה ברשומה הבאה !
עודד רז.

ניתן ליצור קשר עם עודד דרך עמוד האודות שלו: אודות

The following two tabs change content below.

עודד רז

עודד רז, מנכ"ל חברת בריליקס ומייסד אתר זה. עודד הוא Oracle ACE Director ואחד מה-DBA-ים הבכירים ביותר בישראל, עם מעל 15 שנות ניסיון כ-DBA תשתיתי ואפליקטיבי. לעודד התמחות מיוחדת בתחום אבטחת המידע והוא מוביל פרויקטים רבים בתחום ה-IDM בישראל ובעולם.

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

תיעוד בסיס הנתונים – למה זה טוב?

ישנם מספר נושאים חשובים שיש לתת עליהם את הדעת בפיתוח ותכנון בסיס נתונים. כמובן שצריך לשים לב לנירמול נכון של הטבלאות, וכמובן שצריך להגדיר סטנדרט לכתיבה נכונה של הקוד, וכמובן שאי אפשר בלי [...]

צבעים דינמיים ב-SSRS

כאשר לקוח שלי ולא משנה אם הוא מבוסס אורקל או SQL Server חושב על פתרון Reporting אני ישר מציע לו את ה- Sql Server Reporting Services. שתי סיבות עיקריות להצעה שלי: רישוי ויכולות. איתי בנימין מסביר על צבעים דינמים [...]

Oracle Text For Dummies – חלק א

כולכם בוודאי שמעתם את המושג "אורקל טקסט" או "טקסט אינדקס" בהקשר זה או אחר. אם אתם רוצים להכיר עוד קצת (ממש על קצה המזלג) את הפיצ'ר המגניב והמאוד שימושי הזה שבאמת שווה להכיר- הגעתם למקום הנכון! [...]
Copyright 2017 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: