
DOM(Document Object Model) : HTML의 문법은 태그의 집합으로 구성되어 있고 이러한 태그들은 사진과 같이 트리 구조로 객체가 형성되는데 이러한 트리 구조 집합을 DOM 구조라고 한다.
DOM 구조에 접근하기 위해서는 JavaScript와 같은 스크립트 언어를 사용해야 DOM 구조에 접근할 수 있다.ex ) Document.write, Document.cookie 등
출처: https://maker5587.tistory.com/57 [Maker's security:티스토리]
DOM 기반 XSS(DOM-based Cross-Site Scripting)는 클라이언트 사이드에서 발생하는 XSS 취약점의 한 종류입니다. 일반적인 XSS와는 달리, DOM 기반 XSS는 서버 측에서 발생하는 것이 아니라, 브라우저에서 실행되는 JavaScript 코드에 의해 발생합니다. 이 취약점은 웹 애플리케이션의 클라이언트 측 코드가 신뢰할 수 없는 데이터를 처리할 때 발생할 수 있습니다.
- 클라이언트 사이드에서 실행
- 브라우저에서 실행되는 JS 코드에 의해 발생
- 클라이언트 측 코드가 신뢰할 수 없는 데이터를 처리할 때 발생

if (document.location.href.indexOf("default=") >= 0) {
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
document.write("<option value='' disabled='disabled'>----</option>");
}
document.write("<option value='English'>English</option>");
document.write("<option value='French'>French</option>");
document.write("<option value='Spanish'>Spanish</option>");
document.write("<option value='German'>German</option>");
이 부분이 중요한 부분이다.
document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
URL의 내용을 추출한 뒤 decode해서 html에 write 해준다.
<script>alert(document.cookie)</script>
다음 명령어를 통해 쿠키 값들을 출력할 수 있다.


stripos($default, "<script"): $default 변수에 script 문자열이 포함되어 있는지 확인합니다.
stripos 함수는 대소문자를 구분하지 않고 문자열을 검색합니다. 만약 <script> 태그가 포함되어 있다면 그 위치를 반환하고, 그렇지 않으면 false를 반환합니다.
<SCRIPT> 대문자로 작성하는 방법과 <sc<script>방식은 필터링이 됩니다.
<form name="XSS" method="GET">
<select name="default">
<script>
if (document.location.href.indexOf("default=") >= 0) {
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
document.write("<option value='' disabled='disabled'>----</option>");
}
document.write("<option value='English'>English</option>");
document.write("<option value='French'>French</option>");
document.write("<option value='Spanish'>Spanish</option>");
document.write("<option value='German'>German</option>");
</script>
</select>
<input type="submit" value="Select" />
</form>
HTML 규격에 따르면 <select> 태그 안에 <img> 태그를 포함할 수 없습니다. <select> 태그는 드롭다운 목록을 생성하기 위한 태그로, 그 안에는 <option> 태그만 포함될 수 있습니다. HTML 표준에 따르면 <option> 태그는 텍스트만 포함할 수 있으며, 이미지나 다른 HTML 요소를 포함할 수 없습니다.
따라서, 코드를 보면 앞에
<select>가 열려있기 때문에</select>로 닫아주고<img src=x onerror="alert(1)">를 사용해야 합니다.
src="x"는 유효한 이미지 경로가 아니므로, 이미지 로딩이 실패합니다.
이미지 로딩 실패 시 onerror 이벤트가 발생하고, 지정된 자바스크립트 코드 alert(1)가 실행됩니다.

</select><img src=x>도 잘 동작합니다.


switch case문으로 해당 값들을 제외하고 다 exit 시키는 것을 확인할 수 있다.
php 코드에서는 #이 주석이기 때문에, 이 값을 통해 서버의 조건문은 우회하고, script 구문을 html에 삽입할 수 있다.
따라서 #<script>alert(document.cookie)</script>와 같은 구문으로 클라이언트 단에서 실행시킬 수 있다.

공격자가 document.cookie를 탈취함으로써 할 수 있는 공격이 무엇일까?
쿠키에 들어있는 PHPSESSID를 통해 무엇을 할 수 있을까?