Security
SSRF bypass using DNS Rebinding
SSRF bypass using DNS Rebinding
2023.01.041. 들어가기에 앞서 일반적으로 SSRF 공격을 막기 위해 개발자들은 다음과 같은 로직을 구현합니다. 차단할 IP 범위 도메인 이름 확인 (이상한 문자열로 우회하는 공격..) DNS를 이용한 IP 확인 위 과정을 통과하게 되면 사용자가 입력한 URL로 접속하게 됩니다. 이러한 상황을 간단한 코드로 나타내면 다음과 같습니다. const dns = require("dns/promises"); const axios = require("axios"); async function request(url){ const check_domain_name = is_domain_name(url); const check_dns = await dns.resolve4(url); const check_ip = is_blacklis..
nodejs unicode
nodejs unicode
2022.10.061. Intro 기본적인 ASCII 범위를 벗어나 전세계 언어를 표현하기 위해 unicode를 많이 사용합니다. 이로 인해 ASCII로 표현이 불가능 했던 문자를 unicode로 표현이 가능해졌습니다. 이로 인해 예상치 못한 버그가 발생하곤 합니다. 이에 대해 설명하고자 합니다. 2. Compare unicode 사용자는 unicode를 통해 다양한 문자를 입력할 수 있습니다. 서버는 사용자가 입력한 값을 처리하는 과정을 거치겠죠. 예를들어, 사용자가 unicode K 를 입력했다고 가정합시다. 이 값과 ASCII 에서 소문자 k 와 비교하면 당연히 `false`가 출력 되겠죠. "K" == "k" false 하지만, unicode K를 toLowerCase() 함수를 이용하여 소문자로 바꾼 뒤, ASC..
[분석일기] - php switch case
[분석일기] - php switch case
2022.09.061. Intro 얼마전 cake CTF 2022 대회가 있었는데, 일 때문에 주말에는 쉬고 싶어서 참가는 안했네요,,, 암튼 이후 writeup을 봤는데 신기해서 기록하고자 합니다. 2. switch case if else 구문이 지저분한 사람들이 switch case 구문을 좋아하더라구요. 아래처럼 switch case 구문이 있다고 가정해 봅시다. POST방식으로 `user` 정보를 받고 이를 json으로 파싱하고 있습니다. 이후 if 문으로 입력 값을 검증하고 있습니다. 최종적으로는 `user->name` 변수의 값이 admin 이어야 하지만, if문에서 admin 문자열을 필터링 하고 있습니다. 어떻게 하면 이를 bypass 할 수 있을까요? 정답은 switch case 구문에 있습니다. 공식 d..
[분석 일기] - EJS, Server Side Template Injection to RCE (CVE-2022-29078)
[분석 일기] - EJS, Server Side Template Injection to RCE (CVE-2022-29078)
2022.07.21🚪 Intro 2022년 4월달에 nodejs 의 모듈인 EJS에서 RCE 취약점이 발견되었습니다. 맨 아래 Reference 에 있는 링크를 참고하여 어떻게 EJS에서 RCE가 가능한지를 분석해 봤습니다. 취약한 EJS 버전은 `3.1.6` 이하 버전입니다. 해당 취약점은 `3.1.7`에서 패치 되었습니다. 💡Analysis 환경 세팅을 위해 아래와 같은 명령어로 취약한 EJS 버전을 설치해 줍니다. npm install ejs@3.1.6 이후 간단한 코드를 작성하여 서버를 시작해 줍니다. // index.js const express = require("express"); const app = express(); app.set("view engine", "ejs") app.get("/", (req, ..
Node.js querystring 함수 분석과 bug 설명
Node.js querystring 함수 분석과 bug 설명
2022.07.09🚪 Intro 작년 Line 2021 CTF 웹 문제를 풀다가 기록하고 싶어 작성하려고 합니다. 바로 Node.js 에서 built-in 모듈인 `querystring` 입니다. 현재는 deprecated 된 모듈입니다. 💡 About querystring module Node.js 공식 문서에 설명된 `querystring`에 대한 설명은 다음과 같습니다. 기본으로 URL의 query string을 파싱하는데 사용됩니다. 사용방법은 공식문서에 다음과 같이 설명하고 있습니다. `parse()` 함수의 첫번째 인자에 URL의 query string 값을 넘겨줘야 하며, 나머지 인자들은 기본 값으로 설정 됩니다. 예를들어, 아래 사진처럼 `parse()` 함수의 첫번째 인자에 foo=1&abc=2 라는 값을..
분석 일기 - file upload 취약점
분석 일기 - file upload 취약점
2022.05.12🚪 Intro 취약점 및 CVE 획득을 위해 분석하고 있는 프로젝트가 있습니다. file upload를 통한 webshell 획득 과정을 정리하고자 합니다. 💡 Analysis 분석하려는 웹 사이트에는 업로드 기능이 존재 합니다. 다만 ico, webp, svg 확장자만 업로드 할 수 있습니다. 그런데 아래 코드를 보면서 의문점이 생기더라구요. 보통 파일 업로드 관련 기능을 만들 때, 확장자 검증은 .(dot) 을 기준으로 문자열을 나누어 맨 마지막 값을 확장자로 판단 합니다. 이렇게 추출된 확장자로 업로드 할 파일을 필터링 하게 되죠. 하지만, 위 코드는 `strpos()` 함수를 사용하여 업로드 파일의 확장자를 검사하고 있습니다. 이 함수는 문자열의 위치를 int 로 리턴합니다. 예를 들면, 아래와 ..
분석 일기 - php dynamic variable
분석 일기 - php dynamic variable
2022.04.03🚪 Intro 취약점을 찾기 위해 분석하고 있는 오픈소스 웹 서비스가 있습니다. 며칠 동안 삽질을 통해 발견한 취약점(?)을 기록 및 정리하고자 합니다. 💡 Analysis 해당 취약점은 웹 관리자만 접근 가능하며, php dynamic variable 을 통해 다른 변수의 값을 overwrite 하여 Stored XSS를 동작 시킬 수 있습니다. 관리자 페이지에는 아래 사진처럼 어떤 범위를 지정해 줄 수 있습니다. 하지만, 해당 소스 코드를 분석해 본 결과, 숫자 여부를 확인하지 않고 있었습니다. 위 사진에서 100 이라는 값은 아래 사진 56번째 줄인 `$mb_id1_to` 변수에 저장되어 있습니다. 각각의 값을 `$ma_last_option` 변수에 이어 붙이는 것을 볼 수 있습니다. 최종적으로 `..
Foobar CTF 2022 writeup
Foobar CTF 2022 writeup
2022.03.06# Warmup (pwn) 해당 문제는 FSB 를 통해 canary 값과 PIE 값을 leak 한 뒤, ROP로 shell을 획득하는 문제이다. from pwn import * context.log_level = "debug" p = remote("chall.nitdgplug.org","30091") e = ELF("./chall2") l = ELF("./libc.so.6") payload = "AAAAAAAA%20$p%23$p" p.sendlineafter("Can you help find the Canary ?", payload) p.recvline() data = p.recvline().strip()[8:] PIE = int(data[:14], 16) canary = int(data[14:], 16..
nodejs express routing case sensitive options
nodejs express routing case sensitive options
2022.03.06최근 CTF에서 nodejs express 문제가 나왔다. express에서 routing 기능이 있는데, 선택 옵션을 추가할 수 있다는 걸 처음 알았다. express Docs 내용 중, 아래 사진을 보면, Router에 대한 설명을 적어놓았다. 표에서 속성에 `caseSensitive` 라는 옵션이 있고, 만약 추가하지 않는다면 기본값으로 `대소문자를 구문하지 않고, /Foo와 /foo는 같은 경로로 해석한다.` 라고 되어 있다. 그래서 테스트를 위해 다음과 같이 코드를 작성했다. /* app.js */ const express = require("express"); const app = express(); const port = 39012; const test_router = require("./r..
java URL class를 이용한 내부 파일 읽기
java URL class를 이용한 내부 파일 읽기
2022.03.02올해 codegate 2022 웹 문제 중에서 java에 `URL class`를 이용한 SSRF 문제가 나왔다. 아래 코드는 `URL class`를 이용하여 외부 사이트에 요청 및 응답 값을 출력하는 코드 이다. import java.net.URL; import java.net.MalformedURLException; import java.io.InputStreamReader; import java.io.BufferedReader; public class test{ public static void main(String[] args){ String url = "https://lactea.kr"; String result = ""; try { BufferedReader in = new BufferedRea..
format string 을 이용한 php sprintf 버그
format string 을 이용한 php sprintf 버그
2022.02.04오랜만에 CTF에 참가하여 WEB 문제 중, php의 `sprintf()` 함수를 이용한 문제가 있었다. 아래 코드를 보면, SQL `addslashes()` 함수 때문에 SQLI 가 불가능한 것처럼 보이지만, `sprintf()` 함수에서 format string을 이용하면 이를 bypass 할 수 있다. 이를 설명하기 위해 글을 계속 읽어보자. # The John has 500 dollar. 위 코드의 서식 문자를 아래 코드처럼 인자의 순서를 지정할 수 있다. (이는 C언어에서 Format String Bug를 이용한 explit 할 때도 사용된다.) # The John has 500 dollar. 위 예제에서는 코드에 전혀 문제가 없다. 하지만 `sprintf()` 함수를 다음과 같은 사례로 2번 ..
Log4j 취약점(CVE-2021-44228) Log4Shell 발생 원인 및 실습
Log4j 취약점(CVE-2021-44228) Log4Shell 발생 원인 및 실습
2021.12.241. 기초 지식 1.1 Directory Service(DS) 여기서 말하는 Directory는 데이터, 프린터, 컴퓨터, 사용자 정보 등 데이터가 저장된 용기라고 보면 된다. Directory Service는 네트워크 서비스의 일종으로 네트워크 자원(사용자 계정, 프린트 정보, 컴퓨터 정보 등)에 접근하여 관리를 용이하게 하도록 하는 서비스를 말한다. 1.2 Active Directory AD(Active Directory)는 Microsoft에서 개발한 디렉토리 서비스 이다. AD는 다양한 표준화된 프로토콜을 사용하여 다양한 네트워크 관련 서비스를 제공한다. 회사 직원들의 계정 정보(ID, Password)와 컴퓨터에 대한 정보, 그리고 회사에서 강제하고자 하는 정책들(패스워드를 최소 8자리에 30일..