[보안기초] 웹 공격과 방어

🛡️보안업무 스트레스에 미쳐버린 🐰토끼가
사파리 동물 친구들에게 기초 보안지식을 알려줍니다.


주제 분:초
Parameter 변조 00:30
XSS 공격 04:08
SQL Injection 07:09
안전한 비밀번호 저장 12:26

🧾 전체 스크립트

🤱 엄마
우리 얄둥이 자야 할 시간이네?
오늘은 엄마가 웹 보안에 대한
이야기를 들려줄게요

디즈니랜드 사파리에
시큐리티를 담당하는 보안토끼가 살았어요

어느 날 배고픈 곰이 나타나 말했죠

🐻
마침 식사때인데 잘 됐다
미안하지만 너 좀 잡아먹어야겠어

🐇 토끼
나 지금 코딩하는거 안 보여요?
아저씨 짬이면 나 여기 보안담당인거 알거 아녜요
개발팀 조질때도 보안인력은 인격적으로 터는거 몰라요?

지금 파라미터 변조 공격 대비하는 중이거든요

1. Parameter 변조 공격

🐇 토끼
파라미터가 뭐에요. 인자죠
인자가 뭐에요

프로그래밍에서는 어떤 함수나 웹요청에
값으로 실어보내는 데이터를 말하죠

값을 왜 실어보내요

온라인 쇼핑몰에서 당근을 사요
주문 버튼을 누르면 프론트에서 서버로
주문했다고 요청이 가는데

내가 뭘 얼마나 샀는지 실어보내야 할 거 아녜요
구매한 상품의 일련변호, 수량, 가격 등이 들어갈 수 있겠죠
이것들이 파라미터, 인자들로 들어가는거에요

그럼 서버가 이걸 받아서 샵은 이 가격만큼 결제를 하고
이것들을 이 갯우만큼 배송을 해주겠죠

문제는 클라이언트가 나쁜 맘 먹으면
이 파라미터들을 악의적으로 변조할 수가 있어요
컴퓨터 좀 만지는 애가 이 요청을 보내기 전에
가격 값을 0으로 바꿔서 보낸다고 생각해봐요

어떻게 되겠어요. 공짜로 재고처리하고 샵 닫는거죠

이런게 파라미터 변조에요

이런 포스트 요청값 뿐 아니라 URL을 조작해서 접근하는 등
방법들도 겁나 다양해요
허술한데서는 주소에 들어가는 키워드만 이렇게 저렇게 바꾸다보면
남의 비밀게시물이나 개인정보에도 접근이 되는 경우도 있다구요

완전 구닥다리 고인물 기법인데도 막으려면 끝이 없어요
보안시스템으로 다 찾을 수 있는 것도 아니고
사람이 이것저것 해보면서 약점 찾아내야돼요

이런거 하다 보니까 내가 털 시허옇게 새고 성깔 드러워진거거든요
아저씨도 이거 해보다 탈색돼서 곰표 밀가루 북극곰 함 돼볼래요?

뭐, 당근 공짜로 사는거야 주문한 놈 찾아서 철컹철컹 하면 되고
정말 위험한 건 권한을 조작하는거에요

어떤 사이트에 로그인을 하고 나면
클라이언트는 자기가 로그인했음을 인증하는
표딱지를 쿠키로 갖고 있게 돼요

아무 요청을 보낼때마다 이걸 같이 실어보내서
내가 현재 이 서버에 로그인해 있다는 걸
세션 방식으로든 토큰 방식으로든 매번 인증을 하는거라구요

이 표딱지에는 사용자를 식별하기 위한 정보가 들어있어요

우리 사파리에 로그인한 표딱지는 이렇게 돼 있다고 쳐보죠
이 권한 정보가 사욕사로 돼있어야
관람시간 이후에도 사파리에 들어올 수가 있어요

그런데 밀렵꾼들이 로그인해서 이 표딱지를 받은 다음
이 부분을 사육사 권한으로 바꿔서 사파리에 접근해요

이런 공격에 대한 대비가 안 돼 있으면 어떻게 되겠어요?
어우 땡큐다 븅신들 하고 무혈입성하는거죠

그렇게 돼서 사파리에 밀렵꾼 들어오는거 보고 싶어요?
정수리에 총맞고 에 하는 포즈로 박제돼볼래요?

곰 세마리가 한 집에 있어
울고 있어요
엄마아 아빠아

그런 꼴 당하지 마시라고 내가 이 작업 하는거거든요

이걸 방지하려면 어떻게 해야겠어요
일단 로직부터 신경써야죠

당근 가격을 왜 프론트에서 실어보내요
서버에서 주문 받고 결정해야지
이렇게 간단한 것만 신경써도 막을 수 있는게 태반이에요

권한 문제도 마찬가지죠
특정 유저의 권한은 서버측에서 그때그때 부여하게 해놔야겠죠

유저의 인덱스값도 이처럼 숫자 그대로 돼있으면
밀렵꾼들이 이것저것 시도해보다
사육사 계정 인덱스 얻어걸릴 수도 있을거에요

때문에 이런 토큰을 아예 해시값으로 처리해서
공격자가 임의로 예측하지 못하게 할 수도 있을거고

서버에서 매번 인증정보의 무결성을 체크하면 더 좋겠죠

특정 아이피에서 이런저런 값들 넣어보면서 접근하는 등
수상한 시도들을 감지해서 차단하는 기능도 필요할거구요

기타 어떤 방식으로든 클라이언트에서 실어보내는 값들에
공격자가 악용할 만한 부분들이 있을지
조심스럽게 설계하고 계속해서 모니터링해야돼요

서비스가 복잡하고 기능이 많을수록
공격자가 비집고 들어갈 건덕지도 많아지기 때문에

보안 개발자는 늘 신경 곤두세우고 대비해야된다구요

이것들 하느라 머리 터지겠는데 내가 내 목숨까지 걱정해야돼요?
먹이사슬에 아저씨 밑으로 나밖에 없어요?
내가 아저씨 배고프면 와서 걍 잡아먹으면 되는 토끼같애요?

방화벽 싹 내려가는거 보기 싫으면
먹을 거 딴데 가서 찾아봐요


🤱 엄마
그러자 곰이 OK하고 집으로 돌아갔답니다

👶🏻 아기
(옹알옹알)

🤱 엄마
우리 얄둥이 얘기 다 듣고도 눈이 초롱초롱하네
보안 프로그래밍 이야기가 안 지루해요?

그럼 엄마가 다음 이야기를 들려줄게요

곰이 돌아간 뒤 어느날 이번에는 치타가 나타났어요

🐆 치타
이야 토실토실 먹음직스런 토끼 너 내 점심이 돼라

🐇 토끼
너 내 점심이 돼라
불과 100미터 전방에 버팔로 한마리
살 뒤룩뒤룩 쪄서 늘어져 있는거 안 보여요?

저 친군 다음 주 목요일 저녁까진 돼드릴것같은데
저건 쫄려서 못 잡겠어요?

나 지금 뭐 하는걸로보여요?
XSS 공격 방지 작업중이거든요

2. XSS 공격

🐇 토끼
XSS가 뭐에요
Cross Site Scripting이죠

Cross Site Scripting이 뭐에요
남들이 보는 사이트에 명령어 코드, 스크립트를 집어넣는거죠

스크립트를 어떻게 집어넣어요

자 게시판이 있어요
게시판은 사용자가 에디터에 타이핑한 내용을
웹 페이지에 보여주는거죠

아무 보안 장치가 없는 게시판이라 치고
누가 이런 내용을 타이핑해서 게시글을 올려요

이걸 누가 열면 어떻게 되겠어요?
HTML 소스로 보면 이런 식으로 작성된거니까

브라우저는 이걸 단순 게시물 텍스트가 아닌
자바스크립트 코드로 인식하고 실행을 해버리겠죠

나쁜놈들이 고작 사용자한테
헬로 날리려고 이런 거 하겠어요

이런 걸 막아두지 않으면 별의별 공격들이 가능해져요

누가 사파리 커뮤니티에 이런 게시물을 올려요
수컷들 아주그냥 좋다고 열어보겠죠

그런데 이 게시물에서 열람자의 로그인 인증 정보가 담긴 표딱지를
그대로 밀렵꾼 서버로 전송하는 스크립트가 실행돼요

게시물 열람한 동물의 접근 권한을 밀렵꾼이 얻게 되는거죠

그렇게 해서 디즈니랜드 사파리에
밀렵꾼들 들어오면 어떻게 될 것 같애요

디질랜드 사파리 되는거에요
다 뒤진 치타 수컷들끼리
누가 간지나게 널부러졌나 경쟁하게 될거라구요

그렇게 안 되려면 뭘 해야겠어요

게시글 내용에서 이런 스크립트 실행 안 되도록 막아야죠

프론트단에서만 막을 게 아니라
게시물 내용에 이런 스크립트 차제가 서버 DB에 저장도 안 되게 해야돼요

서버에 들어오는 요청들 중에 위험한 요소들을 걸러주는 XSS 필터같은거 걸어서 안전한 값만 받게 해야죠

이처럼 스크립트 태그 내에서 실행하는 것 뿐 아니라
링크 태그에 이렇게 집어넣어서 실행되게 하거나
이벤트 속성 또는 온갖 듣보잡 속성들 사용해서
별의별 시도들을 다 하거든요

요즘 게시판 라이브러리 갖다 쓰면
어지간해선 이런 건 다 막아놓는데
보안이란게 구멍 하나 뚫리면 망하는거라 맘 놓을 수가 없어요

태그다 싶은건 싹 다른문자로 치환버리는 방법도 있지만
그래가지고는 html 요소를 게시물에서 쓸 수 없어지니까

전문가들에게 검증받은 화이트리스트 라이브러리를 쓰면
그럭저럭 안전한 게시판을 어렵지 않게 구현할 수 있겠죠

사용자 정보가 담긴 쿠키는 HttpOnly 속성을 걸어서
자바스크립트로는 접근하지 못하게 해야돼요

여기까진 XSS 공격중에도 고전적인것들만 얘기한거고
그 밖에 온갖 해괴한 짓거리들 예측하고 대책 세워야되거든요

이것들 안 하고 걍 냅둬 봐요?
사파리에 헬게이트 펼쳐지게 함 방치해 봐요?
관람객 가족 지나가다가

아빠 여긴 왜 사파리야
응, 다 죽고 파리만 날려서 사파리란다
이러는 꼴 저승에서 보게 해줘요?

그래도 좋겠다 싶으면 나 잡숴봐요
잡숴봐. 드셔보시라니깐

나 작업할 때 건들지 마요
나 일할 때 방해하지 마시라고


🤱 엄마
그러자 치타가 OK하고 집으로 돌아갔답니다

👶🏻 아기
(옹알옹알)

🤱 엄마
세상에 우리애기 이래도 안 자네?
커서 주커버그가 되려나봐요

엄마가 다음 이야기 들려줘야겠네

어느 날 이번에는 악어가 나타났어요

🐊 악어
오늘 브런치는 너로 정했다

🐇 토끼
(하아) 누가 토끼탕 쳐먹고 어디 리뷰라도 올렸나 이젠 별
여기가 물속도 아니고 그쪽이 나 잡을 수는 있어요?

지금 보안작업하느라 머리 깨지겠는데
안 뛰고 좀 앉아 있게 나 좀 가만 내비두면 안되겠어요?

🐊 악어
내 뱃속에 들어오면 그런 고생 안 해도 될 텐데

🐇 토끼
아 그러네요. 와 나 오늘 굿바이월드 하는 거구나
지금 이승 로그아웃 할 줄 알았으면 아침에 뱃살 빼겠다고
당근 쟁여둔거 그냥 먹고 오는건데

밀렵꾼이 사모님 껍데기 벗겨다가 지갑 만들어서 내다팔면
의류매장에 면회가서 부부상봉도 해보고 참 좋으시겠다 그죠

라꼬스떼 가서 헛걸음 하시지 말고
크로커다일 가죽세션 가보시면 돼요

SQL 인젝션에 서버 털려서 공포가 현실이 되게 해줘요?

3. SQL 인젝션

🐇 토끼
SQL이 뭐에요
데이터베이스에 명령 내리는데 쓰는 언어죠

인젝션은 뭐에요. 삽입한다는거죠

서버 공격하는데 SQL을 왜 삽입해요

자 시험지에 이런 문제가 나왔어요
빈칸 채워넣기죠

그런데 어떤놈이 빈칸을 이따구로 채워서 내요
어떻게 되겠어요. 먼지나게 뚜드려맞겠죠

그런데 컴퓨터한테는 이게 먹혀요
그날 시험지들 잿더미 된다니까요

서버에서 요청을 보낸 사용자가 관리자 권한이 있는지
이런 SQL문으로 확인을 한다고 쳐요

요청에 이런 인자가 실려와서 이 빈칸에 들어와요
이처럼 아이디가 여기 들어가면 권한이 admin이고
아이디가 이 값인 사용자가 있는지 조회해서

결과가 하나 나오면 관리자로 인증받는거겠죠

그런데 이 인자로 이런게 실려오면 어떻게 돼요
아이디가 스페이스이거나 1이 1과 같으면 OK 사실상 무조건 OK라는거아녜요

밀렵꾼이 사육사 권한 갖고 무료입장해버리겠죠

그냥 사파리 망하게 하려면 이렇게도 할 수 있어요
여길 이렇게 세미콜론으로 SQL문 종료하고
새 구문으로 사용자 테이블 전체 삭제 해버린 다음에
뒤의 내용은 대시 두개로 주석처리해버리는거죠

이거 못하게 하려면 어떻게 해야겠어요?

SQL문에 인자로 들어갈 모든 값들을 철저히 검증해야겠죠
사용자가 절대 인자값을 직접 작성할 수 없게 해야돼요
빈칸에 입력한 거 그대로 가져오는거는 우리 털어가란 얘기죠

프론트단에서 먼저 자바스크립트로 입력값을 필터링한 다음
서버단에서도 다시 걸러내고 나서 SQL문에 넣어야돼요

데이터베이스마다 문법도 기능도 다르기때문에
내가 직접 안전하게 짜보겠다고 어설프게 만지작거리다간
오히려 약점생겨서 망할 수 있어요

사용하는 언어나 프레임워크마다
데이터베이스 다루는데 쓰라고 권장하는 방식들이 있으니까

그런것들 가이드라인 잘 따라서 DB 사용하는게 제일 안전하겠죠

일부러 잘못된 SQL문이 실행되게 한 다음
오류 내용을 보고 DB 구조 정보를 파악하려는 놈들도 있기 때문에

에러가 나면 표시되는 오류 전용 페이지를 따로 두는것도 중요해요
DB 사용자마다 권한을 제한해두는것도 피해를 줄이는 방법이겠죠

이것들이야 기본 중의 기본이고 구멍 찾아 막으려면 끝이 없어요

이런거 하느라 쎄가 빠지는데 천적들 살피느라 눈깔도 빠져야돼요?
나 잡아먹고 아저씨가 코딩 배워서 보안일 인수할거에요?
실무예제로 배우는 객체지향 열혈강좌 C++프로그래밍 바이블 책 갖다드려요?

뱃가죽에 의류브랜드 마크 찍히기 싫으면 성가시게 하지 말고 가던 길 가요


🤱 엄마
그러자 악어가 OK하고 집으로 돌아갔답니다

👨 아빠
거 이야기 지어내기 귀찮으면 그냥 동화책 읽어주는게 안 낫겠어요?

🤱 엄마
당신은 쫌!

👨 아빠
쫌... 뭐?

🤱 엄마
불평불만만 하지 말고 당신이 직접 해보라구요

👨 아빠
알았어, 이번엔 아빠가 이야기해줄게요
어느 날 아침 일진 동물들이 모인 곳에 토끼가 나타났어요

🐇 토끼
자 주목
이거 이 테이블 이거
사용자들 암호 그대로 저장해둔거
누구에요? 누가 만들었어요?
누굴까? 후 디드 디스?
누구지? 이거 누가그랬어요~?

🦁 사자
그거슨 나가 세렝게티 향우회 사이트 맹글때
생성해서 쓰고 있는 테이블인디

🐇 토끼
쳐 돌았냐 이 장발 고양이야

4. 비밀번호 저장법

🐇 토끼
비밀번호를 평문으로 저장하면
처벌받을 수 있는거 알아요 몰라요

데이터베이스 한 번 털리면
그 안에 모든 사용자의 비밀번호가 유출되는거거든요

보안을 위해 사이트마다 다른 비밀번호를 쓰라고 하지만
실제로 그렇게 하는 사람들이 얼마나 돼요

여기 한 번 털리면 구글 페북 네이버 싸그리 털리는거에요

그럼 비밀번호를 어떻게 저장해야돼요
해싱을 해야죠

해시가 뭐에요
어떤 값에 대해서 고정된 다른 값이 나오도록 하는거죠

이 값을 넣으면 이 값이 나온다는 건 계산할 수 있지만
이게 중요해요
어떤걸 넣어야 이 값이 나오는지는 계산이 안 되는거에요
단방향으로만 값이 얻어진다는거죠

사용자가 이런 비밀번호를 사용해요
이걸 특정 해시 알고리즘에 돌리면 이 값이 나와요
이게 서버 데이터베이스에 저장되면

이걸 들여다보는 해커는 물론 데이터베이스 관리자마저도
어떤 비밀번호를 입력해야 이 값이 나오는지 알 수가 없어요
이 사용자의 비밀번호는 아무도 모른다는거죠

대신 사용자가 비밀번호를 입력하고 로그인할 때
입력한 비밀번호로 이 값이 나온다는건 알 수 있으니까
사용자가 맞는 비밀번호를 입력한건지 확인은 가능하겠죠

평문저장보다야 낫지만 이 방법도 안전하진 않아요

웬만한 해커들은 어떤 입력값이 어떤 값으로 해싱되는지
사전처럼 잔뜩 입력돼있는 데이터를 갖고있다구요
이걸 무지게 표, 레인보우 테이블이라고 해요

동물들 비밀번호 중에 하나라도 얻어걸리면
우리 전부 무지개 다리 건너는거에요

그럼 뭘 해야겠어요. 솔팅을 해야죠
솔팅이 뭐에요. 소금치는거죠
소금을 왜 쳐요. 여기에 뭘 더한다는 걸 비유로 말하는거에요

사용자의 비밀번호를 그대로 해싱하지 말고
가입할때마다 랜덤으로 나오는 값을, 솔트를 하나 만들어요
그 솔트값을 비밀번호와 합쳐서 해싱을 하고
결과값과 솔트를 사용자 테이블에 같이 입력해놔요

이러면 어떻게 되겠어요. 적어도 이 비밀번호들에 대해서는
레인보우 테이블이 무력화되겠죠

값이 한 글자만 바뀌어도 해시값은
완~전히 예측불가한 다른 값이 나오는거니까요

이 해싱과 솔트는 기본중에 기본중에 기본이에요

해싱 알고리즘을 안전하고 검증된 최신 걸로 갖다쓰기
해싱 돌리고 또 돌리기
비밀번호에 글자수 최소 제한은 두되 최대 제한은 두지 않기

등등 안전한 비번저장을 위해 할 수 있는게 넘쳐난다구요

근데 비밀번호를 투명하게 평문으로 저장하고 앉아있어요?
갈기털에 눈 가려져서 뵈는게 없어요?
내가 바리깡 갖다가 한 번 싹...

🩸 (피떡이 된다)

🦁 사자
여것이 산토끼여 선넘끼여
보안개발자 하나 있는거라고 대우해주니까
아주 미쳐가지고 헤까닥 실성을 혔나
토깽이시끼가 승질나게 아침부터
조조래빗이여?

👨 아빠
그렇게 사파리에는 보안담당이 없어졌어요

하지만 디즈니랜드단에서 이미 시큐리티가 탄탄했던터라
사파리가 털리는 일은 없었답니다

🤱 엄마
애한테 그런 고어한 얘기를 들려주면 어떡해요!

👨 아빠
애는 내가 이야기 시작할때 잠들었어. 우리도 이만 자자구요

🤱 엄마
별꼴이야 증말





관련 태그의 다른 영상들

CORS가 뭔가요?
성가시지만 알고 보면 우리편! CORS를 알아봅시다.
# CORS
# SOP
# 보안
<보안기초> 웹의 웹 공격과 방어
서비스를 위협하는 공격에는 어떤 것들이 있고 이를 어떻게 방어하는지 알아봅니다.
# 보안
# 해킹
# 인자변조
# XSS
# sql인젝션
# 비밀번호
HTTPS가 뭐고 왜 쓰나요?
대칭키와 비대칭키 개념과 함께 HTTPS의 목적과 원리를 간략히 알아봅니다.
# HTTPS
# 대칭키
# 비대칭키
# 공개키
# 개인키
# 보안
#
...
🌏 Why not change the world?