קישור עם הסברים לחלק הראשון, לטובת אלו שמצטרפים אלינו בפעם הראשונה:
https://rotter.name/nor/prog/15952.shtml
חלק #2:
https://rotter.name/nor/prog/15956.shtml
חלק #3:
https://rotter.name/nor/prog/15965.shtml
חלק #4:
https://rotter.name/nor/prog/15974.shtml
חלק #5:
https://rotter.name/nor/prog/15975.shtml---------------------------------------------------------
יחסית פשוט הפעם.
הקוד הנפלא שלי מאפשר לנו להריץ notepad עם שם קובץ לבחירתנו.
בעת התחלת התוכנית נדרש לתת שם קובץ, והוא יפתח לנו אותו עם שם הקובץ שניתן.
הערה #1: נניח שהקלט מגיע ממקור לא בטוח(נניח, מהאינטרנט)
הערה #2: אנחנו רוצים לאפשר לפתוח רק קבצים באותה תיקיה שה"סרבר" שלנו רץ, לכן קיימת הפוקנציה verifyThatThePathIsInCurrentDirectory שנתון שהיא עושה את עבודתה - היא מוודאת שאין בנתיב סלאשים, נקודות ונקודתים.
בנוסף, בשל השימוש ב cin >> var, אנחנו לא יכולים לקלוט רווחים(תנסו ותראו) - זאת התנהגות רצויה ובסדר(ואף טובה הגנתית).
יאללה, אז מה הבעיה כאן? מה הסיכון?
תפציצו
#include <iostream>using namespace std; void openNotepadWithParam() { char a[250] = "c:\\windows\\system32\\notepad.exe "; char b[30]; cin >> b; // protect against ../.., or c:\file.txt verifyThatThePathIsInCurrentDirectory(); strcat(a, b); system(a); } int main() { openNotepadWithParam(); return 0; }
|
\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser