11주차 과제

2022. 8. 23. 11:5922-1학기/WINS_모의해킹

1. simple_sqli

https://dreamhack.io/wargame/challenges/24/?writeup_id=1950#fn1 

 

simple_sqli

로그인 서비스입니다. SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. Reference Server-side Basic

dreamhack.io


(문제 정보에 있는 Server-side Basic 강의 내용)

서버에서 사용자가 요청한 데이터를 해석하고 처리한 후 사용자에게 응답한다. 그 과정에서 웹 어플리케이션이나 데이터베이스와 같은 서버의 자원을 사용해 처리하기도 한다. 이 과정에서 사용자의 요청 데이터에 의해 발생하는 취약점을 서버 사이드 취약점이라고 한다. http 요청 시 모든 데이터는 조작하여 전송이 가능하고 악의적인 사용자는 이를 이용해 서버의 취약점을 확인한다.

 

[Server-side Basic]

Injection  서버의 처리 과정 중 사용자가 입력한 데이터가 처리 과정의 구조나 문법적으로 사용되어 발생하는 취약점
File vulnerability 서버의 파일 시스템에 사용자가 원하는 행위를 할 수 있을 때 발생하는 취약점
Business Logic Vulnerability (비즈니스 로직 취약점) 인젝션, 파일 관련 취약점들과는 다르게 정상적인 흐름을 악용하는 것을 의미함
Languages specific Vulnerability(PHP, Python, NodeJS) 웹 애플리케이션에서 사용하는 언어의 특성으로 인해 발생하는 취약점을 다룸
Misconfiguration 잘못된 설정으로 발생하는 취약점을 다룸

1.Injection : 주입이라는 의미로, 인젝션 공격은 사용자의 입력 값이 어플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석돼 발생하는 취약점을 의미한다. 변조된 입력을 주입해 의도하지 않은 행위를 발생시킨다.

  • SQL Injection : SQL을 사용할 때 공격자의 입력 값이 정상적인 요청에 영향을 주는 취약점

-> 악의적인 입력 : 사용자의 요청을 올바르게 검증하지 않은 채 그대로 실행하면 아래와 같이 의도하지 않은 결과가 발생할 수 있다. 이처럼 실행 흐름 중간에 들어갈 수 있는 사용자의 입력에 변조된 입력을 주입해 의도하지 않은 행위를 발생시키는 것을 Injection이라고 한다.

 

2. SQL Injection

SQL은 관계형 데이터베이스(RDBMS)의 데이터를 정의하고 질의, 수정 등을 하기 위해 고안된 언어이다. 데이터베이스에 의존하는 상당수의 웹 어플리케이셔은 SQL을 사용해 데이터베이스와 상호작용한다.

웹 애플리케이션에서 로그인/검색과 같이 사용자의 입력 데이터를 기반으로 데이터베이스(DBMS)에 저장된 정보를 조회하는 기능을 구현하기 위해 SQL쿼리에 사용자의 입력 데이터를 추가하여 DBMS에 요청한다. 이 과정에서 사용자의 입력이 SQL 쿼리에 삽입되어 SQL 구문으로 해석되거나 문법적으로 조작하게 되면 개발자가 의도한 정상적인 SQL 쿼리가 아닌 임의의 쿼리가 실행될 수 있다.

-> 즉, SQL Injection은 SQL 쿼리에 사용자의 입력 값이 삽입돼 사용자가 원하는 쿼리를 실행할 수 있는 취약점이다. SQL Injection이 발생하게 되면 현재 쿼리를 실행하는 DBMS 계정의 권한으로 공격이 가능하며 일반적으로 데이터베이스의 내용을 추출하거나 변조, 삭제하는 등의 행위가 가능하다.

3. SQL Injection

사용자의 입력 데이터가 SQL 쿼리에 들어가는 대표적인 예시는 로그인 기능이다.

사용자가 아이디와 패스워드를 입력해 서버에 전송하면 서버는 해당 데이터가 데이터베이스에 존재하는지 확인하고 로그인 성공 여부를 판단한다.

01


문제로 돌아와서 다운로드 받은 문제 파일을 열어보면 다음과 같은 파이썬 파일을 확인할 수 있다.

01

문제에 있는 http://host3.dreamhack.games:19679/ 링크로 이동하면 아래와 같은 로그인 창을 확인할 수 있다.

참을 만들기 위해 userid 에는 admin" --을, password에는 1 'or' 1을 입력한다.

그러면 위와 같이 flag의 정보가 입력된 창이 뜨는 것을 확인할 수 있다.


2. cookie

https://dreamhack.io/wargame/challenges/6/?writeup_id 

 

cookie

쿠키로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다. Reference Introduction of Webhacking

dreamhack.io


(문제 정보에 있는 Introduction of Webhacking 강의 내용)

1. Cookie

http는 하나의 request와 response의 쌍이 독립적으로 구성되어 통신하는 connectionless, stateless 프로토콜이다.

connectionless 속성은 하나의 요청에 하나의 응답을 한 후 네트워크 연결을 끝맺는 것을 의미한다. 불특정 다수의 사용자에게 서비스되어야 하는 웹의 특성상 계속해서 연결상태를 유지하는 것은 서버 부하로 이어질 가능성이 있어 connectionless를 갖게 되었다.

stateless 속성은 네트워크가 연결을 끝맺을 때 상태를 유지하지 않는 것을 의미한다. http 요청마다 새로운 커넥션을 열기 때문에 사용자 인증을 계속해서 해야한다는 단점이 있다. 이러한 단점을 개선하기 위해 상태를 유지하기 위한 Cookie가 탄생했다. 웹 브라우저는 http response의 Set-Cookie Header나 Javascript document.cookie를 통해 데이터를 쿠키에 저장한다.

추후 http 요청을 보낼 때 웹 브라우저가 자동으로 헤더에 쿠키를 추가해 전송한다.

2. Session

쿠키에 인증 상태를 포함한 데이터를 저장하면 사용자가 임의 사용자로 인증된 것처럼 요청을 조작할 수 있다. 따라서 서버에 데이터를 저장하기 위해 Session을 사용한다. 세션을 활용하면 데이터를 서버에 저장하고 해당 데이터에 접근할 수 있는 유추할 수 없는 랜덤한 문자열 키를 만들어 응답하며, 이를 보통 Session ID라고 부른다. 브라우저는 해당 키를 쿠키에 저장하고 이후에 http 요청을 보내면 서버에서 키에 해당하는 데이터를 가져와 인증 상태를 확인한다.

쿠키는 데이터 자체를 사용자가 저장하며, 세션은 서버가 저장한다는 핵심적인 차이가 있다. 

3. HTTP/HTTPS

01


코드를 살펴보면 user에 guest와 admin 둘만 있는 것을 확인할 수 있다. 그리고 guest의 password는 guest이고, admin의 password는 FLAG인 것을 알 수 있다.

 

접속 정보에 있는 http://host3.dreamhack.games:20151/ 링크로 들어간다.

이동하면 다음과 같은 페이지가 뜨는 것을 확인할 수 있다.

Login을 클릭해서 아래처럼 username과 password에 guest를 입력해준다.

그러면 아래와 같은 메세지가 뜨는 것을 확인할 수 있다.

cookie를 이용해서 admin 계정에 접근하기 위해서 editthiscookie를 이용한다.

(editthiscookie : https://zidarn87.tistory.com/164)

퍼즐처럼 생긴 걸 누르고 쿠키를 클릭하면 guest로 표시되어 있는 것을 확인할 수 있는데, 거기에 admin의 password인 flag를 알아야 하기 때문에 admin이라고 변경한 후 초록색 확인표시를 누르고 창을 새로고침한다.

새로고침하면 아래와 같이 flag가 뜨는 것을 확인할 수 있다.


3. XSS-1

https://dreamhack.io/wargame/challenges/28/

 

xss-1

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. Reference Client-side Basic

dreamhack.io


(문제 정보에 있는 Client-side Basic 강의 내용)

1. Cross Site Scripting (XSS)

공격자의 입력값이 크로스 사이트의 자바스크립트 일부로 웹 브라우저에서 실행되는 취약점을 말한다. 실행된 스크립트는 해당 사이트의 일부가 되어 SOP 제약 없이 사이트의 구조를 변경하거나 임의 HTTP 요청을 보낼 수 있다.

서버의 응답에 공격자가 삽입한 악성 스크립트가 포함되어 사용자의 웹 브라우저에서 해당 스크립트가 실행되는 취약점을 Cross Site Scripting(XSS)라고 한다.

XSS는 임의의 악성 스크립트를 실행할 수 있으며 이를 통해 해당 웹 사이트의 사용자 쿠키 또는 세션을 탈취해 사용자의 권한을 얻거나, 사용자의 페이지를 변조하는 등의 공격을 수행할 수 있다.

 

-XSS 공격을 성공적으로 수행하기 위해서는 아래의 두 가지 조건이 요구된다.

 1. 입력 데이터에 대한 충분한 검증 과정이 없어야 한다. (입력한 데이터가 충분한 검증 과정이 이루어지지 않아 악성

     스크립트가 삽입될 수 있어야 한다.)

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

     스크립트가 웹 브라우저의 렌더링 과정에 성공적으로 포함되어야 한다.)

 

XSS는 악성 스크립트가 전달되는 방식에 따라 Stored XSS, Reflected XSS 등으로 분류된다. 악성 스크립트의 전달 방식 차이가 있을 뿐 사용자의 웹 브라우저에서 악성 스크립트를 실행한다는 것은 동일하다.


01

문제 파일을 다운로드 받으면 위와 같은 파이썬 파일을 확인할 수 있다.

접속 정보에 있는 http://host3.dreamhack.games:20079/ 링크로 이동한다.

이동하면 위와 같은 페이지가 뜨는 것을 확인할 수 있다.

여기서 memo를 클릭하면 hello가 출력되는 페이지를 볼 수 있다.

flag 함수는 스크립트 언어를 이용해 공격하는 페이지이다.

다운받은 파이썬 파일에서 check_xss 함수에서 입력한 URL을 참조한다는 것을 확인할 수 있다.

따라서 flag에 전체 경로 <script>location.href="http://127.0.0.1:8000/memo?memo=hello"+document.cookie;</script>를 입력해준다.

그리고 memo로 다시 돌아가면 flag가 출력되어 있는 것을 확인할 수 있다.

'22-1학기 > WINS_모의해킹' 카테고리의 다른 글

12주차 과제  (0) 2022.08.30
10주차 과제  (0) 2022.08.15
9주차 과제  (0) 2022.08.08
8주차 정리  (0) 2022.08.02
7주차 정리  (0) 2022.07.22