View Full Version : اجرای کد php داخل فایل JPEG
mr_ayma
شنبه 27 شهریور 1395, 19:07 عصر
سـلام ، من خیلی جاها این مطلب رو خوندم و شنیدم امکان آپلود فایل در سایت یک روزنه امنیتی است و هکر می تونه برخی کدهای مخرب رو به سایت ترزیق کنه ، یکی از مواردی هم که زیاد بهش اشاره شده اینکه تنها به بررسی پسوند اکتفا نکنیم چون این امکان وجود داره که مثلا هکر فایلی با نام a.php.jpg رو اپلود کنه که در اصل این یه فایل php هست که بهش jpg اضافه شده
**
من همچین فرمی درست کردم که فایل رو دریافت می کنه
<html>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
یه پوشه ای هم بنام اپلود ساختم و در در فایل upload_file.php این کدها رو نوشتم
if ($_FILES["file"]["error"] > 0){
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}else{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " already exists. ";
}else{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
می بنید که به هیچ وجه پسوندها رو بررسی نکردم ، ساختار فایل هم بررسی نکردم ، اما وقتی فایل a.php رو که حاوی چند دستور php هست ، اپلود می کنم و بعدش میخوام اجرا کنم مرورگر این خطا رو نشون می ده
http://uupload.ir/files/a0xn_eror.jpg
چرا با وجودی اینکه من هیچ فیلتری انجام ندادم بازم این فایل اجرا نشد ؟!
در اصل من همه اینا رو پرسیدم چون یه جایی شنیده بودم که PHP رو میشه به صورت های مختلف نصب کرد ؟ مثلا چون الان php من به صورت ماژولار نصب شده اجرا نشده ولی اگه php به صورت .... نصب می شد اجرا می شد . ((اون .... چیزی که یادم رفته ) ، php رو به چند حالت میشه نصب کرد ؟
mohamadali1374
شنبه 27 شهریور 1395, 20:16 عصر
سلام
فرمت اصلی که الان وجود داره همون jpg هست و .php بخشی از اسم فایل محسوب میشه
روشی که شما خوندین به این شکل هست که هکر یه افزونه ساده برای فایر فاکس نصب میکنه و هنگام آپلود فایل هدر فایل رو عوض میکنه به این شکل که هکر یه فایل به نام test.jpg رو که در اصل یه فایل php است رو اول آپلود میکه و با این افزونه ای که گفتم هدر فایل رو میبینه و با این افزونه میاد فایل رو به test.php تغییر میده که فایل php در سرور ایجاد و اجرا میشه
راه جلوگیری از این هم اینکه شما یه فایل .htaccess درست کنید و اون رو در پوشه آپلود ها بذارید محتوای اون هم:
<files ~ "\.(php|php.*|sphp|php3|php4|php5|phtml|cgi|pl|shtm l|dhtml|html|htm)$">
deny from all
</files>
این فایل از اجرای فایل هایی php و html و .. جوگیری میکنه
در اصل من همه اینا رو پرسیدم چون یه جایی شنیده بودم که PHP رو میشه به صورت های مختلف نصب کرد ؟ مثلا چون الان php من به صورت ماژولار نصب شده اجرا نشده ولی اگه php به صورت .... نصب می شد اجرا می شد . ((اون .... چیزی که یادم رفته ) ، php رو به چند حالت میشه نصب کرد ؟
سوالتون واضح نیست منظورتون از نصب php چیه؟
mr_ayma
شنبه 27 شهریور 1395, 20:46 عصر
سلام
فرمت اصلی که الان وجود داره همون jpg هست و .php بخشی از اسم فایل محسوب میشه
توضیحاتی که دادین بی نهایت مفید و هیجان انگیز بود .هر چند که راه حل رو یاد گرفتم اما هنوز طریقه نفوذ با تغییر هدر فایل رو متوجه نشدم در این مورد بیشتر سرچ می کنم
اما منظور من از سوالی که تو تاپیک پرسیدم هک شدن بوسیله تغییر هدر فایل نیست . بلکه داخل یه کلیپ دیدم (یادم رفته چه کلیپی بود ) ، مدرس اول یه فایل php درست
کرد و داخلش چند تا دستوره php نوشت ، بعدش به پسوند فایل رو از .php به php.jpg تغییر داد . مث همونی که تو پست اول نوشتم !
بعد گفت چون Php تو سیستم من ماژولار نصب شده این فایل اجرا نشد ،اما اگر به صورت .... نصب می شد با وجودی اینکه انتهای فایل JPG داره اجرا می شد ! و در ادامه توضیح داد
که فقط اکتفا به بررسی پسوند کافی نیست چون به این شکل راه دور زدنش هست .
***
در کل زیاد مطمئن نیستم چون کلیپ رو خواب الود می دیدم ولی یه همچین جمله ای تو ذهنم مونده که Php رو میشه به حالت های مختلف نصب کرد و ..
Unique
یک شنبه 28 شهریور 1395, 02:03 صبح
صحبتی که جناب محمدعلی میکنه با اون چیزی که شما میگین فرق میکنه ! منظورشون از تغییر header زمانی درسته که هکر فهمیده شما دارین Mimetype را چک میکنید و اصل فایل را بررسی نمیکنید. خوب اونم میاد header اشتباه میفرسته وبرنام هشما را گول میزنه !
زمان ارسال فایل عموما سه تا کار انجام میدن که این ها قابل دور زدن هست :
۱ - mimetype را چک میکنن که میشه php و apache را گول زد
۲ - میان پسوند را چک میکنن که میشه فایل php را به صورت a.php.jpg فرستاد و به شرطی که apache تنظیم شده باشه Multiple Extension (http://httpd.apache.org/docs/2.0/mod/mod_mime.html#multipleext) بپذیره. به مشکل میخورین وگرنه میریم سراغ مورد ۳
۳ - در این حالت میان با getimagesize بررسی میکنن که فایل عکس باشه اما چون فایل jpg از EXIF Metadate ها پشتیبانی میکنه میشه توش php نوشت و Apache براتون اجراش کنه !!!
من فکر میکنم شما حالت سوم مد نظرتونه !
d68715
یک شنبه 28 شهریور 1395, 09:24 صبح
فقط با دستکاری در htaccess میشه همچین کاری کرد .
PHP توانایی اجرایی هر فایل پایل (متنی) رو داره مگر اینکه محدود شده باشه .
وب سایت بنده : چربی گیر (http://grease-trap.ir/)
mr_ayma
یک شنبه 28 شهریور 1395, 15:32 عصر
صحبتی که جناب محمدعلی میکنه با اون چیزی که شما میگین فرق میکنه ! منظورشون از تغییر header زمانی درسته که هکر فهمیده شما دارین Mimetype را چک میکنید و اصل فایل را بررسی نمیکنید. خوب اونم میاد header اشتباه میفرسته وبرنام هشما را گول میزنه !
زمان ارسال فایل عموما سه تا کار انجام میدن که این ها قابل دور زدن هست :
۱ - mimetype را چک میکنن که میشه php و apache را گول زد
۲ - میان پسوند را چک میکنن که میشه فایل php را به صورت a.php.jpg فرستاد و به شرطی که apache تنظیم شده باشه Multiple Extension (http://httpd.apache.org/docs/2.0/mod/mod_mime.html#multipleext) بپذیره. به مشکل میخورین وگرنه میریم سراغ مورد ۳
۳ - در این حالت میان با getimagesize بررسی میکنن که فایل عکس باشه اما چون فایل jpg از EXIF Metadate ها پشتیبانی میکنه میشه توش php نوشت و Apache براتون اجراش کنه !!!
من فکر میکنم شما حالت سوم مد نظرتونه !
بابت توضیحات ممنونم ، اما می توضیحات ایشون با اونچه که پرسیده بودم متفاوت بودم ولی مساله اینکه ایشون مطالب مفیدی در مورد امنیت اپلود فایل گفتن که چیزی در موردش نمی دونستم
البته با این پست شما یکمی دچار وحشت شدم ، یعنی اگر پوشه ای که عکس ها اپلود میشه پرمشین هاشو فقط برای خواندن تنظیم کنیم و از طرفی با یه فایل htaccess امکان اجرای فایلهای
PHp ، Html و جاوا اسکریپت رو از اون پوشه بگیریم . بازم امکان اینکه مشکلی بوجود بیاد هست ؟!
فقط با دستکاری در htaccess میشه همچین کاری کرد .
PHP توانایی اجرایی هر فایل پایل (متنی) رو داره مگر اینکه محدود شده باشه .
وب سایت بنده : چربی گیر (http://grease-trap.ir/)
بعله ، تست کردم اجرا شد اینجا (http://stackoverflow.com/questions/8025236/is-it-possible-to-execute-php-with-extension-file-php-jpg)یه سری توضیحات جالبی هست
1- یه پوشه درست می کنیم و داخلش دو فایل می سازیم بنام های htaccess. و test.php.jpg
2- داخل فایل htaccess. این کد رو می نویسیم
AddType application-x-httpd-php .jpg
3- و یه دستور Php داخل فایل test.php.jpg مثلا"
<?php echo 'foo'; ?>
حالا با وجودی اینکه پسوند فایل jpg هست ولی مثل بقیه فایلهای php به راحتی اجرا میشه ..
چه زمانی نیاز میشه از همچین قابلیتی استفاده کنیم ؟ منظورم اینکه به صورت پیش فرض که این اتفاق نمی افته . چرا باید یکی باید تو پروژه اش به این نیاز داشته باشه که فایل PHP اش با پسوندی غیر از php هم اجرا بشه ؟! ((شایدم برمی گرده به خصوصیات لینوکس که من چیزی ازش نمی دونم !)
Unique
یک شنبه 28 شهریور 1395, 16:20 عصر
البته با این پست شما یکمی دچار وحشت شدم ، یعنی اگر پوشه ای که عکس ها اپلود میشه پرمشین هاشو فقط برای خواندن تنظیم کنیم و از طرفی با یه فایل htaccess امکان اجرای فایلهای
PHp ، Html و جاوا اسکریپت رو از اون پوشه بگیریم . بازم امکان اینکه مشکلی بوجود بیاد هست ؟!
اگه تنظیمات Apache درست باشه و به هیچ ترتیبی هکر نتونه فایل jpg را برای مفسر به صورت PHP جا بزنه با تغییر پسوند و دستکاری EXIF Metadata مشکلی ندارید. اما اگه خیلی نگران هستین ۲ تا کار انجام بدین :
۱ - کلا اجازه تفسیر و ارسال را از Apache بگیرین و خودتون با Header فایل را برای کاربر بفرستین. اینجوری یکسری Byte ارسال میشه و تفسیری روش اناجم نمیشه.
۲ - برای جلوگیری از مشکلات ناشی از وب سرور و دسترسی ها هم بهتره یا کلا فایل ها را خارج از public_html ذخیره کنید. یا نام فایل ها را در زمان ذحیره کردن عوض کنین (مثلا یک مقدار hash بهش بدین که قابل شناسایی باشه) و دسترسی را کلا به پوشه upload ببندین.
اگه خیلی علاقه دارین apache خودش فایل ها را براتون بفرسته از forcetpe توی htaccess داخل فولدر upload استفاده کنید :
ForceType application/octet-stream
<FilesMatch "(?i).jpe?g$">
ForceType image/jpeg
</FilesMatch>
<FilesMatch "(?i).gif$">
ForceType image/gif
</FilesMatch>
<FilesMatch "(?i).png$">
ForceType image/png
</FilesMatch>
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.