איסוף מידע בעזרת תמונות
מאת iTK98 בתאריך 12/11/12, תחת כללי
מערכות וואב שונות (פורומים, בלוגים, מערכות תוכן) מאפשרות למשתמשים רגילים להוסיף תמונות משלהם שמאורחות על-גבי שרת אחר, זאת נעשה בכדי לחסוך משאבים (תעבורה, שטח אחסון) מהשרת שמריץ את המערכת עצמה. היתר זה נותן הזדמנות לאיסוף מידע של משתמשים על משתמשים אחרים ואף מנהלים. אפשר לבצע איסוף מידע פשוט על-ידי סקריפט צד-שרת ובכך למפות את המשתמשים באופן כללי.
קחו לדוגמה את הבלוג הזה, אני בתור 'כתב' מוגבל עם הגישה שלי למידע הסטטיסטי של האתר, אך אם אני רוצה לבצע איסוף מידע משלי, אוכל לעשות זאת בקלות יתרה על-ידי הוספה של תמונה שמאורחת על השרת שלי. בכדי לא לעורר חשש אצל המשתמשים ומנהלי הבלוג, אני אצור תמונה שהיא למעשה סוג של חתימה שלי,
הקובץ הזה הוא למעשה קובץ סקריפט שנכתב ב-PHP וחוץ מתהליך של יצירת התמונה, הוא מבצע גם איסוף של מידע,
- כתובת איי.פי.
- כתובת אמיתית (ניתן לזיוף, Forward for).
- גרסת קלינט (User Agent).
- דף מפנה.
למשתמשים זה נראה כקישור לתמונה לכל דבר, http://playground.itk98.net/gather/text-signature.png ואף ה-headers של התוכן זהה לחלוטין ל-header של קבצי PNG בשרת,
$ curl -I http://playground.itk98.net/gather/text-signature.png HTTP/1.1 200 OK Server: nginx Date: Mon, 12 Nov 2012 16:19:16 GMT Content-Type: image/png Connection: keep-alive Keep-Alive: timeout=3
בכדי לספק קישור עם סיומת .png צריך להוסיף חוק rewrite בשרת. ב-Nginx זה נעשה כך,
location ~* ^(?.*)\.png$ { rewrite ^ $basename.php last; }
מומלץ לעשות שימוש בתת-דומין יעודי למטרה זו או בספריה.
הסקריפט שעומד מאחורי האיסוף אינו מורכב. כאשר כתבתי אותו חשבתי על תצוגה נוחה לבני-אדם, אך מי שרוצה באמת לאסוף מידע ולהצליב אותו, אני ממליץ לו לשנות את מבנה הפירמוט של הטקסט שנשמר בכדי שהוא יוכל להריץ על המידע סקריפטים שונים בכדי להצליב מידע.
<?php /* A small script to generate text-as-image, as well as catching client information and writing it into a daily file. The script is a patch of code I found over the Internet. By iTK98, for https://www.binaryvision.co.il. License, Public Domain. */ // nginx Extras if ($_SERVER["HTTP_X_FORWARDED_PROTO"] == "https") $_SERVER["HTTPS"]="on"; if (isset($_SERVER["HTTP_X_REAL_IP"])) $_SERVER["REMOTE_ADDR"] = $_SERVER["HTTP_X_REAL_IP"]; // Setting the header, this is a "generic png file". header("Content-Type: image/png"); // Getting client info. $date = date('Ymd'); $date2 = date('H:i.s'); $ip = $_SERVER["REMOTE_ADDR"]; if ($_SERVER["REMOTE_ADDR"] != $_SERVER["HTTP_X_FORWARDED_FOR"]) $ip_f = addslashes($_SERVER["HTTP_X_FORWARDED_FOR"]); else $ip_f = "Same"; $ua = addslashes($_SERVER["HTTP_USER_AGENT"]); if (isset($_SERVER["HTTP_REFERER"])) $refer = addslashes($_SERVER["HTTP_REFERER"]); else $refer = "None"; // The magic variable will limit the writes to the file of the same client+ua. $magic = md5("$ip" . "$ua"); // Preformatting the outout. $formatted = "IP Address: $ip\tForward for: $ip_f\tTime: $date2\nUser Agent: $ua \nReferrer: $refer\nMagic: $magic\n"; // Doing magic test. $file = $date . "-data"; $handle = @fopen($file, "r"); if ($handle) { while (($buffer = fgets($handle, 4096)) !== false) { if ($buffer == "Magic: $magic\n") { $norewrite = 1; } } fclose($handle); } // Save it into a file. if (!isset($norewrite)) { $f = fopen($file, "a") or die("can't open file"); fwrite($f, "$formatted"); fclose($f); } // Generating the image. // Size of the image, make sure it match the text $width = "175"; $height = "20"; // Text to display. $text = "iTK98, Contributor @ BinaryVision"; // Background color, Red Green Blue. $R = "255"; $G = "255"; $B = "255"; $im = @imagecreate($width, $height) or die("Cannot Initialize new GD image stream"); $background_color = imagecolorallocate($im, 0, 0, 0); $text_color = imagecolorallocate($im, $R, $G, $B); imagestring($im, 1, 5, 5, $text, $text_color); imagepng($im); imagedestroy($im); ?>
כפי שאתם רואים, התמונה שהוספתי אינה תמימה כלל, והיא למעשה מבצעת איסוף של מידע ברקע, מי שחושב שמידע הזה אינו בעל חשיבות – טועה, מידע זה ניתן לאיסוף, להצלבה ולבסוף למיפוי של משתמשים. המידע יאסף בקובץ יומי, וכל יום יכתב קובץ חדש שישמור מי ניגש אל הקובץ (אתם מוזמנים ליצור גירסה מחודש של הסקריפט ולשלוח לי אותה).
דרכי ההתמודדות עם תופעות שכאלה יכול להיות בשתי רמות,
- מנהלי מערכות,
לאסור צירוף של תמונות משרתים פרטיים (להתיר לארח קבצים אך ורק מ-DropBox לדוגמה). - משתמשים,
לא לטעון תמונות באתר באופן אוטמטי. לא כל-כך פרקטי.
מכך אנחנו למדים שמי שאחראי בפועל על הפרטיות שלנו הם מנהלי המערכת תוכן (בלוג, פורום), וההתנהלות שלהם משפיעה על פגיעה\אי-פגיעה בפרטיות שלנו. אך גם אנחנו בתור משתמשים צריכים להיזהר ויש לנו דרכי התמודדות משלנו כנגד פגיעה בפרטיות שלנו.
נערך ב-20:06,
לא ביצעתי חסימה בשרת שתמנע את משיכת הקובץ לוג (טעות חמורה מאוד). מי שהוריד את הקובץ ולא סיפר לי, "נו נו נו!" לו.
בכל מקרה, הוסיפו בשרת שלכם (nginx) את ההוראה הבאה,
location ~ data$ { deny all; }
07/05/13 בשעה 13:11
[…] לדוגמה את הבלוג הזה )בינאריויזן), אני בתור 'כתב' מוגבל עם הגישה שלי למידע הסטטיסטי של […]
18/08/16 בשעה 16:08
אחלה פוסט בדיוק המידע שחיפשתי תודה רבה על שיתוף המידע.