PHP & DATABASE 원리

 

데이터베이스가 갖는 '데이터를 효율적으로 관리할 수 있다'라는 장점과 이 갖는 '접근성'이라는 장점.

PHP의 '미들웨어'적 장점 등 이렇게 웹 서버, PHP, 데이터베이스 각각의 장점에 따라 역할을 분담하게 되는 것이다.

(PHP는 웹이라는 부품과 MySQL이라는 데이터베이스 부품을 붙이는 본드같은 기능을 한다.

따라서 이를 미들웨어 라고도 부른다.)

 

여기서 PHP는 웹 서버의 서버로서 동작하고, MySQL의 클라이언트로서 동작하고 있다는 것을 기억해야 한다.

 

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
form과 GET, POST  (0) 2021.01.29
PHP 문법 기초  (0) 2021.01.28
PHP의 이해  (0) 2021.01.28

MySQL

:: 세계에서 가장 많이 쓰이는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS).

:: 데이터베이스를 관리하거나 자료를 관리하기 위한 GUI 관리툴은 내장되어 있지 않고 오로지 명령어로만 동작

따라서 MySQL 프론트엔드 데스크톱 소프트웨어나 웹 애플리케이션을 사용해야 함

MySQL Workbench : 공식적 MySQL 프론트엔드 툴

MySQL과 같은 관계형 데이터베이스의 중요한 특징은 스프레드시트와 마찬가지로 데이터를 표의 형태로 표현해준다. 

 

 

MySQL의 구조

- 표(table)에 저장됨 -> 표가 늘어남 -> 정리정돈(디렉토리)의 필요성 증대

- 스키마? 서로 연관된 표들을 서로 그룹핑할 때 사용하는 일종의 폴더.

- 스키마들이 모인 것 = 데이터베이스 서버(database server)

데이터베이스 서버> 데이터베이스(스키마)> 표(table)

 

효용 

1. 보안 (자체적 보안 체계를 가지고 있어 안전한 보관 가능)

2. 권한 (다양한 사용자들이 관리할 수 있음 + 차등적 권한을 줄 수 있음)

 

SQL

(Structed Query Language)

:: 데이터를 관리하기 위한 쿼리 언어

:: 데이터베이스 종류와 상관 없이 모든 데이터베이스는 SQL을 통해서만 관리가 가능함

:: 기본적으로는 ANSI 표준이며 데이터베이스 회사별로 조금씩 차이가 있음

 

 

그리고 다양한 MySQL 명령들

(※ 주의 : 공부한 것을 까먹지 않도록 간단하게 적어놓은 것이므로 설명 등이 매우 부실함)

 

1. 데이터베이스 생성

CREATE DATABASE 데이터베이스명;

2. 데이터베이스 목록보기

SHOW databases;

3. 데이터베이스 선택

USE 데이터베이스명;

4. 테이블 생성

CREATE TABLE 테이블명(
-> 필드1 데이터타입 NULL수용여부(사용하지 않으면 기본적으로 NULL),
-> 필드2 데이터타입 NOT NULL,
...
-> PRIMARY KEY(필드1)); // PRIMARY KEY 부여 


예를 들어
CREATE TABLE opentutorials(
-> id INT(11) NOT NULL AUTO_INCREMENT,
-> title VARCHAR(30) NOT NULL,
-> description TEXT NULL,
-> created DATETIME NOT NULL,
-> profile VARCHAR(100) NULL,
-> PRIMARY KEY(id));

3. 테이블 목록보기

SHOW tables;

4. 테이블 구조 확인

DESC 테이블명;

5. 특정 칼럼에 키 부여

ALTER TABLE 테이블명 ADD PRIMARY KEY(필드명);

6. 데이터 입력

INSERT INTO //모든 필드에 데이터 추가 
-> 테이블명
-> VALUES(데이터1, 데이터2, 데이터3,,,);

예를 들어
INSERT INTO 
->opentutorials
->VALUES("SQL","SQL is....",NOW(),'kkami','developer');
INSERT INTO 테이블명(필드1, 필드2) VALUES(데이터1,데이터2);

예를 들어
INSERT INTO opentutorials(title,description,created,author,profile) 
->VALUES("SQL","SQL is....",NOW(),'kkami','developer');

7. 데이터 조회

SELECT * FROM 테이블명; // 전체 필드 데이터 검색

SELECT 필드명1, 필드명2 FROM 테이블명; // 특정 필드 데이터 검색

SELECT 필드명1, 필드명2 FROM 테이블명 WHERE 조건식; // 조건에 맞는 레코드 검색 명령

SELECT 필드명1, 필드명2 FROM 테이블명 WHERE 검색필드 LIKE 조건식 // 특정 문자열이 포함된 레코드 검색 명령

SELECT 필드명1, 필드명2 FROM 테이블명 ORDER BY 필드명; // 레코드 정렬 명령 -오름차순
SELECT 필드명1, 필드명2 FROM 테이블명 ORDER BY 필드명 DESC; // 레코드 정렬 명령 -내림차순

SELECT 필드명1, 필드명2 FROM 테이블명 ORDER BY 필드명 LIMIT 숫자;// 오름차순으로 해당 숫자만큼만 출력

SELECT * FROM 테이블명 LEFT JOIN 붙일 테이블명 ON 조건; // 테이블 합치기
ex) SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id; 

8. 데이터 수정

UPDATE 테이블명 SET 필드명='바꾸고자 하는 값' WHERE 조건;

예를 들어
UPDATE opentutorials SET id=3 WHERE id=1;

9. 데이터 삭제

DELETE FROM 테이블명 WHERE 조건;

10. 이름 변경

RENAME TABLE 테이블명 TO 바꾸고자 하는 값;

 

<form>태그

:: 입력 양식 전체를 감싸는 태그

:: form은 컨트롤 요소로 구성된다.(컨트롤 요소: text, button, radio 등)

 

▷ name : form의 이름. 서버로 보내질 때 이름의 값으로 데이터 전송

▷ action : form이 전송되는 서버 url 또는 html 링크

 method : 전송 방법 설정. get은 default, post는 데이터를 url에 공개하지 않고 숨겨서 전송하는 방법

 autocomplete : 자동 완성. on으로 하면 form 전체에 자동 완성 허용

<form name="profile" action="/action_page.php" method="get" 
      autocomplete="on">
  <input type="text" name="id">
</form>

 

 

form.html

<form 태그는 사용자 입력정보를 URL 파라미터로 만들어 내는 기계>

:: submit이 속해있는 form 태그의 action 속성이 가리키는 URL로 웹 브라우저는 그 URL 뒤에 내용을 붙여 전해준다.

 

form.html에서 title과 contents에 데이터를 넣어서 form.php에 보내고 있다.

+ form 태그 내부에서 method를 지정하지 않으면 기본값은 GET 이다.

 

 

form.php

php는 data 디렉토리에 title 파일을 생성한다.

+ file_put_contents(디렉토리,내용) : 지정한 디렉토리에 입력한 내용이 담긴 파일을 만들어주는 함수이다.

+ 입력 내용을 $_GET[' '] 방식으로 받는 것도 주목

 

data 디렉토리 내부 구성
 GET 방식_내용 작성
form.php로 보내진 url

url을 확인해보면 title과 contetns에 어떤 내용이 담겼는지 알 수가 있다.

 

해당 파일 추가

파일 추가 기능이 잘 이루어졌다는 것도 확인할 수 있다.

 


이렇게 GET방식(url 파라미터를 통해서 서버 쪽에 데이터를 전송하는 것)은 북마크에서 사용하기 적합한 방식이다.

즉, 어떤 콘텐츠를 다른 사람에게 공유할 때 적합한 방식이다.

 

반대로 내용을 작성하여 url을 통해 데이터를 서버로 전송하는 방식은 이 주소를 공유했을 때 데이터가 추가돼버리는 등 여러 문제가 생긴다. (삭제, 수정의 경우도 마찬가지)

 

따라서 form에 데이터를 전송하는 하는 방식을 POST로 설정하여 url을 통하지 않고 해당 데이터를 은밀하게 서버로 전송해야 한다.

수정한 form.html
수정한 form.php

+ 입력 내용 $_POST[' '] 방식

 

수정한 form.html 페이지_내용 작성
form.php로 보내진 url

URL 부분이 깔끔하다!

 

form.php 확인

form.php의 네트워크 부분을 확인해보니

해당 내용이 우리가 볼 수 없는 방식으로 은밀히 전달된 것을 확인할 수 있다.

 

해당 파일 추가

 

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
PHP 문법 기초  (0) 2021.01.28
PHP의 이해  (0) 2021.01.28

php의 기본이 되는 것들을 아주 간단하게 적어놓았다. 

 

Variable

:: 변수는 $로 표시

:: . 으로 연결

<?php  
$name="kkami"  
"hello".$name."good morning";
?>

 

Parameter

:: url의 입력값 전달은 ?

ex) http://127.0.0.1/parameter.php?name=kkami&address=서울

 

:: 전달받은 것을 화면에 출력하고자 할 땐 $_GET['변수명']로 출력

 <html>
 	<body>
    	안녕하세요. <?php echo $_GET['address'];?>에 사시는 <?php echo $_GET['name'];?>님
  	</body>
</html>

 

줄바꿈

:: 1. 문자열 안에 <br>태그 삽입

:: 2. nl2br( ) 함수 사용 (new line to br)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <h1>newline</h1>
    <?php
    $str = "발 끝에 닿을 듯한 어둠에
            그림자마저 사라져
            등뒤로 도망가는 너란 해 Bye
            궤도를 벗어난 행성
            이별에 우린 부딪히려 해
            난 차라리 모든 걸 잊어버린
            너를 원해
            흐르는 별들 속에 헤매던 그때
            이뤄지지 않을 꿈안에 갇혀 Fly away
            빛을 건너 그 날의 널 볼 수 있다면
            지금 너와 난 영원을 속삭였을까
            Let me catch the light";
    echo $str;
    ?>
  </body>
</html>

가사 : 「하현상-3108」

이렇게 문자열을 입력했을 때 결과화면은 아래와 같다.

 

가사가 str변수 안에 입력한 대로 줄바꿈이 되기를 원한다.

 

<br>태그 이용

    $str = "발 끝에 닿을 듯한 어둠에<br>
            그림자마저 사라져<br>
            등뒤로 도망가는 너란 해 Bye<br>
            궤도를 벗어난 행성<br>
            이별에 우린 부딪히려 해<br>
            ....
            let me catch the light";

이런식으로 문자열 사이에 줄바꿈을 원하는 곳에 <br>태그를 입력하면 된다.

 

nl2br( ) 함수

     <?php
     echo nl2br($str);
     ?>

하지만 nl2br( ) 함수를 이용한다면? 

한꺼번에 개발자가 원하는대로 코드의 줄바꿈이 가능해진다.

 

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
form과 GET, POST  (0) 2021.01.29
PHP의 이해  (0) 2021.01.28

PHP¹

:: PHP는 웹프로그래밍을 위한 높은 생산성을 제공하는 언어이다.(웹을 위해서 만들어졌고, 지금도 웹을 위해서 발전하고 있는 웹을 위한 언어)

:: 서버 측에서 실행되는 프로그래밍 언어로 HTML을 프로그래밍적으로 생성해주고, 데이터베이스와 상호작용 하면서 데이터를 저장하고, 표현한다.

+) 특히 서버에 직접 설치해서 운영할 수 있는 설치형 웹에플리케이션(제로보드, 텍스트큐브, 워드프래스, PHPBB등)의 과반이 PHP로 만들어졌다.

 

PHP 이용 시 웹 페이지를 자동으로 생성할 수 있다.

사이트의 운영자가 컨텐츠의 내용을 작성해서 PHP에게 넘기면 PHP는 사용자 대신에 컨텐츠를 html으로 만들어준다.

 

PHP의 원리

웹 브라우저 상에서 html 문서를 요청하면 웹 서버는 자신이 가지고 있던 html 파일을 그대로 보여준다.(정적)

그러나 php 문서를 요청하면 웹 서버는 이 요청을 php 에 위임하고 php가 html 파일을 생성한 후, 웹 서버가 이를 보여준다.(동적)

 

 

 

 

 

 

(¹출처: opentutorials.org/index.php/course/62)

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
form과 GET, POST  (0) 2021.01.29
PHP 문법 기초  (0) 2021.01.28

라이브러리 

:: 자신이 만들고자 하는 프로그램에 필요한 부품들이 되는 소프트웨어들을 잘 정돈해 놓은,

재사용하기 쉽게 돼 있는 소프트웨어이다.

 

프레임워크

:: 자신이 만들고자 하는 것이 있을 때 그것이 무엇이냐에 따라 언제나 필요한 공통적인 것이 있고, 

기획 의도에 따라 달라지는 부분이 있다. 이 공통적인 부분이 프레임워크이다. (뼈대)

 

프레임워크 = 라이브러리 + 클래스 라고 생각하면 쉽다.

 


자바스크립트 라이브러리에서 가장 유명한 것은 jQuery라는 라이브러리이다.

jQuery는 상당히 오래됐고, 아주 안정적인 라이브러리이다. 이것을 사용하면 생산성, 효율성이 훨씬 높아진다.

 

사용 방법

1. jQuery 라이브러리를 다운로드 받고 그 파일을 프로젝트 디렉터리로 옮긴다.

2. CDN(Content Delivery Network)을 이용한다.

  - 많은 라이브러리들은 CDN을 통해 자신들의 서버에 파일을 보관해놓고, 사용자는 <script> 태그의 src 속성을 통해 가져가는 방식을 취한다.

출처 jQuery 사이트
가장 최신의 것
<script> 태그로 삽입
jQuery를 통해 반복문을 짧게 줄인 예시

$('a')는 이 웹 페이지의 모든 <a> 태그를 jQuery로 제어하겠다는 뜻이다.

 

jQuery를 통해 기존 코드 수정 예시2

자바스크립트를 통해 우리 대신 css( )라는 함수를 jQuery가 만들어 두어 대신 처리해주는 것이다.

 

 

이런 식으로 jQuery 라이브러리를 사용한다면 코드는 더욱 직관적이고 간결해진다.

'WEB > JavaScript' 카테고리의 다른 글

JSON  (0) 2021.05.02
Open API 활용  (0) 2021.05.02
웹 브라우저 제어  (0) 2020.11.08
콘솔  (0) 2020.11.05
이벤트  (0) 2020.11.05

그림 1 첫 화면
그림 2 csrf 페이지

xss 공격이 막혀 있는 것 같다.

@app.route('/csrf')
def csrf():
    csrf = request.args.get('csrf', '').lower()
    xss_filter = ['frame', 'script', 'on']
    for _ in xss_filter:
        csrf = csrf.replace(_, '*')
    return csrf

코드를 보니 아니나 다를까,

클라이언트가 전달한 csrf의 값 중에서 frame, script, on 이라는 문자열이 있다면 

해당 문자열을 *로 바꾸고 있다.

 

따라서 xss 공격을 위해선 다른 태그를 사용해야 할 것이라고 생각했다.

 

그림 3 memo 페이지

memo_text = ''
@app.route('/memo')
def memo():
    global memo_text
    text = request.args.get('memo', None)
    if text:
        memo_text += text.replace('<', '&lt;') + '\n'
    return render_template('memo.html', memo=memo_text)

memo 페이지는 앞서 xss 문제(2021/01/23 - [Study/WEB Hacking] - Dreamhack | 워게임 | 문제)에서 풀었던 것과 똑같이 구성되어 있다.

 

그림 4 notice_flag 페이지

아무것도 안 했는데 Access Denied가 뜬다.

@app.route('/admin/notice_flag')
def admin_notice_flag():
    global memo_text
    if request.remote_addr != '127.0.0.1':
        return 'Access Denied'
    if request.args.get('userid', '') != 'admin':
        return 'Your not admin'
    memo_text += f'[Notice] flag is {FLAG}\n'
    return 'Ok'

해당 페이지 코드를 보니 고려해야 할 if 문이 두 개나 있다.

① request.remote_addr != '127.0.0.1' : 접속한(클라이언트의) IP 주소가 127.0.0.1이 아니라면~

② request.args.get('userid',' ') != 'admin' : userid에 해당하는 값이 admin이 아니라면~

 

접속한 IP 주소가 127.0.0.1이 아니었기 때문에 Access Denied가 뜬 것이다.

그렇다면 접속 IP주소를 127.0.0.1로, userid 값을 admin으로 설정해준다면

global 변수인 memo_text에 flag 값이 들어가 memo 페이지에 써져 있을 것이라고 생각했다.

 

 

그림 5 flag 페이지

@app.route('/flag', methods=['GET', 'POST'])
def flag():
    if request.method == 'GET':
        return render_template('flag.html')
    elif request.method == 'POST':
        csrf = request.form.get('csrf', '')
        if not read_url(csrf):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'

그림 6 app.py 일부. read_url( )

flag 페이지에선 'csrf'의 값을 알아낸 후 read_url() 함수에 넣어 실행시키고 있다.

 

마지막 부분인

driver.get(f'http://127.0.0.1:8000/csrf?csrf={urllib.parse.quote(url)}') 에 의해 해당 페이지가 불러와지므로

csrf 페이지 내에서 공격을 하기로 했다.

 

csrf 페이지에서 공격할 때 frame, script, on 태그는 사용하지 못하므로

img 태그를 사용했다.

 

<img src="http://127.0.0.1:8000/admin/notice_flag?userid=admin"> 입력

 

그림 7 memo 페이지

그리고 나서 memo 페이지를 가면 빨간 표시한 두 줄이 뜬다.

'WEB > WEB Hacking' 카테고리의 다른 글

Server - side Vulnerability ① Injection  (0) 2021.03.08
Server - side Vulnerability  (0) 2021.03.06
Client-side Attack  (0) 2021.01.25
Flask, HTTP 요청 방식  (0) 2021.01.24
Dreamhack | 워게임 | <xss-1> 문제  (0) 2021.01.23

Client-side Attack. 앞서 설명했듯이 서비스 사용자에 대한 공격이다.

 

공격자의 주 목적은 무엇일까?

:: 사용자로부터 본인을 식별하기 위한 정보, 즉 쿠키나 세션에 저장된 세션 아이디 정보를 탈취해 사용자 권한을 얻거나

사용자의 브라우저에서 자바스크립트 등을 실행하는 등의 특별한 행위를 수행

사용자가 요청을 보낸 것처럼 하는 것이다.

 

 

그렇다면 클라이언트 사이드 취약점이 발생하는 이유는 무엇일까?

① 웹 브라우저는 Stateful한 상태를 유지하기 위해 모든 HTTP 요청에 쿠키를 함께 보낸다.

   (stateful : server side에 client와 server의 동작, 상태정보를 저장하는 형태)

:: 웹 브라우저는 HTTP 요청을 생성할 때 시작 주소(Referer)와 상관없이 대상 호스트가 발급한 쿠키를 삽입한다.

 

② 자바스크립트를 이용해 페이지 내의 요소들을 관리한다.

:: 외부 리소스를 불러오는 엘리먼트(iframe, img, video 등)를 자바스크립트로 관리하면 사용자의 동의없이 해당 내용을 읽거나 변조할 수 있게 된다.

 

이러한 공격을 막기 위해 Same Origin Policy(SOP) 정책이 탄생한다.

(*SOP : 서로 다른 오리진의 문서 또는 스크립트의 상호작용을 금한다)

(*오리진 : 프로토콜(protocol,scheme), 포트(port), 호스트(host)로 구성되며 구성요소가 모두 일치해야 같은 오리진이다)

 

일반적으로 SOP의 영향으로 서로 다른 리소스와 공유하지 못하지만 공유해야 하는 상황이 있을 수 있다.

따라서 SOP가 적용된 상태에서도 리소스를 공유하는 법인 Cross Origin Resource Sharing(CORS)가 등장한다.

(이는 나중에 따로 다뤄보기로 한다.)

 


이제 클라이언트 사이드 취약점을 알아보자

ⓐ Cross Site Scripting(XSS)

:: 공격자의 입력값이 크로스 사이트의 자바스크립트 일부로 웹 브라우저에서 실행되는 취약점이다.

:: 실행된 스크립트는 해당 사이트의 일부가 되어 SOP의 제약없이 사이트의 구조를 변경하거나, 임의의 HTTP 요청 등을 실행할 수 있다.

 

-- 성공적 공격을 위한 조건

   1. 입력 데이터에 대한 충분한 검증 과정이 없어야 한다.

   2. 서버의 응답 데이터가 웹 브라우저 내 페이지 출력 시 충분한 검증 과정이 없어야 한다.

 

-- 자바스크립트를 이용한 공격

    (ex; 화면 구성 바꾸기, 사용자 권한으로 정보 조회하기, 웹 브라우저 위치 바꾸기 등)

    :: 대표적 방법은 script 태그를 이용하는 방식 (script 태그 : 다른 프로그래밍 언어 연결시 사용하는 태그)

    공격자가 입력 데이터로 script 태그를 전송해 다른 사용자의 응답에 포함되면 공격자의 자바스크립트가 실행된다.

    :: on* 이벤트를 사용하는 방식

 

(1) Stored XSS

:: 악성 스크립트가 서버 내에 존재하는 데이터베이스 또는 파일형태로 저장되어 있다가

사용자가 이를 조회하는 순간 발생하는 형태

(ex; 게시판 조회)

 

(2) Reflected XSS 

:: 악성 스크립트가 사용자의 요청과 함께 전송되는 형태

:: 사용자가 요청한 데이터가 서버의 응답에 포함되어 HTML 등의 악성 스크립트가 그대로 출력된다.

(ex; 특정 링크 유도)

+ Click Jacking, Open Redirect 취약점과 연계되어 발생하는 경우도 있다.

 

-- 방어기술

ⓐ Server-side Mitigations(방어)

:: XSS를 유발할 수 있는 태그삽입 방지를 위해 서버 단에서 검증하는 방식

- 사용자의 입력값이 HTML 태그가 될 일이 없다면 특수문자를 HTML Entity Encoding을 이용해 태그로 인식되지 않도록 함

- 현재 IP 주소와 로그인했던 IP주소로 비교하는 방법 (요즘은 Wifi의 사용으로 동일 IP 검사가 아닌 동일 국가인지 탐지하는 것으로 변경)

 

ⓑ HTTPOnly Flag

:: 서버 측에서 응답 헤더에 Set-Cookie 헤더를 전송(Set-Cookie: session=sbdh1vjwvq; HttpOnly)해 자바스크립트로 해당 쿠키에 접근하는 것을 금지

- HTTPOnly로 설정한 쿠키는 document.cookie API를 통해 접근할 수 없다.

 

ⓒ Content Security Policy(CSP)

:: 응답 헤더(Content-Security-Policy: <지시어>; ...)나 meta 태그(<meta http-equiv="Content-Security-Policy" content="지시어")를 통해 선언 

:: 각각의 지시어를 적용하여 사이트에서 로드하는 리소스들의 출처를 제한

 

ⓓ X-XSS-Protection Header

:: 응답 헤더에 선언 X-XSS-Protection: <값>

:: 웹 브라우저에 내장된 XSS Filter의 활성화 여부를 판단

 

ⓑ Cross Site Request Forgery(CSRF 또는 XSRF)

:: 비정상적으로 사용자의 의도와 무관하게 HTTP 요청을 보내는 것(사용자 권한 이용). Forgery = '위조'

-- 기본

   : 웹 브라우저는 SOP에 위반되지 않는 모든 요청에 쿠키를 포함해 전송한다.

 

-- 공격자가 취할 수 있는 이득

   : 해당 세션 쿠키를 가진 사람만 사용할 수 있는 기능을 요청할 수 있다. 

   (ex; 금액 송금, 패스워드 변경)

 

-- 성공적 공격을 위한 조건

   1. 해당 웹 사이트가 쿠키를 이용한 인증방식을 사용해야 한다.

   2. 공격자가 사전에 알 수 없는 파라미터가 존재하면 안된다.

      (ex; 자동 입력 방지 문자, 기존 패스워드 등)

 

-- 방어기술

ⓐ 세션 쿠키 대신 커스텀 헤더를 사용하여 사용자 인증

:: 사용자 인증만을 위한 헤더를 추가 (e.g. Authorization)

 

ⓑ 공격자가 예측할 수 없는 파라미터 추가 및 검증

:: 같은 오리진에서만 접근 가능한 데이터 삽입 (CSRF Token)

:: CAPTCHA

:: 정상적 사용자만 알고있는 값 검증(ex; 현재 비밀번호)

'WEB > WEB Hacking' 카테고리의 다른 글

Server - side Vulnerability  (0) 2021.03.06
Dreamhack | 워게임 | <csrf-1> 문제  (0) 2021.01.26
Flask, HTTP 요청 방식  (0) 2021.01.24
Dreamhack | 워게임 | <xss-1> 문제  (0) 2021.01.23
웹 해킹 기초  (0) 2021.01.23

IAT & EAT 이해

# Sample 01.exe는 Beep() API를 사용

# Beep() 기능은 kernel32.dll에서 제공

# Sample 01.exe는 Beep() API 주소를 어떻게 알아낼까?

 

Sample 01.exe를 실행하면 PE 로더가 이것과 kernel32.dll을 함께 올린다.

이 올리는 과정에서 PE 로더는 kernel32.dll의 EAT로 가서, Beep() API의 실제 호출 주소를 알아온다. 

그리고 나서 이것(주소)을 Sample 01.exe의 IAT에 기록한다.

그러면 Sample 01.exe는 필요할 때마다 자신의 IAT를 참고하여 함수를 호출하는 것이다.

 


그림1 kernel32.dll_Beep_API RVA : 0x00083081

 

그림 2 kernel32.dll_Image Base : 0x76030000

0x00083081 + 0x76030000 = 0x760B3081 (Beep 호출 주소)

 

그림3 Sample 01.exe의 Import Address Table 영역

 

그림4 Beep() API 호출 코드에서 바로 확인 가능

 

Beep() API를 호출할 때 직접 호출하지 않고 0x00405000 주소에 있는 4Byte 값을 가져와서 호출한다.

0x00405000 주소는 Sample 01.exe의 Import Address Table(IAT) 영역이다.

해당 주소로 이동해보면 Sample 01.exe가 사용하는 API들의 호출 주소가 기록되어 있다.

 

'Study > Reversing' 카테고리의 다른 글

main 함수 찾기  (0) 2021.03.23
OllyDBG, 어셈블리어  (0) 2021.02.04
PE 헤더  (0) 2021.01.24
PE File Format 이해  (0) 2021.01.23
리버싱의 이해  (0) 2021.01.22

PE 헤더

:: 작은 구조체들이 모여서 만들어진 데이터 덩어리

:: 크게 DOS Header와 DOS Stub, NT Header, Section Header로 구성

 

 

PE 헤더 (출처 위키백과)

 

 

DOS Header DOS Header는 DOS와 호환성을 위해 만들었다. 파일의 처음에 위치하고 0x40의 크기를 갖는다.
DOS Stub 해당 파일이 MS-DOS에서 실행될 경우, 화면에 출력될 메시지와 코드가 기록되어 있다. 
DOS Stub은 옵션이기 때문에 파일 실행에 영향이 없다. 크기가 일정하지 않고 없어도 되는 영역이다.
NT Header 파일 실행에 필요한 중요 정보들을 담고 있다. 0xF8의 크기를 갖는다.
Section Header  각 섹션의 속성 정보를 담고 있다.

 

ⓐ DOS Header

- DOS Signature : 실행 파일이라는 표식. 2Byte이고 "MZ(0x5A4D)" 값을 가진다.

- NT Header Offset : NT 헤더의 시작 지점에 대한 정보를 담는다. 4Byte.

 

ⓑ NT Header 

- PE Signature : 올바른 PE 파일인지 확인하는 용도로 사용된다. 4Byte이고 "0x50450000"값을 가진다.

- FILE HEADER : 파일의 Physical 정보를 담고 있는 구조체이다.

Machine에서 UPU -> CPU (오타)

- OPTIONAL HEADER : 파일의 Losical 정보를 담고 있는 구조체이다.

 

ⓒ Section Header

- VirtualSize : 메모리에서 섹션이 차지하는 크기이다.

- RVA(VirtualAddress) : 메모리에서 섹션의 시작 주소이다.

- SizeOfRawData :  파일에서 섹션이 차지하는 크기이다.

- OffsetToRawData : 파일에서 섹션의 시작 주소이다.

- Characteristics :  섹션의 속성 정보를 담고 있다.

 

VA (Virtual Address, 가상주소) & RVA (Relative Virtual Address, 상대주소)

:: 특정 값의 위치 정보를 표현할 때

파일에서의 위치(Offset), 메모리에서의 위치(VA), 메모리에서의 상대 위치(RVA)를 사용한다.

여기서 RVA는 파일 데이터가 메모리에 올라간 시작 지점으로부터 떨어져 있는 상대 위치이다.

VA = Image Base + RVA

(Image Base는 OPTIONAL HEADER에 있다.

실행파일이 메모리에 올라간 위치로, 파일 데이터가 메모리에 올라갈 때 기준이 되는 주소 값을 가진다. 기본적으로 EXE는 0x004000000, DLL은 0x10000000 값을 가진다.)

 

ⓓ IAT(Import Address Table)와 EAT(Export Address Table)

Windows 운영체제에서 EXE가 동작할 때 DLL이라는 비서를 두고 활용하게끔 만들어져 있다. 이것을 가능하게 하는 것이 IAT와 EAT 메커니즘이다. 

- IAT : DLL이 제공하는 함수들 중 사용하는 것들에 대한 정보를 기술해놓은 테이블

(ex; EXE를 로드하는 과정에서 필요한 함수 호출 주소 정보를 획득하여 EXE의 IAT에 기록, EXE는 동작 과정에서 필요할 때마다 IAT를 참고하여 함수를 호출)

- EAT : DLL 자신이 서비스하는 함수에 대한 정보를 기술해 놓은 테이블

 

 

'Study > Reversing' 카테고리의 다른 글

main 함수 찾기  (0) 2021.03.23
OllyDBG, 어셈블리어  (0) 2021.02.04
IAT & EAT  (0) 2021.01.25
PE File Format 이해  (0) 2021.01.23
리버싱의 이해  (0) 2021.01.22

+ Recent posts