Dreamhack : WebHacking Review

Alpha, Orderly·2023년 7월 10일
0

DreamHack

목록 보기
1/3
post-thumbnail

개요

  • DreamHack 의 강의중 하나인 Webhacking 을 들으며 중요한 부분을 정리해 보았다.

쿠키

  • Http 프로토콜은 연결성과 상태성이 없다.
  • 이를 유지하기 위해 쿠키를 사용한다.
  • 서버와 통신 시 마다 전송되기에 최근엔 localstorage도 사용한다.
  • 쿠키를 변조해 악의적 요청을 전송할수도 있다

세션 하이재킹

  • 쿠키는 세션을 검증하는 토큰을 가질수 있는데, 이를 가로채는것을 세션 하이재키이라 한다.

Same origin policy

  • http/https 인지가 동일하고
  • 주소 및 포트가 일치해야 origin 이 같다.
  • origin이 다를경우 ( cross origin ) 쿠키와 같은 정보를 읽어올수 없다.

Cross Origin Reource Sharing CORS

  • 다른 origin끼리 데이터를 공유하기 위한 방법
    • EX. mail.naver.com 과 cafe.naver.com 의 데이터 공유

XSS - Cross Site Scripting

  • 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자가 실행하도록 하는것

종류

  1. stored xss : 서버에 스크립트, 응답에 답겨온다.
  2. reflected xss : url에 스크립트, 응답에 담겨온다.
  3. DOM-based xss : url fragment에 스크립트. 응답에 미포함
  4. Universe xss : SOP 정책을 우회하는 XSS

CSRF - Cross Site Request Forgery

  • 사용자를 속여 의도치 않은 요청에 동의하게 하는것
  • 사용자가 세션 쿠키를 포함한 임의의 요청을 전송하도록 유도한다.
<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px>
// 이미지 주소로 가장해 요청 전송
window.open('http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337');
// 새로운 창을 통해 요청 전송
location.href = 'http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337';
location.replace('http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337');
// 현재 주소를 변경해 요청 전송

SQL Injection

종류

  1. Relational DBMS : 행과 열로 이루어진 테이블 형식으로 값을 저장한다.
  2. Non-Relational DBMS : 키와 값 쌍으로 값을 저장한다.

Relational

데이터베이스 생성

CREATE DATABASE Dreamhack;

테이블 생성

USE Dreamhack;
# Board 이름의 테이블 생성
CREATE TABLE Board(
	idx INT AUTO_INCREMENT,
	boardTitle VARCHAR(100) NOT NULL,
	boardContent VARCHAR(2000) NOT NULL,
	PRIMARY KEY(idx)
);

값 입력

INSERT INTO 
  Board(boardTitle, boardContent, createdDate) 
Values(
  'Hello', 
  'World !',
  Now()
);

값 조회

SELECT 
  boardTitle, boardContent
FROM
  Board
Where
  idx=1;

값 업데이트

UPDATE Board SET boardContent='DreamHack!' 
  Where idx=1;

Relational DBMS에서의 SQL injection 예시

  • 로그인을 처리하기 위해 아래 SELECT 구문이 실행된다.
'select * from users where userid="{userid}" and userpassword="{userpassword}"
// userid : id 입력값
// userpassword: password 입력값
  1. 로그인 우회
  • SQL에서 -- 이후의 문장은 주석처리하는것을 이용
SELECT * FROM users WHERE userid="admin"-- " AND userpassword="DUMMY"
// userid 에 admin" -- 을 입력한다.
  • or 조건을 추가해 뒷내용을 무시한다.
SELECT * FROM users WHERE userid="admin" or "1" AND userpassword="DUMMY"
SELECT * FROM users WHERE userid="admin" AND userpassword="DUMMY" or userid="admin"
  • 아무거나 반환하게 한 뒤 admin을 limit을 통해 찾기
SELECT * FROM users WHERE userid="admin" AND userpassword="DUMMY" or userid="admin"

Non-Relational DBMS

MongoDB

  • JSON 형식으로 쿼리 작성
  • _id 필드가 Primary key의 역할을 함
  • $문자를 사용해 연산자를 호출할수 있다.
db.inventory.find( { $and: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
// status 가 A이고 qty가 30보다 적은것을 조회

연산자

비교연산자
  • $eq : 같은값
  • $in : 배열안의 값들과 일치하는 값
  • $ne : 지정한 값과 같지 않은것
  • $nin : 배열의 값과 일치하지 않는것
논리연산자
  • $and : 논리 AND, 쿼리 모두 만족시 반환됨
  • $not : 쿼리와 일치하지 않는것 반환
  • $nor : 각각의 쿼리를 모두 만족하지 않는것 반환됨
  • $or : 각각의 쿼리중 하나 이상 만족하는것 반화노딤
Element 단위
  • $exists : 지정된 필드가 있는 문서 찾기
  • $type : 지정된 필드가 지정된 유형인 문서 선택
Evaluation
  • $expr : 쿼리 언어 내 집계 식 사용
  • $regex : 지정된 정규식과 일치하는 문서
  • $text : 지정된 텍스트 검색

업로드중..

  • select 문에서 첫번째는 조건, 두번째는 출력 포맷

  • insert는 json으로 전달

  • delete는 json으로 전달

  • update의 경우 첫번째는 조건, 두번째는 동작

    • 위 경우 $set 연산자를 이용해 업데이트.

      Redis

    • 키-값의 쌍을 가진 데이터를 저자ㅇ한다.

    • 메모리 기반 DB이며, 임시 데이터를 캐싱하는 용도로 주로 사용한다.

      연산자

    • GET {key} : 연산자 조회

    • MGET {key...} : 여러 데이터 조회

    • SET {key} {value} : 키-값 설정

    • MSET {key} {value} {key} {value} ... : 여러 키-값 설정

    • DEL {key} : 데이터 삭제

    • EXIST {key} : 데이터 유무 확인

    • INCR {key} : key값 1 증가

    • DECR {key} : key값 1 감소

    관리

  • INFO {section} : 정보 조회

  • CONFIG SET / GET : 설정 조회 혹은 입력

    CouchDB

  • REST API 형식으로 요청을 처리함

  • POST는 추가, GET은 조회, PUT은 업데이트 DELETE는 삭제

    NOSQL Injection

  • 쿼리스트링 작성시 object 형식으로 보낼수 있다.

    id[$regex]=ad.in 
    과 같이 쿼리문을 보낼시
    {
    	$regex: "ad.in"
    }
    과 같이 전송받는다.

    Command Injection

  • 악의적인 데이터를 입력해 쿼리로 실행되게 하는것

메타문자

  • 명령어의 치환/실행
echo `echo a` : 명령어 결과로 치환됨
echo $(echo a) : 명령어 결과로 치환됨
&& : 명령 연달아 수행, 앞이 성공시 실행
|| : 명령 연달아 수행, 앞이 실패시 실행
; : 명령 연달아 수행
| : 파이프

파일 취약점

파일 업로드 취약점

  • 업로드 하는 파일의 이름을 임의로 정할수 있을때 발생한다.
    • 이름에 "../" 등을 추가해 임의의 장소에 파일을 업로드 할수 있다.

악성파일 업로드

  • 악의적인 웹 리소스를 업로드해 실행할수 있다.

파일 다운로드 취약점

  • 다운로드 할 파일의 이름을 임의로 정할수 있을때 발생
  • 이름에 "../" 등을 넣어 임의의 경로의 임의의 파일을 다운로드 받을수 있다.

Server Side Request Forgery

사용자가 입력한 URL에 요청을 보내는 경우

http://127.0.0.1:8000/image_downloader?image_url=https://dreamhack.io/assets/dreamhack_logo.png
// image_url에 요청을 보내 이미지를 받아오는것
// 만약 다른 url을 적을시 그 url로 내부에서 내부로 요청이 전송된다.
// 내부 접속만 허용된 다른 서비스를 임의로 호출할수 있게 된다.

요청 URL에 이용자의 입력값이 포함

  • 입력값을 변조해 다른 요청이 전송되도록 할수 있다.

    body에 요청이 들어가는 경우

  • 동일하게 입력값을 변조해 얻어냄

profile
만능 컴덕후 겸 번지 팬

0개의 댓글