Xin chào mọi người, chắc hẳn trong ngành Pentest này, ai cũng đã từng trải qua cảm giác lần đầu tìm được bug ở 1 trang web ngoài thực tiễn. Có lẽ đối với từng người sẽ là từng loại bug khác nhau, có thể bug to hoặc cũng có thể là bug không lớn lắm :), nhưng có lẽ tất cả đều có chung một cảm giác sau khi hoàn thành lần đầu đó, cái cảm giác sung sướng, thỏa mãn vì đã chinh phục được thứ thèm khát bấy lâu :D hehe. Là một newbie, em cũng vừa được tận hưởng cảm giác ấy, và giờ đây em khao khát muốn chia sẻ câu chuyện lần đầu của mình với mọi người. Hi vọng mọi người có đọc có thể thấy hay và thú vị :3.
Trong một lần tìm đọc báo về BLV Trương Anh Ngọc (người Ý (đất nước không được dự World Cup 2022)) thì tôi vô tình tìm được bug :D
Vừa vào trang web, đập vào mắt là 1 ô tìm kiếm, sẵn vừa được train XSS, tôi lập tức quên việc đọc báo mà quay sang test lỗi luôn :v
Thử nhập “boyqb2212”, rõ ràng lúc này trang web hiển thị “BOYQB2212” lại trên trang web, lúc này đầu tôi lập tức nghĩ rằng có thể nó bị lỗi Reflected XSS, vậy thì thử thôi :V
Payload để thoát khỏi cặp thẻ <h1>
là: </h1><h6>boyqb2212</h6>
Cứ tưởng là dễ ăn nhưng lại bị tát thẳng vào mặt, ở đây rõ ràng là ta không thể thoát được khỏi cặp thẻ <h1>
, lý do là vì web đã thực hiện phòng chống XSS là mã hóa HTML
Nhưng liệu lúc này untrustdata mà mình nhập vào có thật là chỉ xuất hiện ở chỗ đó không???
Đúng rồi, là chỗ đó đấy :D (phải mất khá lâu quan sát tôi mới để ý thấy)
Các ký tự như < >
hoàn toàn không bị mã hóa HTML, thực hiện thử payload thôi: </title><h6>boyqb2212</h6>
Lúc này đã thoát được thẻ <title>
và chèn được thẻ <h6>
vào web
Tiếp đến thử chèn một số thẻ có thể đưa vào các event JS, sau một hồi thử một số thẻ, thì tôi nhận ra nó cho phép thẻ <img>
Tiếp theo chỉ cần chèn các event vào để thực thi JS là xong rồi, payload: <img src=0 onerror=alert()>
Rất tiếc là đã bị chặn, nhưng vì lúc đầu đã bị ăn 1 tát vào mặt, nên lúc này không gì có thể đánh bại tôi nữa, không được event này thì ta thử tất cả event :D Tôi bắt đầu lấy tất cả các event của JS ở đây (https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
Rất tiếc là nó thực hiện chặn hết =))
Sau một hồi đâm đầu vào chỉ biết thử và thử, lúc này tôi dừng lại, và nghĩ liệu rằng cách trang web này nó thực hiện phòng chống XSS như thế nào???
Có phải là thẻ <img> nó vẫn cho qua, chỉ khi mình thêm event vào nó mới chặn không, và nếu để ý kỹ thì tất cả event đều bắt đầu bằng on
. Lúc này đầu tôi mới chợt nảy ra câu hỏi: "Sẽ ra sao nếu mình đưa vào 1 string bắt đầu bằng on
nhưng nó lại không phải là 1 event của JS, ví dụ như onlyfan=alert()
:D". (Xin lỗi anh em vì đã giật tít =)))))) )
Hehe, lúc này t mới đặt tiếp giả thiết, có thể web này nó chỉ check string bắt đầu bằng on
đầu tiên có phải event không, nếu không thì nó cho cả payload đi qua, và vì vậy mình có thể chèn 1 event phía sau, payload: </title><img src=0 onlyfan=1 onerror=alert()>
, và BOOMMMMMM :D
Cảm ơn vì mọi người đã đọc đến đây, hi vọng chúng ta sẽ gặp lại nhau trong một dịp khác :3.