Null Byte Poisen

במתקפת ה Null Byte Poison נתקלתי בימים האחרונים, ואני חושב שהיא לא מספיק ידועה בקרב האנשים פה, והיא בהחלט נחמדה וחשובה (!)
אז החלטתי לעשות לכם מאמר שמתבסס ברובו (כמעט בכללותו) על מדריך אחר שקראתי - מאמר בעברית, קצרצר ולעניין (:
איך יוצרים Null Byte ?
פתחו את הנוטפד++, לחצו על CTRL+SHIFT+המקש עם מספר 2 (סימן ה"@").
אתם תיראו שתופיע לכם מילה "NUL".זה ה "Null Byte".
מה הוא ה Null Byte ?
Null Byte הוא התו הראשון בטבלת האסקי (ascii).
בשפת התכנות PHP למשל, chr(0) יחזיר Null Byte.
מטרת ה Null Byte
כידוע, רוב השפות מזהות סיום של סטרינג מסוים ע"י Null Byte (ביניהם גם C וPHP).
אז, מהו Null Byte Poison ?
אוקיי, עכשיו הגענו לחלק המעניין
נניח שהסימן "$" הוא Null Byte.
עכשיו, יש אתר שמותר להעלות אליו קבצים, והוא יריץ אותם.
התנאי היחידי שהאתר מציב לנו (אנחנו הם אלו שמעלים את הקובץ) זה שהסיומת של הקובץ תהיה בJPG (דוגמא קלאסית של אתר להעלאת תמונות).
האתר מקבל את השם של הקובץ, ובודק האם הסיומת שלו היא באמת JPG.
אנחנו רוצים להריץ קובץ PHP על האתר, אבל הוא נותן לנו להעלות רק קובץ JPG.מה נעשה?
אם נקרא לקובץ "script.php" וננסה להעלות אותו, לא נוכל.
אבל תחשבו מה יקרה אם נקרא לקובץ :
"script.JGP$.php".
בבדיקה יקלט רק הקטע script.jpg (בהנחה שהסימן "$" הוא null byte) כי למדנו ש null byte ברוב השפות מראה על סיום הסטרינג, ולכן הקובץ יועלה לאתר.
כאשר הקובץ נשמר על השרת, הnull byte נמחק, ולכן זה יותיר לנו script.JPG.php .
וכאשר ניכנס לכתובת שנקבל מהאתר..well..אני מניח שאתם מבינים מה יקרה =]
איך מגנים כנגד זה?
חלק חשוב מאוד במאמר הזה.
ההגנה על ההתקפה הזאת היא פשוטה כ"כ וחוסכת הרבה בעיות.
רק שורה אחת בPHP ואנחנו מסודרים:
$NameOfFile = str_replace(chr(0), ``, $TheString);
מה שאנו עושים זה מנפים את הnull bytes משם הקובץ כשאנחנו מקבלים אותו, ורק לאחר מכן אנחנו בודקים את הסיומת של הקובץ.