본문 바로가기
Web hacking/Nomaltic) 웹 해킹 수업 노트 👩‍💻

[11주차] 인증/인가 취약점 수업 필기

by m_.9m 2021. 12. 23.

일상 취약점
수다)
*방역패스
- 이미지만 보고 입장함
- 다른사람의 정보로 방역패스 보여줘도 내건지 확인하는 2차절차가 없음
*배민오더
- 서버인척하고 데이터를 넣어주면 치킨을 공짜로 먹을수있을까?
수업)
*인증/인가
-> 인증과 인가가 불충분해서 발생하는 취약점

인증: Authentictication
- 그 사람이 맞는지 확인하는 작업
Ex) 로그인 인증, 본인 인증, 휴대전화 인증, 카드 인증
인가: Authorization
- 권한을 부여하는 것
ex) 글 수정 허용, 삭제 등등...

---------------------------------------------------------------------
--인증 취약점 
-> 다른사람인 척 할 수 있다.
-> 인증 우회

= 인증 프로세스 우회
login -> main으로 페이지를 바로 넘김

-인증 프로세스 무시
세션 아이디를 탈취한 경우 마이페이지에 접속하는 것을 방지하기 위해서
: XSS
: MITM(중간자 공격)
http 

마이페이지 눌러서 비번하는거 무시하고 바로 mypage로 뛰어넘을수있음
repeater로 넘기면! 

인증 토큰(1회용) 사용한다.

* mypage_before.php
인증 성공 시 임시 토큰 발급(일회용)
2. mypage.php?token=sdk;akng;knrsg

*클라이언트 측 인증 Bypass
-비밀글 보면 검증을 자바로 하고 맞으면 보여줌
Burp suite을 이용해서 우회할수 있다.

-인가
다른사람의 글을 수정시
수정을 클릭했을때 서버에 어떤 데이터가 (요청)이 나가면 서버가 하는거고
아니면 자체적으로 클라이언트 서버가 검증하는건데 이건 쉽게 우회가 가능

*대응방안: 서버 측에서 검증한다


--인가 취약점
일상생활을 더 유익하게 만들어주는 지식

EX) 클래스 101 회원가입시 7글자 제한인데  Nomaltic 쓰고 싶어서 Burp suite에서 잡아서 수정함.
서버가 아니라 클라이언트 측에서 검증하기 때문에 패킷 잡으면 우회 가능

권한 검증 (인가) 불충분하기 때문에 발생한다.
EX) 다른사람의 글을 내가 바꾸고 싶다면
수정을 누르면 권한이 없다고 뜸
idx=67&id=mariosuper
id를 다른 사람 아이디로 바꾸면 되지 않을까? X
id는 가짜 데이터일까? 수정이 가능한 페이지에서 id를 아무거나로 바꿔봄 안쓰는 데이터구나!
안쓰는 파라미터가 모양만 있는 경우도 있음
수정 페이지에서 글번호만 바꿔주면 되지않을까? 이것도 안되면
 form page & process page 분리된걸 노려본다. ???
본인의 글을 수정할때 패킷을 잡아서 modify_action.php 에서 보여지는 패킷 확인
그 안에서 글번호만 바꿔본다. 성공시 프로세스에서 취약점이 있었던 것이다.

*인가 취약점의 대응 방안
세션을 이용한 서버측 검증 
프로세스에서 세션 검증 코드 if문을 하나 더 넣어준다.

*공격의 양상이 매우 다양할수있음
-만약 어떤 게시판의 파일을 다운로드 받음
로그인 하지않고 파일을 다운로드 받을 수 있다면?
-> 무료로 볼수있음
->파일 다운로드 페이지를 구현하고
세션 검증을 하면 대응할수있음

(1) SQL Injecion
사용자의 입력값을 검증하지 않고 입력값을 구문의 일부로 사용해서 임의의 질의문을 삽입하는 공격
> 서버 측에 임 SQL 질의문을 삽입하는 공격
1. 데이터 추출
2. 데이터 우회
Union / reflect/ Blind

*대응방안
- 사용자 입력 변수화(PreparedStatement)
- 화이트 리스트 필터링

어디가 안먹힐까요?
-정렬 order by 
select ~~~ order by [] []

sort=like_content&ord=desc
select * form based order by like_count ,1 desc

999 넣을시 500 에러나 게시글이 아무것도 안뜨면 내가 넣은 구문이 SQL문에 들어간다는 것.
*조건문
case when (조건) then (참) elsel (거짓) end
case when 1=1 then 1 else 99999 end
select * form based order by like_count ,(case when 1=1 then 1 else 99999 end) desc

숫자를 써도 '999' 문자열으로 취급되어서 들어감.
그럼 참과 거짓을 구분할 수 없다.
그럼 에러유발을 시도할 수 있다.
select * form based order by like_count ,(case when (1=1) then 1 else (select 1 union select 2) end) desc

select * form based order by like_count ,1 desc
거짓
select * form based order by like_count ,select 1 union select 2 desc
이건 구문이라 에러가 된다

--> 블라인드 SQL injection 수행하면 된다.

Prepared statement X
- Table 이름 
select ~~~ where [테이블]

EX) &search_option=title&search_form=test
where $_GET[search_option] like '%$_GET[search_form]%'='%test%'

where $_GET[1=1(참)    or      1=2(거짓)] like '%$_GET[search_form]%'=test


이럴시 대응방안 화이트리스트 기반 필터링
-인덱스화

ord = asc
ord= desc
if(ord == 'asc')
   sql = sql + 'asc'
else
   sql = sql + 'desc' 

table name도
if 컬럼이름
if 컬럼이름
--

(2) XSS
클라이언트 측 임의 스크립트 코드를 삽입하는 공격
-대응방안
HTML 특수문자들을 HTML Entity 방식으로 표현

(3)CSRF
피해자가 자신이 의도하지 않은 요청을 하게 만드는 공격
+XSS
-대응방안
중요한 요청의 경우 추측할수없는 값을 삽입해서 처리한다. 2차 인증이나 비밀번호 재입력, 토큰 

(4) File Upload/Download
- 파일 관리 DB
- DB를 통해서 파일의 경로, 이름 관리

(5) 인증과 인가
- 서버 측 검증을 한다.

*E2E 암호화
end to end 암호화

전체 데이터가 암호화되어서 패킷에 보내질때?
손도 쓸수없음

**프로젝트
-보통 취약점 없음으로 쓰고 나옴
접근 방법만!

내 컴퓨터 안에서 임호화가 이루어지는거라
내 컴퓨터 안 암호화 시키는 무언가를 찾아봐야한
[E2E 암호화 Bypass]
(1) void 0 는 아무런 반응 아닌것
이벤트핸들러가 있는지 검색해야함.
(2) 키워드들로 타고들어가면서 검색해봄
함수 정의를 쫒는다.
(3) 파라미터 정리 부분 찾음 암호화하는 함수 aJax.vestFire() 유추.
aJax를 확인해봐야함. 선언 부분 var aJax = new devon. xSync()
devon검색시 안나옴. 왜? <> 꺽세 스크립트안에서 가져와지기때문
(4) 같이 로드된 자바스크립트에서 devon을 찾을수있음
선언 부분있는 패킷에서  vestFire 찾음
여러 함수가있으면(아마 여기 살짝 수업 놓침)
코드를 넣어서 실행부분 찾음 alert (1) , alert(2) 
if 우회할때 prompt 제일 많이씀

인터셉트 걸고 로드시 찾은 this 앞에 prompt코드를 추가해줌
그럼 프롬프트가 뜨게됨
그럼 데이터 변조하고 프롬프트 안에서 인젝션이나 인증인가우회함.

False Position 
암호화 복호화시 암호화가 되서 왔을때만 복호화하고
평문은 평문으로 처리. 암호화 안돼서 오면 오류

> 그냥 해당 자바에서 암호를 발생하는 함수를 빼버림
패킷 안에 그럼 평문으로 벗겨진상태로 패킷이 넘어감 

-> E2E는 무조건 우회할수있다.

E2E 우회 방법
1.암호화하는 로직을 찾는다.
2. 찾았다면 다음의 방법을 선택한다
(1) prompt를 이용한 데이터 확인 및 변조
(2) False - Postive 이용, 평문으로 전송(평문되면 함수만 빼버림)
(3) 함수 후킹(모바일앱시 쓰임)