[Write-up] HTTP - Hố bug nho nhỏ
HTTP là viết tắt của HyperText Transfer Protocol, nghĩa là giao thức truyền tải siêu văn bản. Nó cũng là 1 trong 5 giao thức phổ biến nhất mạng internet hiện nay (HTTP, FTP, SMTP, IMAP, SNMP)
Khuyến cáo: nên vào link thử test trước khi đọc thêm phần dưới!
0x01. HTTP - Open Redirect
Với bài này: http://tiny.cc/http_redirect
Xem Source trên ta có thể thấy có 3 lệnh http redirect và mỗi url đều được gán với 1 mã hash MD5
Md5(https://facebook.com) = a023cfbf5f1c39bdf8407f28b60cd134
Đây là lệnh http nhằm kiểm tra tính toàn vẹn của url, tức có nghĩa là nó sẽ chuyển hướng trang web đến https:\\facebook.com, nếu như MD5 của url này bằng với đoạn mã hash MD5 đằng sau. Nên khi bạn đổi url khác nhưng nó không trùng với đoạn hash đó thì trang web sẽ báo lỗi.
Giờ mình sẽ thử:
Md5(https://root-me.org) = ff3b06bec7b5bc0469b378d3abb9bf83
Flag sẽ xuất hiện.... :))
0x02. HTTP - User Agent
Với bài này: http://tiny.cc/http_ua
Bài này khá dễ nên mình sẽ không giải :))) do it yourself :v
User Agent của các trình duyệt là tình năng vô cùng hữu ích khi nó cho phép bạn tuỳ biến giao diện của trình duyệt đến giao diện của tổng cả trong web. Hơn thế nữa nó còn có thể can thiệp vào cách mà trình duyệt render ra một trang web từ source. Thêm nữa, bạn có thể tuỳ biến được tên thiết bị mà bạn muốn dùng để truy câp vào trang web, thâm chí bạn có thể đưa chế độ duyệt web từ online sang offline.
0x03. HTTP - Directory Indexing
Với bài này: http://tiny.cc/dir_index
Bằng gởi ý từ đề:
M hãy sử dụng Ctrl + U đi
Chúng ta có được cái này:
Ta giờ lại có thêm một cái gợi ý khác, một đường dẫn:
http://challenge01.root-me.org/web-serveur/ch4/admin/pass.html
Và đời éo như là mơ :v toàn là text và flag...tao đâu???
Mà khoan hãy thử xoá html đi nhỉ:
http://challenge01.root-me.org/web-serveur/ch4/admin/
Wow! chúng ta được một cái gì đây hehe
Công việc còn lại là của bạn :)))
Nói thêm về Dir Index, đây là một lỗi rất sơ đẳng của các trang web thời xa xưa nhưng một số rất ít trang web hiện giờ vẫn bị. Này nó như một file explorer vậy ấy, đôi khi tìm những thứ như này khá thú vị đấy, biết đâu tìm được vàng :D
0x04. HTTP - Header
Với bài này: http://tiny.cc/http_header
Gợi ý của đề:
HTTP response sẽ cho thông tin cần thiếtVà thêm cả "gợi ý" từ trang web:
Thông tin không phải là phần duy nhất trong HTTP responseNên chúng ta sẽ tập trung vào "soi" HTTP response đầu tiên:
Có 1 cái Header khả nghi đấy: Header-RootMe-Admin: none
Giờ "soi" thử đến HTTP request thử:
Và BOOM flag hiện ra hehe!!!
0x05. HTTP - POST
Với bài này: http://tiny.cc/http_post
Đầu tiên ta có gì đây:
1 trò chơi, cần phải nhấn nút để nó xuất ra điểm và nếu số điểm cao hơn 999999 thì bạn win:
ĐỪNG CÓ MÀ CỐ BẤM ĐẾN KHI NÀO WIN NHÉ :)))
Mở Source nó ra xem trước đã:
Phân tích code thôi:
- Khi bạn nhấn nút nó sẽ thiết lập phương thức POST với dòng lệnh document.getElementsByName('score')[0].value = Math.floor(Math.random() * 1000001)
- Hàm Math.random() trong js nó là một hàm sinh số ngẫu nhiên và trả về một số thực trong khoảng 0..1 và được nhân với 1,000,001.
- Hàm Math.floor() nó là một hàm làm tròn xuống, nó sẽ cắt bỏ phần thập phân của số thực.
Nhưng từ từ đã, ta có cái HTTP request POST kìa, hãy xem nó có gì:
Có cái Form Data: score=209470&generate=Give+a+try%21 cần phải chú ý đấy, nó mang đúng với giá trị mà ta đã generate được.
Giờ mình sẽ thử gửi lại request và đổi giá trị score=9999999 hehe:
BOOM WE WON!!! FLAG IS APPEARED HEHE :D
Vậy lỗ hổng ở đâu??? :)))
Từ từ, request redirect được gửi bằng phương thức HTTP POST. Ta có thể can thiệp một xíu vào request này, nó vẫn sẽ redirect nhưng sẽ sai sai một xíu. Mình sẽ gửi lại cái request đấy và sửa lại một tí:
Mình sẽ xoá đi phần đuôi "login.php" sau POST, rồi thêm vào 1 Header Location: login.php. Như vậy nó sẽ vẫn redirect đến "login.php" nhưng sai đi một xíu, để đánh lạc hướng PHP để nó có thể gửi nhiều thông tin hơn.
BOOM!!! FLAG IS APPEARED!!!
Giờ bắt đầu vào bài thôi :)))
Cái Header Authorization, nó là một header để xác thực, có 2 loại xác thực:
Ở đây không tìm được một lỗ hổng nào sao???
0x06. HTTP - Improper Redirect
Với bài này: http://tiny.cc/http_ir
Xem ta có gì nào:
Bạn cần phải login vào để có thể truy cấp trang này NHƯNG đừng vội gõ vào đấy :))) xem source trước sẽ hay hơn:
Phân tích code thôi:
- Đây chỉ là một form login bình thường.
- Nhưng hãy để ý vào property action trong thẻ form, khi thực hiện nhấn nút thì lập tức nó sẽ tự redirect vào chính url "login.php".
Vậy lỗ hổng ở đâu??? :)))
Từ từ, request redirect được gửi bằng phương thức HTTP POST. Ta có thể can thiệp một xíu vào request này, nó vẫn sẽ redirect nhưng sẽ sai sai một xíu. Mình sẽ gửi lại cái request đấy và sửa lại một tí:
Mình sẽ xoá đi phần đuôi "login.php" sau POST, rồi thêm vào 1 Header Location: login.php. Như vậy nó sẽ vẫn redirect đến "login.php" nhưng sai đi một xíu, để đánh lạc hướng PHP để nó có thể gửi nhiều thông tin hơn.
BOOM!!! FLAG IS APPEARED!!!
0x07. HTTP - Verb Tampering
Với bài này: http://tiny.cc/http_vt
Đầu tiên, khoan hãy lao đầu vào "ngấu nghiến" cái web :)))
Slow it down :v
Time to Google Search: đầu tiên phải hiểu cái tựa bài đã "Verb Tampering" nghĩa là "Động từ giả". Ý nó nói đây là gì??? Hãy nhìn vào các methods của HTTP Request, ta thấy gì đây:
Đúng rồi đấy, method phổ biến nhất chính là GET với POST. Còn các methods khác hay không??? có, tổng cộng có 9 methods:
- GET: được sử dụng để lấy thông tin từ sever theo URI đã cung cấp.
- HEAD: giống với GET nhưng response trả về không có body, chỉ có header
- POST: gửi thông tin tới server thông qua các biểu mẫu http( đăng kí chả hạn..)
- PUT: ghi đè tất cả thông tin của đối tượng với những gì được gửi lên
- PATCH: ghi đè các thông tin được thay đổi của đối tượng
- DELETE: xóa tài nguyên trên server.
- CONNECT: thiết lập một kết nối tới server theo URI.
- OPTIONS: mô tả các tùy chọn giao tiếp cho resource.
- TRACE: thực hiện một bài test loop - back theo đường dẫn đến resource.
- method: GET
- 1 Header Authorization: Basic YWFhOmFhYQ==
- Basic: nó là loại thông thường và nó sẽ truyền username và password theo kiểu như sau: tạo 1 string "user:pass" (VD: "aaa:aaa"), rồi sẽ encode string này theo chuẩn Base64 (VD: Base64("aaa:aaa") -> "YWFhOmFhYQ=="). Vì thế mà loại này rất dễ bị catch và decode.
- Digest: nó sẽ encrypt username và password theo hàm hash (MD5, SHA-1, 256, 384,...). Hơn nữa, nó thêm vào một số var chứa các giá trị hash để đối chứng với server. Do đó nó được cho khá là an toàn so với Basic.
Giờ bắt đầu vào bài thôi :)))
Vào hiện lên ngay 1 box Authenticate để request vào trang web, nhập thử một username và password ngẫu nhiên xem thử:
Sau khi nhập xong là biết sai cmnr :)))
Nên là tắt cái box đấy đi, thì nhận được cái thông báo từ server:
Giờ đi đến với cái HTTP request xem thử:
Ta có
Khoan, hãy nhìn lại ở phần trên, phần methods ấy, hãy thử đổi method của request xem sao :))
Đầu tiên, mình thử đổi qua method POST nhung nó vẫn vậy. Vậy thử với một thằng khác xem nhỉ, thay thử method OPTIONS:
BOOM!!! FLAG IS APPEARED!!! :D
0x08. HTTP - Cookies
Với bài này: http://tiny.cc/http_cookies
Khi truy cập vào trang web và nhận được trang web:
Gõ thử cái email bất kì hay bất kì cái gì vào thử hehe
Nhấn rồi ta nhận được 1 cái thông báo là "email saved".
Tiếp đến thử vào "Saved email adresses", và ta nhận được:
Đúng thế, mình cần quyền admin để access vào đấy.
Bật Source xem thử nào:
Hehe, ta có 2 key ở đây:
- Dòng là gì đây??? Đây chính là hàm setcookie của PHP. Nhưng nó đang đặt ở trong comment code.
- 1 Query String "?c=visiteur" này là gì??? nó chính là là HTTP request set cookie.
Giờ thử qua sửa "?c=visiteur" -> "?c=admin" thử xem sao nhỉ, và nhận được thống báo này:
Giờ sao nhỉ??? Hết rồi sao???
Khoan còn 1 thứ chưa phân tích, HTTP Reponse:
Focus vào Header Cookie: ch7=visiteur
Giờ qua console gõ thử lên set cookie của javascript qua "admin" xem sao nhỉ:
Thử F5 lại trang xem nhì :33333
BOOM!!! FLAG IS APPEARED!!!
0x09. Kết bài
Exploit HTTP là bài học cơ bản nhất trên con đường pentest. Còn nhiều dạng khác nữa...
Contact me: Facebook
Comments
Post a Comment