%s, %d, %x에 따라 가변 인수를 처리합니다. 만약 포맷 문자열이 제대로 정의되지 않았거나 외부 입력으로 동적으로 결정된다면 문제가 발생할 수 있습니다.메모리를 직접관리하는 C나 C++같은 저수준의 언어에서 발생하며 php나 python같은 고수준의 언어는 메모리를 자동으로 관리하여 포맷스트링으로 인한 조작이 불가능합니다.
php에서는 printf 함수에 전달되는 인자를 처리할 때 포맷 스트링을 하드코딩된 방식으로 처리합니다. 즉, %s와 같은 포맷 지정자가 코드 내에 명확히 정의되어 있으며, 이를 통해 변수를 안전하게 출력합니다.
파라미터 값에 입력 아래 패턴을 입력후 전송시 에러반응이나 멈추는등 이상반응 확인
패턴1(쓰인 총 바이트 수)
%n%n%n%n%n%n%n%n%n%n%n%n%n%n
| 설명 | |
|---|---|
| 의미 | %n은 포맷 스트링에서 사용되면, 그 위치까지 출력된 문자의 개수를 인수로 전달된 변수에 저장합니다. |
| 예상결과 | 1. 제대로 된 변수가 제공되지 않으면, 메모리의 임의의 위치를 참조하게 됩니다. 이로 인해 프로그램이 메모리 접근 오류로 인해 충돌 할 수 있습니다. |
| 2. 프로그램이 메모리에 잘못된 접근을 시도하면, 오류 없이 조용히 종료되거나 디버깅 메시지가 나타날 수 있습니다. |
패턴2(문자 스트링)
%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s
| 설명 | |
|---|---|
| 의미 | %s는 포맷 스트링에서 문자열을 출력하는 데 사용됩니다. |
| 예상결과 | 1. 프로그램은 스택 또는 다른 메모리 위치에서 해당 위치를 문자열로 간주하고 출력하려고 하기 때문에 메모리의 임의의 위치에 있는 데이터가 문자열로 해석되어 스택에 중요한 정보 등 출력될 수 있습니다. |
| 2. 만약 %s가 가리키는 메모리 주소가 유효하지 않거나 읽을 수 없는 영역을 참조하거나 데이터를 출력하지 못한다면 이상한 문자가 출력되거나 프로그램이 충돌 및 예기치 않게 종료될 수 있습니다. |
패턴3(FormatMessage 함수와 관련)
%1!n!%2!n!%3!n!%4!n!%5!n!%6!n!%7!n!%8!n!%9!n!%10!n!
| 설명 | |
|---|---|
| 의미 | %n: 이 포맷 지정자는 C에서 사용되며, 현재까지 출력된 문자의 개수를 인수로 전달된 변수에 저장합니다. |
| ``` | !n!```: !로 둘러싸인 문자는 그 값의 포맷 타입을 지정하는 데 사용됩니다. |
| 예상결과 | %n은 예상되는 포맷 지정자가 아니기 때문에, 프로그램의 동작이 예상치 못한 결과를 낳을 수 있으며 프로그램이 오류를 발생시키거나 비정상적으로 종료시킬 수도 있습니다.. |
패턴4(FormatMessage 함수와 관련)
%1!s!%2!s!%3!s!%4!s!%5!s!%6!s!%7!s!%8!s!%9!s!%10!s!
| 설명 | |
|---|---|
| 의미 | %1!s! :첫 번째 인수를 문자열로 형식(!s!). |
%2!s!: 두 번째 인수를 문자열로 형식화. | |
| 이와 같은 방식으로 %10!s!까지 열 번째 인수까지 모두 문자열로 형식화하여 출력합니다. | |
| 예상결과 | 여러 문자열 인수를 결합하여 하나의 메시지를 형식화할 때 사용됩니다. 오류를 발생시킬 수 있으며, 프로그램이 비정상적으로 종료되거나 예상치 못한 결과를 반환할 수 있습니다. |
| 설명 | |
|---|---|
| 대상 | 웹어플리케이션 소스코드, 웹 기반 C/S프로그램 |
| 판단기준 | 양호 검증로직이 존재 -> 오류x |
| 취약 검증로직 미흡 -> 오류o | |
| 조치방법 | 웹서버프로그램 업데이트 및 버그를 발생시키는 문자열에 대한 검증로직 구현 |