2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

DVWA 실습

2022. 9. 18. 12:10ㆍSK Rookies 9/Application Secure

Brute Force Attack(전수 공격)

영어의 뜻 그대로 무식한 공격을 통해 공격하는 수법으로 모든 경우의 수를 대입하여 찾는 공격이다. 이러한 공격은 대부분의 경우 찾을 수 있다는 장점(한번 지나간 대입으로 이용자가 비밀번호를 바꿀 경우 찾지 못한다.)이 있지만 그 만큼 경우의 수가 증가함에 따라 엄청난 시간을 소요한다는 단점이 있다.

Dictionary Attack(사전 공격)

많이 사용하는 단어를 사전화 하고 그 사전을 이용하여 찾는 공격 방법이다.

login을 시도한 흔적을 볼 수 있다.

그 후에 Request 부분에 우클릭을 하여 send to intruder을 선택한다.

send intruder한 결과

그러면 위 와 같은 결과가 나오는데 우리가 찾고자 하는 것은 password 이므로 password를 제외한 선택된 부분을 Clear해준다. 그 후 미리 사전화 해놓은 txt파일을 불러와서 공격을 시작한다.

사전을 등록한 모습

그러면 사전에 등록된 단어를 기반으로 브루트포스방식으로 계속 넣어서 확인하게 된다. 이때 비밀번호가 맞았는지 여부를 확인하는 방법은 틀렸다 와 맞았다라는 결과를 받을 때 길이가 다르다는 것이다. 그것을 이용해 letmein이 비밀번호 였다는 것을 알 수 있었다.

비밀번호를 찾은 모습

Command Injection

Low

Low Source Code

Medium

Medium Source Code

High

High Source Code

다양한 구분자를 활용하여 공격할 수 있다. 

Medium, High의 경우 코드를 봤을 때 replace()함수를 이용하여 방어하고 있지만 OWASP취약점을 설명시 이러한 방법은 취약점을 극복하는데 있어 적절하지 못한 방법이라고 설명했다. -> replace() 함수 자체는 반복적으로 안나올 때까지 찾아 없애는 것이 아닌 딱 한번의 Cycle만 돌아 제거하기 때문에 "|| ls -al"의 명령어를 입력시 순서에 의존하여 "| "를 먼저 없애고 넘어가버린다

그럴 경우 다시 한번 "| "가 남게 되어 명령이 실행되게 된다

Commend Injection을 활용할 수 있게하는 구분자
앞 명령어가 거짓일 경우 뒷 명령어 실행

위의 방법은 모든 난이도에서 수행된다.

File Upload

파일을 업로드하여 공격할 경우 Web Shell을 업로드한다

DVWA의 파일 업로드 실습하는 공간

Web Shell

Web Shell은 업로드 취약점을 통하여 시스템에 명령을 내릴 수 있는 코드를 말한다. (본래의 목적은 관리자가 SSH, FTP를 이용하지 않고 웹브라우저로 웹서버를 관리하기 위한 도구로 사용하기 위함)

간단한 서버 스크립트(jsp, php, asp 등)로 만드는 방법이 사용되며 이 스크립트들은 웹서버의 취약점을 통해 업로드 된다.

Low (용량 우회)

개발자 도구를 이용하여 코드에 접근하여 용량을 직접 늘릴 수 있다. (Proxy 도구로도 가능)

파일의 용량이 적힌 공간

value부분을 업로드 할 .php파일의 용량보다 높게 바꾼뒤 업로드시 업로드가 된다.

Medium (확장자 우회)

악성 쉘인 b374k-2.8.php 파일을 업로드 할 경우 jpeg, png확장자만 업로드 할 수 있다는 경고 메세지가 출력된다.

이를 우회하기 위해 Proxy도구인 Burp Suite를 이용하여 가로챈다.

가로챈 모습

아래 Content-Type을 image/jpeg로 변경해주고 서버에 보내면 정상 업로드가 된다.

High (확장자 매직넘버 우회)

PNG : 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52

PNG확장자를 헥스 에디터로 열어본 결과

JPG : FF D8 FF E0 00 10 4A 46 49 46 로 시작해서 FF D9로 끝남

앞부분
뒷부분

EXE : 4D 5A   (MZ : Mark Zbicowski) ( # exe의 경우 이 부분이 없으면 윈도우에서 파일 실행 불가)

EXE확장자

이렇게 각자의 고유한 HEX가 있는데 이것을 속이는 것이다.

PHP파일 앞부분에 PNG 고유 HEX를 붙여넣어 속이는 모습

이렇게 각 파일별로 고유한 확장자 매직넘버를 가지고 있는데 이것을 우회하는 방법이다.

(사진 업로드는 나중에)

이렇게 php파일을 png로 변경하고 파일 고유 HEX를 붙여넣어 줌으로써 서버를 속일 수 있게 됐다.

그 후 이 악성 쉘을 다시 php파일로 변경하여 사용하기 위해서는 리눅스 명령어를 사용해야 한다.

우리의 주 목적은 업로드 이니 파일 확장자 변경을 Commend Injection을 활용하여 바꾼다.

; mv  ../../hackable/uploads/b374k-2.8.png    ../../hackable/uploads/b374k-2.8.php

그 후에 URL에 경로를 입력하여 들어가면 된다.

SQL Injection

Low

' or 1=1 #

위 사진과 같이 명령어를 입력 했을 시 공격이 성공한다.

SQL Injection(Blind)

Low

Ch01) DB명 알아내기

다른 방법으로는 substring()함수를 이용하여 한글자씩 알아내어 DB, Table, Column의 이름을 알아내는 방법이 있다.

information_schema에 있는 테이블들

select distinct table_schema from information_schema.columns where table_schema != 'information_schema'Limit 0,1;의 경우 Limit은 0부터 시작하여 (행의 첫번째) 몇개의 행을 출력할 것인지를 정해주는 역할을 한다.

limit을 적용한 모습

이렇게 1개를 출력하여 아래와 같은 방식을 활용해 1개씩 테이블 명을 알아갈 수 있다. 

 

1' and substring((select distinct table_schema from information_schema.columns where table_schema != 'information_schema'Limit 0,1),1,1) = 'a' #

맞았을 경우

이렇게 a-z를 대입하여 맞을 경우 존재한다고 나옴 그렇게 다 알아냈다면 최종 확인을 위해

1' and substring((select distinct table_schema from information_schema.columns where table_schema != 'information_schema'Limit 0,1),1,4) = 'dvwa' #

(# table_schema != 'information_schema 이것을 넣은 이유는 찾아낼 필요가 없기 때문에 제외를 한 것이다.)

이 구문을 injection 해보자 그럼 위 그림과 같은 동일한 결과가 나올 것이다.

 

( # 길이알아내는 법 : 1' and length(database())=4 # )

이러한 방법을 사용하여 DB이름의 길이를 알 수 있다. 길이가 맞을 경우 위 사진과 같은 동일한 결과가 나온다.)

 

Ch02) Table명 알아내기

위와 비슷한 방법으로 찾아낸다.

찾아낸 dvwa DB안에 있는 Table들
limit 적용 후 결과

 

우리가 알아내고 싶은 Table은 중요한 정보가 담긴 users Table이다. 하지만 limit을 적용 했을 시 guestbook이 나오는데 해커 입장에서는 하나씩 다 알아내야 한다.

만약 알아내고 이제 users Table을 알아낼 차례라고 생각해보면

1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 1,1),1,1) = 'u' #

Limit을 0에서 1로 늘려주어 다음 행의 Table명을 가지고 온 후 다시 찾아본다.

 

Ch03) Column명 알아내기

알아내는 법은 위와 비슷하다

찾아낸 dvwa DB 안 users Table 안 Column들
limit 한 결과

차례대로 찾아보다가 중요한 정보가 담긴 password Column을 찾아 낼 차례라고 생각해보자.

1' and substring((select column_name from information_schema.columns where table_name='users' limit 4,1),1,8) = 'password' #

(이러한 방법을 사람이 계속 하기에는 부담이 되기 때문에 kali linux를 활용하여 자동으로 찾아 낼 수 있다. - kali편)

XSS(Reflected : 사용자가 입력한 값을 그대로 보여주는 기능이 있는 사이트의 경우)

Low

명령어 입력시 바로 공격 성공

<script> alert("Sk_Shielders") </script>

Medium

한번만 검사하는 replace()함수 특징을 이용하여 중간에 스크립트를 더 넣는 방식으로 공격

혹은 태그 속성을 이용하여 <script >와 같이 띄워쓰기만 해줘도 됨

<SCRIPT>alert('hinamnor')</script>                     // 소문자 script 필터링하기 때문에 대문자로 변경

<Script>alert('hinamnor')</script>

<ScRiPt>alert('hinamnor')</script>                      // 대소문자 섞어서 사용하기

<script img=x>alert('hinamnor')</script>             // 불필요한 속성을 추가

<script  >alert('hinamnor')</script>                    // 태그는 속성을 추가할 있기 때문에 공백이 구분자 역할을

<scr<script>ipt>alert('hinamnor')</script>           // 스크립트 태그를 중첩해서 사용하는 방법

Medium Source Code
<scr<script>ipt> alert("Sk_Shielders") </script>

High

"

<img src = "" onerror=alert("SK_Shielders")>" 와 같이 script가 아닌 다른 태그를 활용하여 공격

High Source Code

XSS(Stored : 사용자가 입력한 값을 DB에 저장했다가 방문자의 웹 브라우저에서 동작하는 기능이 있는 사이트의 경우)

게시판 같이 등록하는 곳

위와 동일한 소스코드를 가지고 있어 위와 동일하게 사용

Low

바로 실행됨

Medium

Medium Source Code

Medium의 소스코드를 보면 메세지 부분은 3중 보안 처리를 한 모습이 보이고 이름 부분은 그냥 replace()함수를 이용하여 보안 처리를 했다. 이에 공격 구문을 메세지 부분이 아닌 이름부분에 하면된다. -> 이름부분의 경우 길이가 제한되어 있으므로 개발자 도구로 이를 우회한다.

maxlength 수정

High

Reflected부분과 동일하다 다른 태그를 사용하여 공격

'SK Rookies 9 > Application Secure' 카테고리의 다른 글

Backdoor & Reverse  (0) 2022.09.18
난독화  (0) 2022.09.18
Kali Linux 실습  (0) 2022.09.18
BeeBox 실습  (0) 2022.09.18
OWASP Top 10 (2021)  (0) 2022.09.17