PDA

View Full Version : هک سرور از طریق query



engmmrj
چهارشنبه 06 دی 1391, 22:54 عصر
من یه فرم ثبت نام داشتم که از اونجا منو هک کردن
بعد تو فیلد های دیتابیس این کلمه ها رو پیدا کردم cat /etc/passwd` این تو یوزرنیم بود تو نام همAcunetix
که یکی از دوستام گفت خیلی خطرناکه گفت اینجا مطرح کنم
اینم کد هام
این آدرس سایتم persian3da.ir

<?php
include('config.php');
database();
if(isset($_POST['send']))
{
$user="user";
$error=0;
$name=$_POST['name'];
$mail=$_POST['mail'];
$username=$_POST['username'];
$password=$_POST['password'];
if($name==''||$mail==''||$username==''||$password= =''){
$error=1;
$msg="پر کردن تمامی فیلدها ضروری است";
}
if(is_numeric($name)){
$error=1;
$num="فیلد نام را اصلاح کنید";
}
if(!preg_match("/[a-zA-Z0-9._-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z\.]+/",$mail)){
$error=1;
$email="ایمیل خود را درست وارد کنید";
}
$sql = "SELECT * FROM user WHERE username = '" . $_POST['username'] .
"' AND mail = '" . $_POST['mail'] . "';";
$result = mysql_query($sql);
$numrows = mysql_num_rows($result);

if($numrows == 1) {
$error=1;
$te="یوزرنیم یا ایمیل شما قبلا در سیستم ثبت شده است";
}
if($error==0)
{
$Query = mysql_query("INSERT INTO user (name,username,password,mail,user)VALUES
('".$_POST['name']."','".$_POST['username']."','".md5($_POST['password'])."',
'".$_POST['mail']."','".$user."')");
if($Query==true){$sabt="ثبت نام شما با موفقیت انجام شد";}

}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>تنظیمات عمومی</title>
<link rel="stylesheet" href="admin/css/layout.css" type="text/css" />
<link rel="stylesheet" href="admin/css/base.css" type="text/css" />
<link rel="stylesheet" href="admin/css/prettyPhoto.css" type="text/css" />

</head>
<style>
body
{
background-color:#40998B;

}
#qq
{
margin-top:140px;
}
</style>
<body>


<center>
<div id="margin">
<?php echo @$msg;?><?php echo @$num;?><?php echo @$email;?><?php echo @$sabt;?><?php echo @$te;?>
<form id="qq"action="<?php $_SERVER['PHP_SELF']?>" method="post">
<label>name</label>
<input type="text" name="name"/>
<label>username</label>
<input type="text" name="username" />
<label>mail</label>
<input type="text" name="mail" />
<label>password</label>
<input type="text" name="password" />

<input type="submit" name="send" id="sendMessage"class="button"/>
</form>
</center>
</div></section>
</body>
</html>

engmmrj
چهارشنبه 06 دی 1391, 23:10 عصر
چه جوری میشه در برابر این حملات مقاومت کرد

$ M 3 H R D A D $
چهارشنبه 06 دی 1391, 23:19 عصر
با خلوص نیت : دی
دار تحقیق می کنم برات

parsboy
چهارشنبه 06 دی 1391, 23:40 عصر
دنباله مقاومت نباش زیاد همیشه یه راهی وجود داره:متفکر:

nsco_nsco
پنج شنبه 07 دی 1391, 00:07 صبح
سلام فکر کنم بهترین راه این باشه که بیای و فراخوانی اطلاعات از دیتابیس رو تو چند شرط بزاری و تا اونها صحتش معلوم نشه اصلا دیتا رو نخونه مثل امنیت ورود کاربران و البته زیاد سرت رو درد نیار چون هر کاری بکنی اخرش یه راحی هست از سایت هم نشده از سرور هک می کنن موفق باشید

ravand
پنج شنبه 07 دی 1391, 08:05 صبح
این خط ناامن هست کلا action رو بردار.

<?php $_SERVER['PHP_SELF']?>
حالا که میخوای مقدار توی خود صفحه ارسال بشه خوب کلاً action رو برداری بهتره.

engmmrj
پنج شنبه 07 دی 1391, 09:15 صبح
کسی نبود جواب مارو بده

$ M 3 H R D A D $
پنج شنبه 07 دی 1391, 09:24 صبح
اول اینکه شما باید یک شناسه یونیک داشته باشید در هنگام ورود ( ایمیل یا نام کاربری که ایمیل معتبر تر هست چون قابلیت برگشت دادن اطلاعات به کاربر را دارد در هنگام فراموشی )

select password from user where username='$_POST['username']' // return username is avalable or Not
خوب شما فقط نام کاربری و اینجوری چک میکنی یعنی اینجکت بزنه چندید رکورد برمیگردونه
که میتونی تو خط بعد چک کنی اگه فقط یک رکورد بود یعنی تو خود کوئری لیمیت نده چون اینجوری به خودی خود یک رکورد بر می گردونه و اینجکت که میکنه با or چند رکورد بر می گردونه
خوب ما پسورد و چک نکردیم اما برگردوندیمیش
حالا چسورد و میریزی تو متغییر

و پسورد وارد شده کاربر و md5 کن
حالا با if ساده چک کن اگه دوتا پسورد برابر بود
اینجوری دیگه دور نمیزنه

engmmrj
پنج شنبه 07 دی 1391, 09:56 صبح
منظورتون اینکه فقط یوزرنیم رو چک کنم؟

mamali-mohammad
پنج شنبه 07 دی 1391, 10:05 صبح
دوست عزیز از این بدتر نمیتونه باشه
شما نه در برابر sql injection امن هستی و نه در برابر xss
زمان ثبت اطلاعات در دیتابیس حتما متغیر رو escape و htmlspecialchars کن

engmmrj
پنج شنبه 07 دی 1391, 10:23 صبح
هکر آشنا بوده گفت از راه xss حمله کرده
با این کاری که شما گفتی مشکل حل میشه؟

lordofphp
پنج شنبه 07 دی 1391, 10:59 صبح
به نام خدا
سلام این کار هارو بکنید:
متغییرهارو از تابع myssql_real_escape_string عبور بدین مثلا


mysql_real_escape_string($_POST['user']);

دو.از کد امنیتی استفاده کنید
سه.سعی کنید محدودیت در لوگین بذارین
از نظر من اینطوری اوضاعتون خیلی بهتر میشه

engmmrj
پنج شنبه 07 دی 1391, 11:21 صبح
لطفا یه چیزی معرفی کنید که حداقل مبتدی ها نتون هک کنن

engmmrj
پنج شنبه 07 دی 1391, 11:23 صبح
به نام خدا
سلام این کار هارو بکنید:
متغییرهارو از تابع myssql_real_escape_string عبور بدین مثلا


mysql_real_escape_string($_POST['user']);

دو.از کد امنیتی استفاده کنید
سه.سعی کنید محدودیت در لوگین بذارین
از نظر من اینطوری اوضاعتون خیلی بهتر میشه
اینی که آپ کرده بودم آزمایشی بود تو نسخه اصلی از escape و htmlspecialchars استفاده کردم
دیگه چه راه حلی است که جلوی اینو حمله هارو بگیرم

pani.khoram
پنج شنبه 07 دی 1391, 11:50 صبح
سلام
تک تک موارد رو براتون لیست کردن ، اگه می خوای خیالت راحت بشه این موارد رو حتما انجام بده :
اگر نام کاربری یا رمز عبور سیستم شما فقط عدد قبول می کنه حتما قبل از استفاده از متغییر آن رو CAST کنید به INT مثل :
$_GET[‘product_id’] = (int) $_GET[‘product_id’];
$_GET[‘price’] = (float) $_GET[‘price’];

وقتی محدودیت می گذاری رویه مثلا رمز عبور ، به طور مثال فقط 10 تا حتما این موضوع رو تو سیستم خودت سمت سرور چک کنید :
LENGHT < 11

وقتی دارید query می زنی حتما این مورد زیر رو شدیدا رعابت کنید ، شما می دونید که حذف از دیتابیس بر اساس ID انجام می شه پس شرط زیر رو فراموش نکنید
# $_GET[‘del’] = “1; /* Muwahaha */ TRUNCATE users;”
if ((int)$_GET[‘del’]) {
mysql_query(“DELETE FROM users WHERE id=”.$_GET[‘del’]);
}

استفاده کردن از تابع mysql_real_escape_string در QUERY های شما الزامیه :
if (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query(“SELECT * FROM users WHERE name=’{$name}’”);

حتما درون سیستم مخصوصا موقع ورود کاربران ، از متد addcslashes برای بررسی استفاده هکر از / رعایت کنید .
ببنید اگر هر کدوم از این موارد رو انجام بدید ، تا حدود زیادی جلوی هکر رو گرفتی ولی اگر از تمام موارد به صورت صحیح در کنار هم استفاده کنید ، یک سیستم SAFE رو خواهی داشت .

اگر بدونم طرفدار داره حتما یک مقاله جامعه و کامل در مورد امنیت در PHP دارم می گذارم تو سایت .

موفق باشید

pani.khoram
پنج شنبه 07 دی 1391, 11:55 صبح
این مورد هم یادم رفت بگم حتما از PDO استفاده کنید در سیستم ، ارسال و دریافت اطلاعات به این شکل هم امنیت بیشتری داره و هم سهولت برنامه نویسی مخصوصا در MVC .

engmmrj
پنج شنبه 07 دی 1391, 11:59 صبح
من یه function درست کردم چه جوریه

function quote_smart($value)
{
preg_replace("/<.*?>/", "",$value );
urldecode($value);
if(!is_numeric($value)) {
if(get_magic_quotes_gpc()) $value = stripslashes($value);
return "'" .mysql_real_escape_string($value) . "'";
}
else return $value;
}
function url($value){
preg_replace("/<.*?>/", "",$value );
quote_smart($value);
intval($value);
stripslashes($value);
htmlspecialchars($value,ENT_QUOTES);
htmlentities($value,ENT_QUOTES);
utf8_decode($value);
strip_tags($value);
addcslashes($value);
@mysql_real_escape_string($value);
@mysql_escape_string($value);
trim($value);
return $value;
}
$query1="SELECT id,title,imgup,date,post FROM post WHERE title='".url($value)."';";
اینم اررو میده Warning: addcslashes() expects exactly 2 parameters, 1 given in C:\xampp\htdocs\new\single.php on line 33

engmmrj
پنج شنبه 07 دی 1391, 12:07 عصر
به درد میخوره این function ؟

pani.khoram
پنج شنبه 07 دی 1391, 12:09 عصر
اره خیلی خوبه ، اگه این فیلتر اول هر جایی قرار بدی . خودتون هم از امنیت خوب شناخت دارید دیگه لازم نبود سوال می کردید ، یه فایل اموزشی درست می کردید بهتر بود . :چشمک:
سعی کنید این رو تو PDO هم قرار بدید خیلی بهتر می شه .

فقط قبل از QUERY ها باز هم تاکید می کنم قبل از هر QUERY که مثل DELETE , UPDATE که داری پارامتر عددی به عنوان شناسه رکورد ارسال می کنید . CAST یادتون نره یا از is_numeric ...
توسط htaccess تمام مسیر هایی که لازم نیست کاربر ببینه رو DENY کنید . spam request ها رو جلوشو بگیرید .
پارامتر های ارسالی اگه از طریق URL داره انجام می شه حتما MD5 کنید یا هر HASH دیگه ای فرق نداره .
بیشترین ATTACK ها از این طریق انجام می شن . مخصوصا ATTACH رو سشن .
در آخر توسط متد escapeshellarg می تونی جلوی command های SSH رو بگیرید .
تاپیک خیلی خوبی شد ، این رو دوست داشتم .

engmmrj
پنج شنبه 07 دی 1391, 12:13 عصر
PDO چیه؟
وقتی URL رو با md5 میرفستم نمی تونه شناسایی کنه

$query1="SELECT id,title,imgup,date,post FROM post WHERE title='".md5($value)."';";
<a href=\"single.php?id=".md5($title)."\" class=\"button1\">Read More</a>

engmmrj
پنج شنبه 07 دی 1391, 12:20 عصر
اینم
addcslashes($value);
اینجوری گذاشتم تو function اررو میده

pani.khoram
پنج شنبه 07 دی 1391, 12:22 عصر
$query1="SELECT id,title,imgup,date,post FROM post WHERE md5(title)='".md5($value)."';";

الان خیلی راحت می تونی عدد رو Md5 کنید و بفرستید به query

فقط قبل $value رو بهتره cast کنید به عدد مثل : int($value) این طوری خیلی خیالتون راحت تر می شه در ضمن ' قبل و بعد از متغییر در query اجباریه . فراموش نکنید .

pdo در واقع PHP DATA OBJECT هست ، یک extention رویه خود Mysql که ظاهر ارسال QUERY ها رو عوض می کنه ، خودش خیلی از موارد iNJECTION و XSS ها رد خود کار رعایت می کنه و خیلی از مواردی که ممکنه ما در کد نویسی فراموش کنیم رو خودش درست می کنه . یک سرچ کوچیک یه دنیا اطلاعات در موردش به دست بیار ، حتما به دردتون می خوره .

pani.khoram
پنج شنبه 07 دی 1391, 12:25 عصر
$str = "Who's Kai Jim?";
echo $str . " This is not safe in a database query.<br />";
echo addslashes($str) . " This is safe in a database query.";

mamali-mohammad
پنج شنبه 07 دی 1391, 12:55 عصر
همون دو موردی که گفتم جلوی خطرناکترین حملات رو میگیره
البته امنیت فقط همین نیست ، اما این موارد پایه رو باید خوب استفاده کنی

siavashsay
پنج شنبه 07 دی 1391, 13:05 عصر
البته مواردی رو هم در مورد Session Fixation - CSRF هم علاوه بر Sql Injection در نظر بگیرید !
سعی کنید CSRF رو در اکثر فرم های مهم و کاردبردی سایتتون بکار ببرید :)

lordofphp
پنج شنبه 07 دی 1391, 14:07 عصر
سلام
دوست عزیز چرا انقدر دوست داری راه هکر ببندی؟:لبخند:
بذار هکر بیاد جلو بعد یقش بگیر !!
ولی درکل اون کد امنیتی حتما بذار
آخه از نظر من 90 درصد مبتدیا و بیشتر متوسطها با نرم افزار وب سایت تست میزنن مثلا اکونتیکس که با چیزهایی که به شما گفتم +برخی از تنظیمات htaccess و استفاده از یک وب هاستینگ امن خوب پیش میرین
حواستون باشه یکی از ضعف های برنامه نویسای تحت وب اینه که میخوان کاری کنن هکر های ساده هکشون نکنه شما بناروبراین بذارید بهترین هکر هکتون نکته درنتیجه تلاش بهتری خواهید داشت
درضمن من با همون کارای که گفتم بیشتر اوقات اکونتیکس از هک ناتوان شده
ولی شخصا علاقه مبارزه با هکرهارو دارم و ...

engmmrj
پنج شنبه 07 دی 1391, 14:29 عصر
هکر آشنا هست با هاش کلکلک دارم

mamali-mohammad
پنج شنبه 07 دی 1391, 14:35 عصر
راه های هک زیاده
xss-sql injection-bsqli-csrf-rfi-lfi و ...
باید اینارو همه رو بررسی کنی
اما برای مشکل فعلیت همون دو تا تابع گفتم کافیه

hidensoft
پنج شنبه 07 دی 1391, 19:01 عصر
گاهی وقتا می شه توی گوگل هم سرچ کرد. این سوالی که شما پرسیدی جزو ابتدایی ترین نکات امنیتیه. حیف وقت نیست واقعا.

parsboy
جمعه 08 دی 1391, 01:26 صبح
یله بسیار مبتدی است

engmmrj
جمعه 08 دی 1391, 01:46 صبح
یله بسیار مبتدی است
از سوالات شما که بهتره میپرسی چرا وقتی من فیلد هامو آپدیت میکنم کل رکورد ها آپدیت میشه

parsboy
جمعه 08 دی 1391, 01:49 صبح
میشه این تاپیک رو نشون بدید؟!!!:قهقهه:

vB.N3T
جمعه 08 دی 1391, 04:36 صبح
بچه ها من پی اچ پی کار نکردم ولی به جای اینکه تاپیک به حاشیه ببرید جواب اقا رو بدید
بحث هک رو نکشید وسط
اگه روی یه سرور 100 تا سایت با امنیت 99 درصد باشه و یک سایت با امنیت کم. اون 99 تا سایت رو هم به خطر می اندازه
هکر با نفوذ به سایت میتونه سیمولینک بزنه و تمام فایل کانفیگ سایت های روی سرور رو بخونه!!!!
امنیت سایت مهمه همون اندازه هم امنیت سرور مهمه. اگه مدیر سرور دانش خوبی نداشته باشه سایت شما هر لحظه در کمینه ! ببخشید باز هم میگم من php کار نکردم نمیتونم کمکتون کنم

wallfa
جمعه 08 دی 1391, 11:18 صبح
خلاصه حرف دوستان ! باید هر متغییری به کوئری هات میدی قبلش بررسی بشه که دقیقا همون چیزی باشه که میخواهید .