|
| 1 | +#Level 11 |
| 2 | +###### user: *natas11* pass: *1KFqoJXi6hRaPluAmk8ESDW4fSysRoIg* |
| 3 | ++ Trước tiên hãy phân tích đoạn source code: |
| 4 | +#### Hàm `xor_encryp`: được sử dụng để mã hóa hoặc giải mã `$input` với thuật toán XOR: |
| 5 | +```PHP |
| 6 | +function xor_encrypt($in) { |
| 7 | + $key = '<censored>'; |
| 8 | + $text = $in; |
| 9 | + $outText = ''; |
| 10 | + |
| 11 | + // Iterate through each character |
| 12 | + for($i=0;$i<strlen($text);$i++) { |
| 13 | + $outText .= $text[$i] ^ $key[$i % strlen($key)]; |
| 14 | + } |
| 15 | + |
| 16 | + return $outText; |
| 17 | +} |
| 18 | +``` |
| 19 | +#### Hàm `loadData`: load và giải mã data từ `Cookie` của người dùng, sử dụng hàm `xor_encrypt` và `base64_decode` để giải mã. Nếu data đó và bgcolor là một giá trị hex màu hợp lệ, nó sẽ cập nhật $mydata với thông tin này. |
| 20 | +```PHP |
| 21 | +function loadData($def) { |
| 22 | + global $_COOKIE; |
| 23 | + $mydata = $def; |
| 24 | + if(array_key_exists("data", $_COOKIE)) { |
| 25 | + $tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true); |
| 26 | + if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) { |
| 27 | + if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) { |
| 28 | + $mydata['showpassword'] = $tempdata['showpassword']; |
| 29 | + $mydata['bgcolor'] = $tempdata['bgcolor']; |
| 30 | + } |
| 31 | + } |
| 32 | + } |
| 33 | + return $mydata; |
| 34 | +} |
| 35 | +``` |
| 36 | +#### Hàm `saveData`: nhận một mảng, chuyển dạng văn bản thành JSON, sau đó mã hóa base64 và lưu trong một cookie tên `data` |
| 37 | +```PHP |
| 38 | +function saveData($d) { |
| 39 | + setcookie("data", base64_encode(xor_encrypt(json_encode($d)))); |
| 40 | +} |
| 41 | +``` |
| 42 | +###### mật mã XOR là một thuật toán giải mã và mã hóa cơ bản, yêu cầu hai biến để mã hóa/giải mã một thông tin, một biến là chuỗi ký tự thường/mã hóa, một biến là key |
| 43 | +###### VD: |
| 44 | +``` |
| 45 | +xor_cipher(orginal_message, key) -> encrypted_message |
| 46 | +xor_cipher(encrypted_message, key) -> original_message |
| 47 | +``` |
| 48 | +###### JSON là một format với 2 thành phần chính là objects (gồm nhiều cặp key:value) và arrays (gồm nhiều objects trong []). |
| 49 | +###### VD: |
| 50 | +``` |
| 51 | +PHP Array: $array = array("name" => "John", "age" => 30, "city" => "New York"); |
| 52 | +-> JSON string: {"name":"John","age":30,"city":"New York"} |
| 53 | +``` |
| 54 | ++ Chức năng chính của đoạn code là duy trì setting của người dùng (ở trong đoạn code là `showpassword` và `bgcolor` thông qua cookies. |
| 55 | ++ Quá trình xử lý của đoạn code: sử dụng một `base64__encode` và `json_encode` để tiến hành mã hóa `$defaultdata` thành cookies và `mã hóa XOR` cookies đó với key bị ẩn. Vì vậy muốn tìm được cookie để website hiện pass, ta sẽ xử lý cookies khởi điểm và cookies hiện tại (hay cookies được mã hóa bằng XOR) để tìm ra key: |
| 56 | ++ Đầu tiên, tìm cookies dựa trên `$defaultdata`: |
| 57 | + |
| 58 | +###### Sử dụng PHP compiler bất kỳ |
| 59 | +-> Ta sẽ được cookies: `eyJzaG93cGFzc3dvcmQiOiJubyIsImJnY29sb3IiOiIjZmZmZmZmIn0` |
| 60 | ++ Lấy cookie của trang web (sử dụng Inspector) |
| 61 | ++ Tiếp theo, tìm key XOR dựa trên 2 cookies: |
| 62 | + |
| 63 | +###### Sử dụng [CyberChef](https://gchq.github.io/CyberChef/), một chương trình UI đơn giản cho phép thay đổi base, mã hóa, giải mã các loại data khác nhau. |
| 64 | +-> Được key: `KNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLK`, có thể để ngắn thành `KNHL`. |
| 65 | ++ Cuối cùng sử dụng key để mã hóa thông tin của `$defaultdata` với thay đổi nhỏ là trường `showpassword : yes` |
| 66 | + |
| 67 | +-> được cookies: `MGw7JCQ5OC04PT8jOSpqdmk3LT9pYmouLC0nICQ8anZpbS4qLSguKmkz` |
| 68 | ++ Thay đổi cookies, refresh page, ta sẽ được pass. |
| 69 | + |
| 70 | + |
| 71 | + |
0 commit comments