[OverTheWire] Natas – Level 13

http://natas13.natas.labs.overthewire.org/

For security reasons, we now only accept image files!
Choose a JPEG to upload (max 1KB)

Task này giống hệt bài 12, chỉ khác là có thêm bước kiểm tra định dạng file sau khi upload:

Lưu ý rằng exif_imagetype là một hàm có sẵn của PHP, nó kiểm tra một vài byte đầu tiên của file để xác định xem file đó có phải file ảnh hay không. Ta có thể bypass dễ dàng phép kiểm tra này bằng cách chèn nội dung 1 file ảnh vào trước đoạn code php của file 12.php của bài trước, và đổi tên nó thành 13.php emo_popo_big_smile

Thực hiện các bước tương tự như bài 12, kết quả là ta thu được flag nằm sau các byte loạn xạ của file hình:

...¹]j™)â14•j. J›å¿Úi&ûÙmuª[èÿÙ natas14:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

→ flag = Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1.

[OverTheWire] Natas – Level 12

http://natas12.natas.labs.overthewire.org/

Choose a JPEG to upload (max 1KB)…

Xem source:

Đọc hiểu cơ bản, ta thấy quá trình upload ảnh không có gì đặc biệt, quan trọng nhất là ở đường dẫn của file sau khi được upload:

Có những điểm quan trọng như sau:

  • Tên file (không bao gồm phần mở rộng) được tạo ngẫu nhiên.
  • Phần mở rộng lấy từ thuộc tính filename của form upload.
  • Thuộc tính filename có phần mở rộng cố định là .jpg:

Vì mọi thuộc tính của form (name và value) đều có thể thay đổi được, nên ta hoàn toàn có thể upload 1 file .php lên web để thực thi tác vụ mình muốn (code trên server theo như ta thấy thì nó không xử lý định dạng file) emo_popo_smile

Tạo file 12.php có nội dung:

Tại form upload, sửa thuộc tính filename thành *.php:

Chọn file 12.php và tiến hành upload:

The file ... has been uploaded

Nhấn vào link:

jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

→ flag = jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY.

 

[OverTheWire] Natas – Level 11

http://natas11.natas.labs.overthewire.org/

Cookies are protected with XOR encryption

Xem source:

Ok, chúng ta cần có $data[“showpassword”] == “yes”.

Trước đó, $data được lấy giá trị thông qua hàm loadData():

Hiểu tổng quát, $data được lấy từ biến data của cookie (không có thì lấy từ biến mặc định), với các thao tác xử lý lần lượt là:

base64_decode → xor_encrypt → json_decode

Quá trình này dễ thấy là đối xứng với các thao tác trong hàm saveData():

json_encode → xor_encrypt → base64_encode

Do json_encode, json_decode, base64_encode, base64_decode là các hàm có sẵn của PHP, nên cái ta cần bây giờ là hiểu được hàm xor_encrypt.

Nhưng… khoan đã, nãy giờ chúng ta cứ lan man về vấn đề mã hóa cookie, vậy nó có ý nghĩa gì đối với task này? emo_popo_angry

Hãy nhớ lại rằng, chúng ta phải có $data[“showpassword”] == “yes”, nhưng biến showpassword được mặc định là “no” (trong khai báo $defaultdata), còn cái mà chúng ta có thể thay đổi chỉ là mỗi bgcolor. Vậy thì chỉ còn cách đọc hiểu cơ chế xử lý cookie của task, và chỉnh sửa nó thủ công mà thôi.

Trở về với hàm xor_encrypt:

Rất dễ hiểu, là phép XOR với một dãy byte. Và do biến $key đã bị ẩn, nên ta cần tìm nó. Tìm bằng cách nào?

Chúng ta có input, dựa trên $data = $defaultdata. Chúng ta cũng có output, dựa trên giá trị cookie. Tóm tắt lại một chút:

Thực thi câu lệnh PHP sau để tìm được input của hàm xor_encrypt:

{"showpassword":"no","bgcolor":"#ffffff"}

Tương tự như vậy, thực thi câu lệnh PHP sau để xác định output của hàm xor_encrypt:

Ra xấu quá emo_popo_beat_brickThôi kệ nó đi >.<

Như vậy, ta đã có input và ouput. Kết hợp với tính chất kinh điển của phép toán XOR (mà mình đã từng nhắc đến trong một writeup trước đây), chúng ta coi như có đủ dữ kiện cần thiết. Đoạn code dưới đây sẽ cho ta biết các byte lần lượt được dùng để XOR input thành output là gì:

0x71
0x77
0x38
0x4a
0x71
0x77
0x38
0x4a
0x71
0x77
0x38
0x4a
0x71
0x77
0x38
0x4a
0x71
0x77
...

Dễ thấy $key = ‘x71x77x38x4a’. Giờ thì ta đã có thể thay đổi giá trị cookie theo ý muốn được rồi emo_popo_beauty

Đoạn code sau sẽ sinh cho ta một cookie với biến data[“showpassword”] = “yes”:

ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK

Thay thế cookie bằng kết quả vừa thu được:

The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3

→ flag = EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3.

[OverTheWire] Natas – Level 10

http://natas10.natas.labs.overthewire.org/

For security reasons, we now filter on certain characters
Find words containing…

Tương tự bài 09, nhưng có vẻ như đã escape mất rồi emo_popo_sweat Xem source:

Như vậy các ký tự bị lọc là:

[ ; | & ]

Cũng đâu có sao nhỉ, không có ; thì cũng vẫn được mà emo_popo_haha Inject với input:

'' /etc/natas_webpass/natas11

Kết quả:

/etc/natas_webpass/natas11:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK
dictionary.txt:
dictionary.txt:African
dictionary.txt:Africans
dictionary.txt:Allah
dictionary.txt:Allah's
...

→ flag = U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK.

[OverTheWire] Natas – Level 09

http://natas9.natas.labs.overthewire.org/

Find words containing…

Nhấn View sourcecode:

Cú pháp lệnh grep có thể tham khảo tại:

Thông tin được cung cấp từ đầu:

Each level has access to the password of the next level. Your job is to somehow obtain that next password and level up. All passwords are also stored in /etc/natas_webpass/. E.g. the password for natas5 is stored in the file /etc/natas_webpass/natas5 and only readable by natas4 and natas5.

Do biến $key không bị escape, ta có thể inject bằng input sau:

'' /etc/natas_webpass/natas10;

Kết quả:

nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu

→ flag = nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu.

[OverTheWire] Natas – Level 08

http://natas8.natas.labs.overthewire.org/

Input secret…

Xem source:

 

Như vậy là secret của ta sau khi được encode thì phải bằng với một giá trị hardcode có sẵn. Hàm encode:

y = bin2hex(strrev(base64_encode(x)))

Chú ý rằng bin2hex đây là hàm của php, convert một xâu từ ascii sang hex. Tìm x bằng câu lệnh sau (nguyên tắc Đi rẽ trái – Về rẽ phải):

oubWYf2kBq

Submit với secret thu được:

Access granted. The password for natas9 is W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

→ flag = W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl.

[OverTheWire] Natas – Level 07

http://natas7.natas.labs.overthewire.org/

Xem source:

Với dạng ?page=xxx, có thể nghĩ ngay đến Remote File Inclusion, và gợi ý đề đường dẫn nằm trong source cũng một phần góp thêm lý lẽ cho quan điểm ấy.

Truy cập:

Kết quả:

DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe

→ flag = DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe.

[OverTheWire] Natas – Level 06

http://natas6.natas.labs.overthewire.org/

Input secret…

Nhấn View sourcecode:

Có thể thấy rằng biến $secret được dùng để so sánh, nhưng nó lại không được khai báo trong file index.php. Vậy nó sẽ nằm trong file secret.inc. Truy cập:

Ra trang trắng tinh, xem source:

<?
$secret = "FOEIUWGHFEEUHOFUOIU";
?>

Quay lại submit với secret như trên:

Access granted. The password for natas7 is 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9

→ flag = 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9.

[OverTheWire] Natas – Level 05

http://natas5.natas.labs.overthewire.org/

Access disallowed. You are not logged in

Xem thông tin HTTP Response:

HTTP/1.1 200 OK
Date: Sat, 17 Aug 2013 14:09:15 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.7
Set-Cookie: loggedin=0
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 367
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html

Để ý thấy có dòng set cookie loggedin = 0, đặt lại nó = 1 emo_popo_smile

Access granted. The password for natas6 is aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1

→ flag = aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1.

[OverTheWire] Natas – Level 04

http://natas4.natas.labs.overthewire.org/

Access disallowed. You are visiting from “” while authorized users should come only from “http://natas5.natas.labs.overthewire.org/”

Câu trên nghĩa là tham số referer của request header phải là http://natas5.natas.labs.overthewire.org/. Có thể sử dụng curl như sau:

Kết quả:

Access granted. The password for natas5 is iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq

→ flag = iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq.