HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA CƠNG NGHỆ THƠNG TIN
_________________________
Học phần: An tồn mạng
Bài báo cáo:
Tìm hiểu tool JSFuck trong Kali
Giảng viên hướng dẫn :
TS.Đặng Minh Tuấn
Sinh viên
:
Trần Minh Quang
Mã sinh viên
:
B18DCAT191
Lớp
:
D18CQAT03-B
Nhóm mơn học
:
02
Số điện thoại
:
0966170663
HÀ NỘI - NĂM 2021
Mục lục
LỜI CẢM ƠN ................................................................................................................ ii
DANH MỤC TỪ VIẾT TẮT....................................................................................... iii
DANH MỤC HÌNH ẢNH ............................................................................................ iv
Mở đầu
6
Chương 1 - Giới thiệu ................................................................................................... 7
1.1. Tổng quan về JSFuck .................................................................................... 7
1.2. Lịch sử hình thành ......................................................................................... 7
Chương 2 - Hướng dẫn sử dụng .................................................................................. 9
3.1. Cài đặt JSFuck trên Kali ................................................................................... 9
3.2. Cài đặt JSFuck trên Window .......................................................................... 10
Chương 3 - JSF hoạt động như thế nào .................................................................... 11
3.1. Một số định nghĩa Javascript cơ bản .............................................................. 11
3.1.1. Ép kiểu ......................................................................................................11
3.1.2. Giá trị truthy/falsy ....................................................................................12
3.1.3. Ký hiệu ngoặc vuông ................................................................................13
3.1.4. Thứ tự ưu tiên và chiều thực hiện.............................................................14
3.1.5. Function constructor .................................................................................14
3.2. JSFuck hoạt động như thế nào ........................................................................ 15
3.2.1. Cặp ngoặc vuông [ ] .................................................................................15
3.2.2. Dấu cộng + ...............................................................................................16
3.2.3. Toán tử NOT ‘!’ .......................................................................................20
3.2.4. Cặp ngoặc tròn ( ) .....................................................................................20
3.2.5. Một số giải pháp thay thế .........................................................................21
3.2.6. Thực thi hàm .............................................................................................23
3.2.7. Một số ký tự điển hình được mã hóa ........................................................26
Tài liệu tham khảo ...................................................................................................... 29
LỜI CẢM ƠN
Để hoàn thành báo cáo này, đầu tiên em xin gửi lời cảm ơn chân thành đến
Học viện Cơng nghệ Bưu chính Viễn thơng vì đã đưa mơn An Tồn Mạng vào chương
trình đào tạo. Và đặc biệt, em xin gửi lời cảm ơn sâu sắc đến giảng viên môn học –
thầy TS. Đặng Minh Tuấn đã dạy dỗ, giảng dạy tận tình, chi tiết, và truyền đạt cho
em những kiến thức quý báu trong suốt thời gian học tập vừa qua để em có đủ kiến
thức và vận dụng chúng vào bài báo cáo này.
Tuy nhiên, do thời gian học tập trên lớp không nhiều, nên những hiểu biết và
kỹ năng của em về môn học này chắc chắn vẫn cịn nhiều hạn chế. Vì vậy, bài báo
cáo kết thúc học phần của em khó có thể tránh khỏi những thiếu sót và những chỗ
chưa chuẩn xác do chưa có nhiều kinh nghiệm làm để tài cũng như những hạn chế về
kiến thức. Em rất mong nhận được sự nhận xét, ý kiến đóng góp từ phía thầy để em
có thể hồn thiện tốt hơn bài báo cáo của mình. Lời cuối cùng, em xin kính chúc thầy
nhiều sức khỏe, thành công và hạnh phúc.
Em xin chân thành cảm ơn!
Hà Nội, ngày 24 tháng 12 năm 2021
Sinh viên
Quang
Trần Minh Quang
DANH MỤC TỪ VIẾT TẮT
Từ viết tắt
Viết đầy đủ
Giải nghĩa
JS
Javascript
một ngơn ngữ lập trình
JSF
JSFuck
Một kiểu làm khó hiểu javascript
DANH MỤC HÌNH ẢNH
Hình 1 Terminal cài đặt và run JSF trên kali ..............................................................9
Hình 2 Giao diện hiển thị của JSF khi run thành cơng .............................................10
Hình 3 Giải nén file zip tải về ...................................................................................10
Hình 4 Ví dụ một đoạn mã JSF .................................................................................11
Hình 5 Ví dụ về ép kiểu ............................................................................................12
Hình 6 Ví dụ về ép kiểu ngầm ..................................................................................12
Hình 7 Ví dụ về truthy/falsy......................................................................................13
Hình 8 Ví dụ về cơng dụng của ngoặc vng ...........................................................13
Hình 9 Ví dụ về thứ tự thực hiện các tốn tử ............................................................14
Hình 10 Ví dụ về Function constructor .....................................................................15
Hình 11 Ví dụ về mảng trong JSF.............................................................................15
Hình 12 Ví dụ về cách truy cập mảng trong JSF ......................................................16
Hình 13 Ví dụ về gói mảng trong JSF ......................................................................16
Hình 14 Ví dụ về ép kiểu ..........................................................................................17
Hình 15 Ví dụ về tăng 1 số........................................................................................17
Hình 16 Ví dụ lấy giá trị undefined ..........................................................................17
Hình 17 Ví dụ lấy giá trị NaN ...................................................................................18
Hình 18 Ví dụ cộng số ..............................................................................................18
Hình 19 Ví dụ sử dụng ++.........................................................................................18
Hình 20 Ví dụ ép kiểu thành chuỗi ...........................................................................19
Hình 21 Ví dụ lấy giá trị của 1 kí tự đơn ..................................................................19
Hình 22 Ví dụ kết hợp các kí tự đơn .........................................................................19
Hình 23 Ví dụ về ép kiểu boolean .............................................................................20
Hình 24 Ví dụ lấy chuỗi ‘true’ / ‘false’ .....................................................................20
Hình 25 Ví dụ về ngoặc trịn .....................................................................................20
Hình 26 Ví dụ về lowercase ......................................................................................21
Hình 27 Biểu thức chính quy ....................................................................................21
Hình 28 Dùng concat để nối chuỗi ............................................................................22
Hình 29 Ví dụ về tốn tử ‘=’ .....................................................................................22
Hình 30 Ví dụ về tốn tử ‘>’ .....................................................................................22
Hình 31 Ví dụ lấy kí tự ‘f’ với []>+ ..........................................................................23
Hình 32 Dùng dịch bit tạo số ....................................................................................23
Hình 33 Dùng dấu ` để thực thi hàm .........................................................................24
Hình 34 Thực thi hàm bằng cách gán sự kiện ...........................................................24
Hình 35 Chuyển đổi loại ánh xạ ................................................................................25
Hình 36 Thực thi hàm sử dụng biểu tượng ...............................................................25
Hình 37 Ví dụ về một functional constructor ...........................................................27
Hình 38 Ví dụ luyện tập ............................................................................................27
6
Mở đầu
Javascript là một ngơn ngữ lập trình kịch bản phía client, do đó mà code sẽ
được chạy thơng qua các file scripts (plaintext chứ không phải binary) và chạy hoàn
toàn ở dưới máy client. Điều này tiềm ẩn một rủi ro đó là APIs và resources của bạn
hồn tồn có thể bị một ai đó đánh cắp. Đáng buồn là chúng ta không thể che giấu
code đi được mà chỉ thể làm cho nó khó đọc hơn (obfuscate code). JSFuck là một
trong những phương pháp ra đời để thực hiện nhiệm vụ này.
7
Chương 1 - Giới thiệu
1.1. Tổng quan về JSFuck
JSFuck là một style lập trình rất khó hiểu dựa trên những thành phần cốt lõi
của javascript. Nó chỉ sử dụng 6 ký tự để viết và chạy code: []+()! . Nguồn gốc của
cái tên được lấy từ BrainFuck (một ngôn ngữ lập trình bí truyền cũng chỉ sử dụng
một bộ kí tự tối giản chỉ có các dấu +, -, <, >, [, ] . Khơng giống BrainFuck, cần phải
có trình biên dịch riêng của nó, JSFuck là một đoạn code JS có giá trị. Có nghĩa là
chương trình JSF có thể chạy trên các trình duyệt khác nhau. JSF có thể tái tạo tất cả
các chức năng của JS mà chỉ dùng 6 kí tự vì JS là một loại ngơn ngữ lập trình
yếu(weekly typed). Có nghĩa là khi biên dịch, nó khơng bắt lỗi chặt chẽ các ngoại lệ
có thể xảy ra. Do đó JS cho phép đánh giá bất kỳ biểu thức nào dưới bất kì dạng nào.
1.2. Lịch sử hình thành
Vào tháng 7 năm 2009, Yosuke Hasegawa đã tạo ra một ứng dụng web có tên
là jjencode có thể mã hóa JavaScript tùy ý thành một dạng phức tạp chỉ sử dụng 18
ký hiệu [] ()! +, \ "$.:; _ {} ~ =.
Vào tháng 1 năm 2010, một cuộc thi khơng chính thức đã được tổ chức trong
diễn đàn "Obfuscation" của trang web bảo mật ứng dụng web sla.ckers.org(Trang
web này hiện khơng cịn hoạt động nhưng chúng ta vẫn có thể tìm được các bài viết
ở trang web.archive.org) để tìm ra cách đạt được số lượng ký tự tối thiểu được yêu
cầu xuống dưới tám: [] ( )! +, /. Những người đóng góp vào chuỗi đã quản lý để loại
bỏ sự cần thiết của ký tự , và / .
Kể từ tháng 3 năm 2010, một bộ mã hóa trực tuyến có tên JS-NoAlnum đã có
sẵn chỉ sử dụng bộ cuối cùng gồm sáu ký tự.
Vào cuối năm 2010, Hasegawa đã tạo ra một bộ mã hóa mới có tên JSF * ck
cũng chỉ sử dụng sáu ký tự.
Năm 2012, Martin Kleppe tạo một dự án "jsfuck" trên GitHub, và trang web
JSFuck.com với ứng dụng web sử dụng việc triển khai bộ mã hóa đó. JSFuck có thể
8
được sử dụng để bỏ qua việc phát hiện mã độc hại được gửi trên các trang web, ví
dụ: trong các cuộc tấn công tập lệnh xuyên trang (XSS). Một cách sử dụng phổ biến
hơn của JSFuck đó là tính Obfuscation (kiểu mã hóa làm cho code khó đọc hơn). Một
phiên bản được tối ưu hóa của JSFuck đã được sử dụng để mã hóa jQuery, một thư
viện JavaScript, thành một phiên bản đầy đủ chức năng được viết chỉ với sáu ký tự.
9
Chương 2 - Hướng dẫn sử dụng
3.1. Cài đặt JSFuck trên Kali
• Bước 1: Clone repository JSFuck trên github.
→ Mở terminal lên nhập: git clone />• Bước 2: Di chuyển vào thư mục vừa clone
→ cd jsfuck
• Bước 3: Start project ở cổng 8181
→ php –S 127.0.0.1:8181
Hình 1 Terminal cài đặt và run JSF trên kali
Sau khi start server thành cơng, chúng ta mở trình duyệt truy cập vào đường dẫn
http://127.0.0.1:8181 hoặc http://localhost:8181 sẽ hiển thị giao diện như sau:
10
Hình 2 Giao diện hiển thị của JSF khi run thành cơng
Đến đây thì phần cài đặt JSF trên Kali đã thành công
3.2. Cài đặt JSFuck trên Window
Để cài đặt JSF trên Window chúng ta chỉ cần tải xuống và giải nén tệp tin ở
địa chỉ sau: Sau khi giải nén
chúng ta sẽ có 1 thư mục gồm các file như Hình 3
Hình 3 Giải nén file zip tải về
-
Mở file index.html ta sẽ được giao diện như Hình 2
11
Chương 3 - JSF hoạt động như thế nào
JSF hoạt động như thế nào?
Hình 4 Ví dụ một đoạn mã JSF
Đoạn code trong hình 4 tương đương với việc gọi hàm ‘alert(1)’ trong JS. Vậy tại sao
một hàm đơn giản như thế lại mã hóa ra một đoạn code dài như vậy. Và mã hóa theo
cơng thức nào? Chúng ta sẽ cùng làm rõ ngay dưới đây.
3.1. Một số định nghĩa Javascript cơ bản
3.1.1. Ép kiểu
a) Ép kiểu rõ ràng (explicit conversion)
-
Javascript có thể sử dụng 2 tốn tử ‘+’ và ‘!’ để ép kiểu rõ ràng:
→ Toán tử ‘+’ có thể ép kiểu cho tốn hạng thành kiểu number.
→ Tốn tử ‘!’ có thể ép kiểu cho tốn hạng thành kiểu boolean.
12
Hình 5 Ví dụ về ép kiểu
b) Ép kiểu ngầm (implicit conversion)
Có rất nhiều điều để nói về ép kiểu ngầm ở trong javascript. Tuy nhiên, với
JSF, chúng ta chỉ cần hiểu tại sao:
• []+[] là một string rỗng
• +[] bằng 0
• +{} là NaN
Ba biểu hiện kỳ quặc này có được bởi sự nhập nhằng khi sử dụng tốn tử +. Tốn tử
+ có thể dùng để nối strings, cộng và ép kiểu. Thực tế thì, Array.prototype.toString()
và Object.prototype.toString() đã được gọi ngầm khi ép kiểu Array và Object về kiểu
nguyên thủy. Vì vậy, đây là những gì thực tế xảy ra:
Hình 6 Ví dụ về ép kiểu ngầm
3.1.2. Giá trị truthy/falsy
Trong một biểu thức boolean, javascript chấp nhận các giá trị true/false, nhưng nó
cũng đánh giá các giá trị truthy/falsy.
13
Trong một biểu thức boolean, javascript chấp nhận các giá trị true/false, nhưng nó
cũng đánh giá các giá trị truthy/falsy.
• Object, array, function v..v là truthy.
• undefined, null, NaN, 0 ln ln là falsy.
Hình 7 Ví dụ về truthy/falsy
3.1.3. Ký hiệu ngoặc vuông
Trong javascript, tất cả các đối tượng đều có những thuộc tính và phương thức riêng.
Chúng có thể được gọi đến bằng ký hiệu . hoặc ký hiệu []. JSFuck sử dụng ký hiệu
[].
Hình 8 Ví dụ về công dụng của ngoặc vuông
14
3.1.4. Thứ tự ưu tiên và chiều thực hiện
• Tốn tử một ngơi (unary operator) có mức độ ưu tiên cao hơn tốn tử hai ngơi
(binary operator)
• Tốn tử một ngơi thực hiện từ phải sang trái, tốn thử hai ngơi thực hiện từ
trái sang phải
Ví dụ:
Hình 9 Ví dụ về thứ tự thực hiện các toán tử
3.1.5. Function constructor
Hàm Function constructor - Function("code") chính là ý tưởng chủ đạo của
jsfuck: nó nhận vào một String làm tham số và trả về một hàm nặc danh (anonymous)
trong đó chuỗi tham số đầu vào sẽ là phần thân của hàm này. Nói một cách khác, nó
giúp bạn thực thi mọi code dưới dạng một String. Do đó, nếu như jsfuck có thể thực
hiện được 2 việc sau:
• Encode mọi đoạn code javascript chỉ với 6 ký tự []+()!
• Gọi được đến hàm Function constructor.
thì jsfuck có thể thực thi mọi đoạn code javascript với chỉ 6 ký tự []+()!
15
Hình 10 Ví dụ về Function constructor
3.2. JSFuck hoạt động như thế nào
3.2.1. Cặp ngoặc vuông [ ]
Chúng ta sẽ bắt đầu với cặp ngoặc vng đóng mở và xem chúng có thể làm
được gì. Chúng có tác dụng rất lớn trong JSF và được coi là yếu tố cốt lõi vì chúng
cung cấp phương thức để:
• Xử lý mảng
• Truy cập đến các thuộc tính và phương thức
Dưới đây sẽ là một vài ví dụ về cách dùng của cặp ngoặc vng
a) Khi tạo mảng mới
Hình 11 Ví dụ về mảng trong JSF
b) Truy cập mảng/object
16
Hình 12 Ví dụ về cách truy cập mảng trong JSF
c) Thủ thuật gói mảng
Bằng cách gói một biểu thức trong một mảng và sau đó nhận phần tử ở chỉ số 0,
chúng ta có thể áp dụng một số tốn tử trên một biểu thức. Điều này có nghĩa là dấu
ngoặc [] có thể thay thế dấu ngoặc () để tách biệt các biểu thức:
Hình 13 Ví dụ về gói mảng trong JSF
3.2.2. Dấu cộng +
Tốn tử này rất hữu dụng với các cơng dụng chính như:
• Tạo một số
• Cộng 2 số với nhau
• Nối 2 chuỗi với nhau
• Tạo chuỗi
a) Ép kiểu sang số
17
Hình 14 Ví dụ về ép kiểu
b) Tăng một số
Sử dụng thủ thuật gói mảng được đề cập bên trên:
Hình 15 Ví dụ về tăng 1 số
c) Lấy giá trị undefined
Lấy 1 phần tử bằng chỉ số trong một mảng rỗng sẽ trả về undefined
Hình 16 Ví dụ lấy giá trị undefined
d) Lấy giá trị NaN
Ép kiểu undefined sang Number sẽ cho kết cả là một NaN
18
Hình 17 Ví dụ lấy giá trị NaN
e) Cộng số
Hình 18 Ví dụ cộng số
Một cách khác sử dụng ++:
Hình 19 Ví dụ sử dụng ++
Bằng cách này, chúng ta có thể truy cập đến tất cả các số: 0,1,2,3,4,5,6,7,8,9
f) Ép kiểu thành chuỗi
Sử dụng dấu cộng và cặp ngoặc vuông +[ ] sẽ trả 1 giá trị về chuỗi
19
Hình 20 Ví dụ ép kiểu thành chuỗi
g) Lấy giá trị của 1 kí tự đơn
Khi có 1 chuỗi, chúng ta có thể lấy 1 ký tự đơn lẻ, ở trường hợp bên dưới, ta có thể
lấy được ký tự ‘u’
Hình 21 Ví dụ lấy giá trị của 1 kí tự đơn
Theo đó thì khi chúng ta có ‘NaN’ và ‘undefined’, chúng ta có thể lấy được các ký tự
đơn sau: N, a, d, e, f, i, n, u
h) Kết hợp các kí tự đơn
Chúng ta có thể nối các ký tự lại với nhau bằng cách sử dụng dấu ‘+’
Hình 22 Ví dụ kết hợp các kí tự đơn
20
3.2.3. Toán tử NOT ‘!’
Đây là ký tự thứ tư trong bộ JSFuck ban đầu và được sử dụng để tạo boolean.
a) Ép kiểu sang boolean
Tốn tử logic "Not" có thể được sử dụng để tạo boolean false và true:
Hình 23 Ví dụ về ép kiểu boolean
b) Lấy chuỗi “true” và “false”
Hình 24 Ví dụ lấy chuỗi ‘true’ / ‘false’
Điều này sẽ giúp chúng ta có thể truy cập đến nhiều kí tự hơn: a, e, f, l, r, s, t, u
3.2.4. Cặp ngoặc trịn ( )
a) Gọi phương thức
Hình 25 Ví dụ về ngoặc trịn
Từ đó ta truy cập được các kí tự mới sau: j, <, >, =, “, /
21
b) Gọi phương thức với nhiều hơn 1 tham số
Việc gọi một phương thức có nhiều đối số là khơng hề dễ - để thực hiện, có thể sử
dụng kỹ thuật sau (được phát hiện bởi trincot) - ví dụ:
-
Gọi string method "truefalse".replace("true","1") có thể viết thành:
→ ["true", "1"].reduce("".replace.bind("truefalse"))
→ ["true"]["concat"]("1")["reduce"](""["replace"]["bind"]("truefalse"))
c) Lấy bất kì chữ cái thường nào
Phương thức toString của Number có một đối số tùy chọn chỉ định cơ sở để sử dụng
(từ 2 đến 36). Với cơ số 36, chúng ta có thể lấy ra bất kỳ chữ cái thường nào:
Hình 26 Ví dụ về lowercase
d) Tạo đối tượng biểu thức chính quy
Bạn có thể tạo biểu thức chính quy, ví dụ: / pattern /g như sau:
Hình 27 Biểu thức chính quy
3.2.5. Một số giải pháp thay thế
a) Nối chuỗi
Thay vì dùng tốn tử ‘+’ ta có thể sử dụng ‘.concat’ để nối chuỗi:
22
Hình 28 Dùng concat để nối chuỗi
Trước đó thì chúng ta cần nối "c", "o", "n", "c", "a" và "t" để có “concat”
b) Boolean
Tốn tử “!” cần phải thay thế với một kí tự mạnh hơn có thể sử dụng được theo nhiều
cách
“=” - boolean + gán giá trị
Hình 29 Ví dụ về tốn tử ‘=’
“>” - boolean + tạo số
Hình 30 Ví dụ về tốn tử ‘>’
Một ví dụ phức tạp hơn là chúng ta có thể lấy được ký tự “f” chỉ với []>+
23
Hình 31 Ví dụ lấy kí tự ‘f’ với []>+
c) Numbers
Thay vì ‘+’ chúng ta có thể dùng booleans và dịch bit để tạo số:
Hình 32 Dùng dịch bit tạo số
3.2.6. Thực thi hàm
Các cách thực thi hàm mà không sử dụng ():
a) Sử dụng dấu nháy `
Thay vì sử dụng dấu ngoặc đơn mở và đóng, chúng ta có thể sử dụng dấu nháy ` để
thực thi các hàm. Trong ES6, chúng có thể được sử dụng để nội suy các chuỗi và
cung cấp một biểu thức cho các ký tự mẫu được gắn thẻ.
24
Hình 33 Dùng dấu ` để thực thi hàm
Điều này sẽ cung cấp cho ta các ký tự từ "Đối tượng" và quyền truy cập vào các
phương thức của nó.
Thật khơng may, chúng ta chỉ có thể chuyển một chuỗi duy nhất (từ bảng chữ cái cơ
bản của chúng ta, ví dụ: []! +) Làm tham số. Khơng thể gọi các phương thức có nhiều
đối số hoặc một chuỗi được biên dịch trước. Để làm điều đó, chúng ta phải sử dụng
phép nội suy biểu thức bằng cách sử dụng $ {} để giới thiệu các ký tự mới.
b) Xử lý sự kiện
Hàm hoặc các phương thức cũng có thể được thực thi bằng cách gán chúng cho một
trình xử lý sự kiện. Có một số cách để làm điều đó:
Hình 34 Thực thi hàm bằng cách gán sự kiện
Lưu ý: chúng ta cần “=” để chỉ định hàm xử lý
Tuy nhiên chúng ta không thể truy cập tới window hay DOM để bắt các trình xử lý
sự kiện