Codegate 2022 webhacking Baby First Writeup
Description: get the flag
http://3.39.72.134
디렉터리 구조를 보면 먼저 flag가 /flag에 위치한 것을 알 수 있다. flag가 디렉터리에 있으니 SQL Injection을 통해 바로 flag를 출력하는 문제가 아니라는 것을 알 수 있다.
jsp로 이뤄진 파일을 보고 java 문제라고 생각해서 class 파일을 디컴파일 하기로 했다. 디컴파일은 java-decompiler를 사용했다. http://java-decompiler.github.io/
java 정규식
"[a-zA-Z]"; //영문(대소문자) 포함 여부
"[ㄱ-힣]"; //한글 포함 여부
"[0-9]"; //숫자 포함 여부1
"[\\d]"; //숫자 포함 여부2
"[\\s]"; //공백 포함 여부(역슬래쉬는 원표시다)
"[\\w]"; //영문, 숫자, _(언더스코어) 포함 여부
"[^a-zA-Z]"; //영문(대소문자) 미포함 여부
"[^ㄱ-힣]"; //한글 미포함 여부
"[^0-9]"; //숫자 미포함 여부1
"[^\\d]"; //숫자 미포함 여부2
"[^\\s]"; //공백 미포함 여부(역슬래쉬는 원표시다)
"[^\\w]"; //영문, 숫자, _(언더스코어) 미포함 여부
"[a-zA-Z0-9ㄱ-힣]"; //특수문자 포함 여부
"[^a-zA-Z0-9ㄱ-힣]"; //특수문자 미포함 여부
|
코드에서 정규식이 많이 보여서 java정규식 예시를 함께 첨부한다.
private static String lookupImg(String memo) {
Pattern pattern = Pattern.compile("(\\[[^\\]]+\\])");
Matcher matcher = pattern.matcher(memo);
String img = "";
if (matcher.find()) {
img = matcher.group();
} else {
return "";
}
String tmp = img.substring(1, img.length() - 1);
tmp = tmp.trim().toLowerCase();
pattern = Pattern.compile("^[a-z]+:");
matcher = pattern.matcher(tmp);
if (!matcher.find() || matcher.group().startsWith("file"))
return "";
String urlContent = "";
try {
URL url = new URL(tmp);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine = "";
while ((inputLine = in.readLine()) != null)
urlContent = urlContent + inputLine + "\n";
in.close();
} catch (Exception e) {
return "";
}
XSS나 CSRF, CRLS, SSRF 중 하나라고 생각하고 코드를 훑어봤다. 첫 번째 pattern.compile 정규식을 보면 [http://exam.com]와 같이 값을 넣을 수 있었다. 즉 url을 받은 후 image를 파싱 해서 img tag를 넣어준다.
1) Pattern에 compile로 정규식(regEx)을 담고, 2) Matcher에 타겟 스트링(target)을 저장한다. 3) Matcher의 find() 함수는 1번째 값을 찾아낸 후, true or false 반환. 4) group() 함수는 방금 찾은 값의 스트링을 반환. |
이후 두번째 matcher를 검사하는 if문에서 file: 프로토콜로 시작하는지 검사한다. 검사해서 맞으면 공백으로 필터링이 된다. 따라서 "file" regex를 우회해야 한다.
우회하는 방법으로 java.net.URL을 auditing을 해보면 Matches 할 때 url로 시작하면 start에 +4를 해주는 것을 알 수 있다. 따라서 flag의 위치를 +4 위치로 맞춰서 최종 파라미터를 작성해보면 다음과 같다.
[url:file:///flag]
flag가 출력될 것이다. codegate2022{8953bf834fdde34ae51937975c78a895863de1e1}
용어 정리
java.net.URL
java.net.URL 클래스는 URL 주소를 인식하고, 프로토콜, 도메인, 포트, 경로 등을 지정할 수 있다.
URL Connection으로 자바에서 웹사이트에 접근하기 위한 URL 주소를 java.net.URL 클래스로 변경해야 한다.
JPA Auditing
장황하게 설명되어 있는 글을 압축하면 JPA Auditing은 생성일, 수정일, 식별자 등의 필드나 컬럼에 대해 자동으로 시간을 매핑하여 DB 테이블에 넣어주는 기능이다.
JPA
JPA는 자바에서 ORM 기술 표준으로 사용되는 인터페이스의 모음이다. 즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.
ORM(Object-Relational Mapping)
애플리케이션 Class와 관계형 데이터베이스 테이블을 매핑(연결)한다는 것을 의미한다.
참고문헌
Codegate CTF 2022 Preliminary (adragos.ro)
codegate 2022 web(all)/blockchain(nft) write-up :: Is Secure? (tistory.com)
https://webcoding-start.tistory.com/53
'웹해킹 > CTF' 카테고리의 다른 글
Codegate CTF 2022 WEB My Blog Writeup (0) | 2022.11.21 |
---|---|
화이트햇 콘테스트 2022 Web Buffalo[Steal] Writeup (0) | 2022.11.19 |
Codegate 2022 webhacking CAFE Writeup (0) | 2022.11.18 |
NahamCon CTF 2022 Flaskmetal_Alchemist Writeup (0) | 2022.11.14 |
NahamCon CTF 2022 Personel Writeup (0) | 2022.11.12 |