✏️[Root me] Writeup Sever Side
Last updated
Last updated
Đây là trang write up về challenges root me về sever side. Mặc dù hiện tại có rất nhiều người write up về root me nhưng mình vẫn muốn làm và write up lại để một phần nhớ kiến thức. Nó mang theo kiểu note là chính. [Mức độ Medium trở lên _ но не все]
Khi vào trang web chúng ta sẽ có một form đăng nhập như sau:
Ở đây chúng ta sẽ login như là khách, sau khi login được tài khoản khách chúng ta sẽ check cookie xem có gì.
Ở đây mình nhận ra cookie có sử dụng jwt, thì mình thử decode xem nó như nào.
Ở đây mình check tool jwt nhưng không thể có được secret nào nên mình set lại jwt bằng cách không sử dụng algorithm
Đoạn code trên sẽ như này:
Thay thế cookie hiện tại ta có flag
Ở bài này như tiêu đề thì là weak secret mình có thẻ brute foce được secret.
Chúng ta truy cập /token có mã token như trên:
Mình dùng tool jwt
để brute foce secret mã trên:
Ở đây mình có được secret bắt đầu encode một token với role:admin
Oke bay giờ post nó lên và thêm Authorization để xác nhận là xong.
Ở bài này cho sẵn code để phân tích.
Chúng ta sẽ phân tích đoạn code này như sau:
Đoạn code trên có 3 hàm quan trọng đó là:
** -> như đã nói ở trên rằng token sẽ có hạn là 3p nhưng có điều là khi token được tạo ra đã bị add vào blacklist.
Chú ý cách tạo token JWT header.payload.signature
Ở đây cần chú ý tới cách tạo ra signature:
Ở đây theo gợi ý ở metarial trang root-me cho thì có thể bypass bằng cách dùng ký tự non-alphabet nhưng ở đây chúng ta thấy rằng signature được base64urlEncode()
. Thì trong base64 thường có dấu = kết thúc ở cuối mà mình nhận ra dù bạn thêm hay bớt dấu = thì nó vẫn decode ra một giá trị.
Ví dụ như: aG9haG9uZ2Rv=
và aG9haG9uZ2Rv
đều decode ra hoahongdo
Oke bây giờ thêm Authorization header và thêm dấu = ở cuối JWT hoặc một non-alphabet như tiếng Nga(л), tiêng Trung...
Bài này có lỗ hổng LFI nhìn qua khi mình thử xem đọc được file passwd không thì nó hiện ra như này:
Ở đây hiện ra hai hàm assert()
và strpos()
. Trong đó hàm assert() kiểm tra đầu vào và trả về giá trị bool. Nếu kết quả là fallse thì nó sẽ thực hiện ném lỗi ra. Còn hàm strpos() dùng để tìm vị trí xuất hiện đầu tiên của chuỗi con trong chuỗi cha.
Đối với hàm assert() thì có hai tham số assert
(
mixed
$assertion,
Throwable
$exception = ?): bool
nếu mà nó check $assertion false thì sẽ ném ra $exception, còn đối với hàm cũng thể strpos( $str, $char, $position)
.
Chú ý rằng khi đúng tra truyền ../../../etc/passwd thì thấy rằng chúng ta có thể inject được dòng code.
Code PHP ở dòng có thể là:
assert("strpos('includes/$file.php', '..') === false") or die("Detected hacking attempt!");
Payload lúc này sẽ là: ','')+or+die(show_source('.passwd'));//
Lúc đó đoạn code: