# XSS (Cross Site Scripting)
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
{% embed url="https://www.stmcyber.com/careers" %}
## 방법론
1. **제어할 수 있는 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)이 HTML에 **반영**되거나 **JS** 코드에서 **사용**되는지 확인합니다.
2. 반영/사용되는 **컨텍스트**를 찾습니다.
3. **반영**된 경우
1. 사용할 수 있는 **기호**를 확인하고, 그에 따라 페이로드를 준비합니다:
1. **원시 HTML**에서:
1. 새 HTML 태그를 만들 수 있습니까?
2. `javascript:` 프로토콜을 지원하는 이벤트 또는 속성을 사용할 수 있습니까?
3. 보호 기능을 우회할 수 있습니까?
4. HTML 콘텐츠가 클라이언트 측 JS 엔진(_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 삽입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다.
5. HTML 태그에서:
1. 원시 HTML 컨텍스트로 이동할 수 있습니까?
2. JS 코드를 실행하기 위해 새 이벤트/속성을 만들 수 있습니까?
3. 갇힌 속성이 JS 실행을 지원합니까?
4. 보호 기능을 우회할 수 있습니까?
3. **JavaScript 코드** 내부에서:
1. ``** 태그 사이에 반영됩니다:
* **``** 태그 사이에 반영되는 경우, 입력이 어떤 종류의 따옴표 내부에 있더라도 ``를 삽입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 구문 분석**한 다음 콘텐츠를 구문 분석하기 때문에 삽입된 `` 태그가 HTML 코드 내에 있는 것을 인식하지 않기 때문에 작동합니다.
* 반영이 **JS 문자열 내부**에 있고 마지막 트릭이 작동하지 않는 경우 문자열을 **탈출**하고 코드를 **실행**하고 JS 코드를 **재구성**해야 합니다(오류가 있으면 실행되지 않을 것입니다:
* `'-alert(1)-'`
* `';-alert(1)//`
* `\';alert(1)//`
* 템플릿 리터럴 내부에 반영되는 경우 `${ ... }` 구문을 사용하여 JS 표현식을 **포함**할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` ``
* **유니코드 인코딩**을 사용하여 **유효한 javascript 코드**를 작성할 수 있습니다:
```javascript
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
```
#### 자바스크립트 호이스팅
자바스크립트 호이스팅은 **사용된 후에 함수, 변수 또는 클래스를 선언할 수 있는 기회를 가리킵니다. 이를 통해 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.**\
**자세한 정보는 다음 페이지를 확인하세요:**
{% content-ref url="js-hoisting.md" %}
[js-hoisting.md](js-hoisting.md)
{% endcontent-ref %}
### 자바스크립트 함수
여러 웹 페이지는 **실행할 함수의 이름을 매개변수로 받는** 엔드포인트를 가지고 있습니다. 일반적으로 볼 수 있는 예시는 `?callback=callbackFunc`와 같습니다.
사용자가 직접 제공한 값이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정**하여 콘솔에서 다음과 같은 오류를 확인하는 것입니다:
![](<../../.gitbook/assets/image (651) (2).png>)
취약하다면, 값으로 **`?callback=alert(1)`**을 보내는 것만으로 **경고를 트리거**할 수 있을 수 있습니다. 그러나 이러한 엔드포인트는 보통 이러한 콘텐츠를 **검증하여 문자, 숫자, 점 및 밑줄만 허용**할 수 있도록 합니다 (**`[\w\._]`**).
그러나 그 제한이 있더라도 여전히 일부 작업을 수행할 수 있습니다. 이는 유효한 문자를 사용하여 DOM의 **모든 요소에 액세스**할 수 있기 때문입니다:
![](<../../.gitbook/assets/image (662).png>)
이를 위한 유용한 함수 몇 가지:
```
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
```
당신은 직접 **Javascript 함수를 트리거**해볼 수도 있습니다: `obj.sales.delOrders`.
그러나 보통 지정된 함수를 실행하는 엔드포인트는 DOM이 그다지 흥미로운 없는 엔드포인트일 것이며, **동일 출처의 다른 페이지**는 더 많은 작업을 수행할 **더 흥미로운 DOM**을 가지고 있을 것입니다.
따라서, **이 취약점을 다른 DOM에서 악용**하기 위해 **동일 출처 방법 실행 (SOME)** 공격이 개발되었습니다:
{% content-ref url="some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md](some-same-origin-method-execution.md)
{% endcontent-ref %}
### DOM
**공격자가 제어하는 데이터**를 **안전하게** 사용하는 **JS 코드**가 있습니다. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다.
{% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md)
{% endcontent-ref %}
### **Universal XSS**
이러한 종류의 XSS는 **어디서든** 발견될 수 있습니다. 이것들은 웹 애플리케이션의 클라이언트 공격뿐만 아니라 **어떤** **컨텍스트**에서도 의존하지 않습니다. 이러한 종류의 **임의의 JavaScript 실행**은 심지어 **RCE**를 얻거나, 클라이언트 및 서버에서 **임의의 파일을 읽는** 등으로 악용될 수 있습니다.\
일부 **예시**:
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
{% endcontent-ref %}
{% content-ref url="../../network-services-pentesting/pentesting-web/electron-desktop-apps/" %}
[electron-desktop-apps](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
{% endcontent-ref %}
## WAF 우회 인코딩 이미지
![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](../../.gitbook/assets/eaubb2ex0aerank.jpg)
## 원시 HTML 내부 삽입
당신의 입력이 **HTML 페이지 내에 반영**되거나 이 문맥에서 HTML 코드를 이스케이프하고 삽입할 수 있는 경우, **첫 번째** 해야 할 일은 `<`를 악용하여 새 태그를 만들 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**하고 HTML이 인코딩되었는지 또는 삭제되었는지 또는 변경 없이 **반영**되는지 확인해보세요. **마지막 경우에만 이 케이스를 악용할 수 있을 것입니다**.\
이 경우에는 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다:
```html