XSS: Chèn script vào HTML để chạy trên website - quan1997ap/angular-app-note GitHub Wiki
- Reflect XSS
- Store XSS
Chèn mã độc vào các thẻ như:
- Thẻ A , a :
- Thẻ SCRIPT,script:
- Thẻ img , IMG :
<img onError="alert('Hi')" src="anything">
- Thẻ AUDIO, audio :
<audio src="nosource" onerror="alert('data stolen')">
-
Element.innerHTML =
< a href="#">link </a>
. -
Selector.append (
< a href="#">link </a>
). -
ComponentVar.nativeElement.innerHTML =
< a href="#">link </a>
.
Vì nó sẽ chỉlàm sạch các script tag trước khi đưa lên hiện thị. Người khác có thể tận dụng để chèn js vào. VD
<img onError="alert('Hi')" src="anything">
Khắc phục:
- Dùng {{ templateVar }}
- Convert string trước khi đưa vào element bằng cách
html = sanitizeHTML( `html string`, {options} ).
Chú ý: allowedTags: [], allowedAttributes: []
const replyBody = sanitizeHtml(`
<a href="#" class="anchor-username"><h4 class="media-heading">` + username + `</h4></a>
<p>` + this.reply.text + `</p>`, {
allowedTags: [],
allowedAttributes: []
});
lastElement.innerHTML = replyBody;
bootstrap 4.3.1 moment.js 2.9.0, 2.22.2 fontawesome 5.3.1
Để đảm bảo ATTT thì không được phép sử dụng sanitizer.bypassSecurityTrustUrl
- sanitizer: DomSanitizer để báo cho Angular biết nó đáng tin cậy. Tuy nhiên có 1 khác biệt cần chú ý. Với 1 chuỗi HTML như hình
content = `<button
(click)="onClick()">
This is a Clickable span
</button>`;
Trường hợp không sử dụng DomSanitizer, thì khi hiển thị, Angular sẽ không nhận biết đó là 1 button. Mà chỉ coi là 1 đoạn text để hiển thị.
Trường hợp sử dụng DomSanitizer thì khi hiển thị sẽ Angular sẽ biết nó là 1 button. Tuy nhiên event đi kèm sẽ không hoạt động. Angular sẽ lược bỏ tất cả các thành phần không phải HTML tag
constructor(private sanitizer: DomSanitizer) {
// javascript: URLs sẽ là nguy hiểm nếu như bị kẻ tấn công kiểm soát
// Angular sẽ khử độc chúng trong data binding, nhưng bạn có thể
// nói cho Angular rằng bạn tin tưởng chúng:
this.dangerousUrl = 'javascript:alert("Hi there")';
this.trustedUrl = sanitizer.bypassSecurityTrustUrl(this.dangerousUrl);
}