Spider-Scents: Novel Database-Aware Scanning for Stored XSS 논문 리뷰

김윤지·2025년 10월 1일

WEB2논문

목록 보기
1/2

요즘 Wordpress 플러그인을 대상으로 취약점을 찾는 도중.. XSS취약점은 HTML 이스케이프 처리를 안 해서 발생하는 경우가 많다는 것을 알게 되었다.
esc_html, esc_attr 같은 이스케이프 함수가 있어도 이를 우회하는 방법이 있지 않을까? 라는 의문이 생겼다. 의문을 해소하기 위해 논문 리뷰를 시작하였다.

논문 정보

Title :Spider-Scents: Novel Database-Aware Scanning for Stored XSS
학회: USENIX Security 2024
핵심 내용: 웹 애플리케이션에 XSS 페이로드를 주입하는 어려움을 완전히 우회하기 위해 XSS 페이로드를 데이터베이스에 직접 주입하는 새로운 방향의 접근법을 제시한다.

나만의 목표🚩

다음과 같은 목표를 세웠다!

Spider-Scents 사용하기 및 이 tool이 XSS 취약점을 찾는 방식을 사용해서 수동으로 취약점 찾아서 제보하기
였지만..
내 로컬 wp의 db 이름은 rewp인데 스캐너가 이걸 찾지 못 했고, 시도할 때마다 db가 망가진다..

Abstrack

XSS 페이로드를 데이터베이스에 직접 삽입함으로써 웹 애플리케이션에 XSS 페이로드를 삽입하는 어려움을 완전히 우회할 수 있다는 새로운 방향에서 이 문제에 접근한다.

*-box 한계점

1. Wihte - box: 정적 분석이 점점 더 복잡해지고 동적인 클라이언트 측, DB 및 서버 측 동장의 결합된 상호 작용을 정확하게 모델링하기 어려워짐. 또한 아티팩트의 가용성에 따라 달라지므로 사용이 제한 됨
2. Black - box: 서버 측 상태 모델링, 데이터 흐름 추적 및 퍼징 페이로드 등 다양하게 개발 되었음. 그러나 Stored XSS 못 찾는 경우 많음;
3. Gray - box: white + black 인데 white-box의 한계가 여기서도 드러남

스캐너가 stored xss를 더 쉽게 찾을 수 있도록 하는 것. 이를 위해 기존의 black-box 스캐너에 DB에 대한 접근 권한을 부여하고, 실행 중인 웹 애플리케이션에서 삽입된 페이로드를 출력하는 민강한 싱크를 스캔하는 동안 DB에 페이로드 삽입할 수 있게 함

Spider-Scents란

데이터베이스 값을 웹 애플리케이션에 매핑하고 보호되지 않은 출력을 자동으로 찾는다. Stored XSS를 위한 새로운 grey-box 데이터베이스 인식 스캐닝 방법이다.
Spider-Scents는 페이로드를 데이터베이스에 직접 삽입하고 데이터베이스 콘텐츠가 적절한 삭제 없이 HTML 출력에 사용되는 위치를 보고하며, 이를 보호되지 않은 출력이라고 표시한다.

등장개념

  1. 보호되지 않은 출력 (Unprotected Output)
// 데이터베이스에서 데이터 읽기
$user_bio = $db->query("SELECT bio FROM users WHERE id=1");
// ❌ 출력 시 sanitization/escaping 없음
echo "<div>" . $user_bio . "</div>";  // 위험!
  1. Code smell: 코드가 지금 당장은 작동하지만, 미래에 문제가 될 가능성이 높은 패턴
// 현재 상황 - 겉보기엔 안전
function save_comment($text) {
    // 입력 시 sanitization
    $clean = strip_tags($text);  // HTML 태그 제거
    $db->insert("comments", $clean);
}
function show_comments() {
    $comments = $db->get_all_comments();
    foreach($comments as $comment) {
        echo $comment;  // ← 코드 스멜! (출력 시 sanitization 없음)
    }
}

code smell 같은 경우는 개발자가 새로운 REST API를 추가했을때 이 API를 통해 XSS 삽입이 가능해지는 예가 있다. Spider-Scents가 발견하는 것은 즉시 악용 가능한 XSS, 현재는 안전하지만 나중에 위험할 수도 있는 부분이다.

Spider-Scents가 발견하는 XSS

1. Fully-exploitable stored XSS
다른 스캐너들이 찾지 못하는 Stored XSS이다. 입력 폼(Attack vector)를 찾기 어려운데 데이터베이스의 출력은 쉽게 발견 가능하다.
Wordpress plugin을 예로 들면 Wordpress는 users 테이블에서 both url과 display_name을 보호하지 않는다고 할 때 취약한 플러그인 설치 시 악용 할 수 있게 된다.

그 외에도 Self-XSS, Dormant vulnerabilities(휴면 취약점)이 있는데 이것들은 영향력이 큰 취약점이 아니라고 판단해서 넘어가겠다.

웹 애플리케이션 준비


그림의 1 단계이다. 데이터베이스 스캐닝을 위한 웹 애플리케이션을 준비한다.
전체 데이터베이스로 애플리케이션 스캔을 진행하면 좋겠지만 여러 테이블에 걸친 XSS 취약 워크플로우 발견을 위해 각 테이블에 데이터가 필요하다는 문제가 있다.
이를 해결하기 위해 빈 데이터베이스 테이블에 일정한 수의 행을 삽입한다.

이제 Spider-Scents가 앞서 진행(행 삽입)한 수정 과정을 주기적으로 되돌린다.

error ← updateRow(oldData)
if error then
    removeRow(newData)
    insertRow(oldData)
end if

removeRow와 updateRow는 키나 값으로 행 식별이 가능하다.

이제 웹 애플리케이션이 스캔 가능한 상태인지 확인한다. 즉, 웹에 로그인 해본다.

Spider-Scents의 로그인 과정
1. 자격 증명 제공: 사용자명, 비밀번호, 로그인 페이지에 제공한다.
2. Selenium을 통한 상호작용
3. 자격 증명 제공 후 정보 수집(쿠키, 사용자 에이전트 등)
4. 클라이언트 세부정보 재사용

이제 각 데이터베이스 셀에 대해 XSS페이로드에 적합한지 확인한다. 적합한 조건은
1. text 필드인지
2. 페이로드를 수용할 수 있는 길이인지
이때 민감한 셀이 있을 수도 있으니 이 셀들은 피해야 한다.피하는 알고리즘은 다음과 같다.

i ← 1
while i ≤ rows do
    row ← retrieve(i)
    error ← delete(i)
    if error then
        sensitive(row)
    end if
    crawl()
    error ← insert(row)
    if error then
        sensitive(row)
    end if
    i ← i + 1
end while

테이블의 각 행을 삭제하며 조사한다. 삭제했을 때 오류가 발생하면 민감하다고 마킹한다. 삽입 했을 때도 오류 생기는지 확인하고 마찬가지로 오류가 생기면 민감하다고 마킹한다.

셀을 선택하는 조건은 더 있다. 균일한 유형의 행을 가진 테이블이다. 이 반대는 Key-value 데이터를 저장하는 테이블이 있다. 이럴 때는 테이블의 모든 행을 반복해야 한다.

spider-scents가 건들인 걸 되돌리는 과정과 웹에 로그인이 가능한지, 페이로드 넣기에 적합한 셀까지 찾았다. 이제 페이로드를 삽입하는 방식이다!!

Spider-Scents는 계속 언급했지만.. 데이터베이스 셀에 직접 페이로드를 삽입한다. (위의 그림에서 3번) 셀을 정하면 페이로드에 사용한 고유 ID를 생성한다.
예시 페이로드

"'><script>xss(ID)</script>

ID는 고유 생성 ID로 대체한다.

Spider-Scents는 셀에 저장된 개별 데이터가 데이터베이스 입력과 1:1로 대응한다는 것을 가정하고 페이로드를 때린다. 또한 데이터가 여러 셀로 분할되거나 단일 셀 내에서 결합되지 않는다고 가정한다.

Spider-Scents는 페이로드를 삽입했을 때 웹에 치명적 영향을 미치면 중단한다. 근데 이렇게 되면 Wordpress 같은 CMS에서 도메인을 XSS 페이로드로 변경 시에 모든 링크를 재작성해야 한다.

i ← 1
broken ← 0
while i ≤ length(urls) do
    current ← request(urls[i])
    broken_url ← request(urls[i])
    if broken_url then
        broken ← broken + 1
    end if
    i ← i + 1
end while
if broken/length(urls) ≥ threshold then return broken
end if

중단을 결정하는 알고리즘이다. URL 목록은 순회하고 페이지가 깨졌는지 확인한다.

이 연구에서는 Reflection Scanning도 진행한다. 사진애서 5번 과정이다. 이 과정에서는 발견한 모든 ID를 보고하고 실행된(성공한) 페이로드와 실패한 페이로드를 구분하고 실패한전 더이상 시도하지 않는다.

정리

Spider-Scents는 데이터베이스에 페이로드를 직접 넣는 grey-box 스캐너다!
Knot을 적절한 지점에서 절단해버린다. 블랙박스는 사용자 입력부터 시작하면 Spider-Scents는 사용자 입력 다음부터 시작하는 것을 의미!

Knot이란
knot property는 웹 애플리케이션 보안에서 입력 데이터가 여러 계층과 구성 요소를 통과하면서 복잡하게 얽히는 (knot)현상을 의미한다.
Spider-Scnets는 데이터베이스에 직접 접근을 해서 우회한다!

profile
지존해커

0개의 댓글