서론
Cross-Site Search (XS-Search) 공격은 공격 대상 오리진에 스크립트를 삽입하거나 해당 페이지를 직접 방문하지 않고, 피해자가 공격자가 의도한 서버에 접속하는 것만으로 SOP를 우회하여 공격 대상 오리진의 비밀정보를 유출할 수 있는 강력한 공격기법이다.
XS-Search
Cross-Site Search (XS-Search)는 쿼리 기반 시스템을 이용해 이용자의 비밀 정보를 유출하는 공격 기법이다.
XS-Search는 부채널 공격의 일종으로 Blind SQl Injection과 비슷한 형태로 공격이 이루어진다.
일반적으로 다른 오리진에 요청을 보내고 응답값을 읽어오는 것은 SOP 정책에 위반되기 때문에 불가능하지만, XS-Search 공격은 SOP 정책을 위반하지 않는 선에서 다른 오리진에 요청을 보내고 요청에 소요된 시간, 응답 코드, 창의 프레임 개수 등의 요소를 활용해 비밀 정보를 유출한다.
secret = "this_is_secret_value"
@app.route('/search')
def search_secret():
query = request.args.get("query", "_")
if secret.startswith(query):
return "OK", 200
else:
return "NO", 404
위의 코드는 XS-Search 공격이 발생할 수 있는 예제 코드이다.
secret 값이 이용자의 비밀 정보일 때, 일반적으로 공격자의 페이지에서 해당 오리진으로 xhr 요청을 보내게 되면 SOP 정책에 의해 응답 값을 받아올 수 없다.
SOP 우회
브라우저는 SOP에 구애 받지 않고 외부 출처에 대한 접근을 허용해주는 경우가 존재하는데, 이미지나 자바스크립트, CSS 등의 리소스를 불러오는 태그는 SOP의 영향을 받지 않는다. => XS-Search는 이러한 태그들을 활용하여 공격한다.
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 태그를 이용해 요청의 응답 코드가 200인지 404인지 구분하는 코드이다.
현재 문서에 script 태그를 생성하고, src 속성을 공격 대상 오리진의 URL로 설정한 후, 로드하는데 성공했는지 실패했는지 여부를 통해 응답 코드가 200인지 404인지 구분할 수 있다.
'웹해킹 > 개념' 카테고리의 다른 글
| SQL Injection 심화(Blind, Error based ...) (0) | 2025.07.03 |
|---|---|
| 웹해킹 개념 복습 (1) | 2025.07.01 |
| [Dreamhack-web] Exploit Tech: Document Object Model Vulnerability (1) | 2024.12.12 |
| [Dreamhack-web] Exploit Tech: Relative Path Overwrite (1) | 2024.12.12 |
| [Dreamhack-web] Exploit Tech: CSS Injection (1) | 2024.12.11 |