포멧 스트링(Format String) 취약점은 외부로부터 입력된 값을 검증하지 않고, 입출력 함수의 형식(포맷 스트링)을 그대로 사용하는 경우에 발생되는 문제를 의미 합니다.
해당 취약점은 예전에 비해서 만나기 어려운 것이 웹서버(Web Application Server)의 버전이 높아짐에 따라 이러한 문제는 자연스럽게 해결 할 수 있습니다.
웹서버에 대한 아래 공격유형을 살펴보겠습니다.
//#패턴1 (name이라는 변수에 %n값을 넣은 경우)
https://주소?name=%n%n%n%n%n%n%n%n%n
//#패턴2 (name이라는 변수에 %s값을 넣은 경우)
https://주소?name=%s%s%s%s%s%s
해당 패턴을 통해서 웹서버가 오류나 또는 문제를 일으킨 다면 해당 값에 대한 유효성 검증을 반드시 하여야 합니다.
아래 네이버 사이트에서 위 패턴을 대입하였을때 나타나는 모습입니다.
대기업 답게 아무런 문제나 오류가 나타나지 않습니다.
해당 취약점 공격은, 메모리 내용을 확인(%x) 및 원하는 위치(RET 영역) 이동을 하거나 특정 결과 값을 악성 코드 주소로 변조(%n)하여 임의 코드를 실행 할 수 있습니다.
#방법1
웹 취약점인 포멧 스트링(Format String) 취약점에 대해서 대비하는 가장 쉬운 방법은 웹서버(web application server)의 버전을 낮은 버전이 아니라 상위버전으로 올리는 것이 해결하기 가장 쉬우면서 가장 간단합니다.
예) 가장 대표적인 Java 웹서버(web application server) : 톰캣 4.0 -> 톰캣 9.5
#방법2
또한 버전을 높여서 사용 할 수가 없다면, 파라미터에 대해서 유효성 검증을 추가하여아 합니다.
아래 코드는 아주 간단하게 만든 예시 입니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WebSecurity {
public static void main(String[] args) {
String StringArg = "%s%s%s"; //사용자로 부터 받은 변수
Pattern pattern = Pattern.compile("%");
Matcher match = pattern.matcher(StringArg);
if(match.find()) { //존재여부 확인
System.out.println("%s 패턴이 존재 합니다.");
//존재하면 아래 치환 또는 throw
}
}
}
위 코드처럼 사용자로부터 받은 값에 악성 패턴이 존재하는지 검증하는 기능을 붙여야 할 것 입니다.
아래는 패턴을 정리한 표 입니다.
값 | 형식 |
%d | 10진수 정수 출력 |
%f | 실수 출력 |
%c | 문자 출력 |
%s | 문자열 출력 |
%x | 16진수 출력 |
%n | 이전까지 출력한 총 바이트를 지정한 변수에 저장 |
이상으로 웹 표준 취약점 중 한가지인 포멧 스트링(Format String) 취약점에 대해서 살펴 보았습니다.
궁금한점 또는 틀린 부분은 언제든 연락주세요! 👻
'웹 취약점(Web vulnerability)' 카테고리의 다른 글
6. SSI 인젝션(Server Side Include) (0) | 2021.11.29 |
---|---|
5. SQL 인젝션(OS Command Execution) (0) | 2021.11.29 |
4. 운영체제 명령실행(OS Command Execution) (0) | 2021.11.29 |
3. LDAP 인젝션(Lightweight Directory Access Protocol) (2) | 2021.11.29 |
1. 버퍼 오버플로우(Buffer Overflow) (0) | 2021.11.29 |
댓글