XSS: Chèn script vào HTML để chạy trên website - quan1997ap/angular-app-note GitHub Wiki

Có 2 loại

  • 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')">

Kết luận

1. Không sử dụng các cách sau để thêm 1 chuỗi chưa được xử lý. Nếu muốn hiển thị có thể đọc phần 2.

  • 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;

2. Không sử dụng các lib sau

bootstrap 4.3.1 moment.js 2.9.0, 2.22.2 fontawesome 5.3.1

3. Không nên sử dụng bất kì 1 một hình thức nào để insert chuỗi chưa xử lý tag HTML

Để đảm bảo ATTT thì không được phép sử dụng sanitizer.bypassSecurityTrustUrl

Một số hàm mới

  • 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);
}

⚠️ **GitHub.com Fallback** ⚠️