Sau khi format lại code cho dễ đọc thì có hai điều cần để ý
Nếu đầu vào method GET có chứa 3 param show, obj, flagfile thì sẽ gọi đến hàm secure_unjsonify với class cho phép là Flag
flag lưu ở file flag.php
Và tất nhiên nếu chỉ gọi show thì sẽ bị lỗi chứ không ra luôn flag được :)) bởi vì isAllowedToSeeFlag đang là false
Vì vậy chỉ còn 1 hướng khai thác duy nhất đó là target vào option đầu tiên, kiểm tra xem hàm secure_unjsonify có gì
Obj truyền vào phải là một class ở dạng serialize và sau đó sẽ đọc và ghi đè lên bằng các properties của class đó
Vậy hướng khai thác cũng khá đơn giản, chỉ cần truyền vào 1 obj mang giá trị isAllowedToSeeFlag = True và đường dẫn flagfile = ./flag.php (ban đầu mình thiếu đường dẫn nên loay hoay mất khá nhiều thời gian :(( )
Trong soure code cũng có sẵn hàm secure_jsonify để convert dữ liệu rồi nên việc còn lại chỉ cần tạo class Flag với 2 properties mang giá trị như trên là được
12345678910111213141516171819202122232425
classFlag{public$isAllowedToSeeFlag;public$flagfile;public$properties= array("isAllowedToSeeFlag","flagfile");publicfunction__shutdown(){return$this->properties;}}$obj= newFlag();$obj->isAllowedToSeeFlag = true;$obj->flagfile = "./flag.php";//hàm này có sẵn trong source codefunctionsecure_jsonify($obj){$data= array();$data['class'] = get_class($obj);$data['properties'] = array();foreach($obj->__shutdown() as& $key){$data['properties'][$key] = serialize($obj->$key);}returnjson_encode($data);}echosecure_jsonify($obj);
Chạy script
Sau đó ném vào obj gửi request là xong
Flag: ENO{PHPwn_1337_hakkrz}
2. Unis Love Code
Giao diện:
Làm đẹp lại code cho dễ đọc và thấy có một hàm check username gửi lên bằng method POST, vượt qua nó thì sẽ có Flag
Xem hàm check có gì nào
Đại khái là ban đầu sẽ check đầu vào phải khác với bằng với “admin” và không được có kí tự in hoa, sau đó thì upper lên để so sánh với “ADMIN“
Làm thế nào để đạt được điều đó? Câu trả lời là sử dụng UNICODE. Một số unicode sẽ được chuyển đổi thành not-UNICODE trong quá trình chuyển đổi nó thành chữ hoa. Trong trường hợp này, mình sử dụng ı unicode, để tên người dùng là admın. Kết quả:
Bài này thì mình không giải được nên có nhờ sự trợ giúp của em Chiến để viết wu cho đủ :))
View source code thì có 2 thứ cần lưu ý
secret sau khi nhập vào sẽ được cộng với username và time stamp, sau đó hash md5 rồi so sánh xem giá trị có được kết thúc bằng 5 số 0 hay không
repass là một đoạn regex được filter độ dài và một số kí tự, nếu sau 1s request vẫn “còn sống” thì sẽ lấy được flag
Đầu tiên về secret thì ta cần thực hiện brute force với 1 time stamp trong tương lai, sau đó đợi đến đúng thời gian đó thì gửi request với secret đã brute force được
Tiếp theo về repass thì mình có xin được đoạn regex của em Chiến delay time trên 1s: “((({char}+)+)+)+!“, {char} là kí tự khớp với p_o_w được sinh ra random dựa theo time stamp trên
Ở đây mình lấy ví dụ với time stamp là 1660578999 tương ứng với thời gian thực tế à 2022-08-15 22:56:39