모의해킹 이론

올빼미·2025년 1월 30일

설치해야할것!

  1. Burpsuite Community
  2. Visual Studio Code
  3. 코딩 폰트(D2Coding)
  4. Python
  5. Oracle
  6. SQL Developer

취약점 진단 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

  • HTML - 페이지의 틀.
  • Javascript - 페이지를 동적으로 만들어주는 역할, 스크립트 언어
  • CSS - 디자인 X

서버측 언어 -> Back-end


Web Server vs Web Application Server

1) Web Server = 웹 서버
정적인 페이지
사용자의 입력값을 처리 X
설정
2) Web Application Server = WAS
사용자의 입력값=파라미터
있을 때 저걸가지고 뭔가 처리하는 로직이 필요한 경우
비즈니스 서비스에대한 로직
DB 계산 결제 ...


DB

  1. Java + Oracle
    PHP + MySQL

  2. (Linux) + Apache + PHP + Mysql

  3. ASP + MSSQL -> Window Server IIS
    이미 예전에 개발을 해놨는데
    다시 갈아엎지 못해서 그냥 쓰는 사이트들


Well-known Port

22 SSH
80 HTTP
443 HTTPS


REST Api

  1. 기존 방식

게시판 글쓰기
GET test.com/board/write?board=qna
글수정
GET test.com/board/edit?board=qna&postid=글번호
글삭제
GET test.com/board/delete?board=qna&postid=글번호

  1. REST Api 국내 X

API 명세
일반인이 서버에서 영향을 끼칠 수 없으면

글쓰기
PUT test.com/board/qna/
글수정
MODIFY test.com/board/qna/2
글삭제
DELETE test.com/board/qna/2

취약한 HTTP Method 사용 취약점 항목 :
GET, POST를 제외하고
권한 검증이 제대로 되어있고
사용 목적이 명확한 메소드 이외의
메소드가 허용/사용을 하면 취약

WevDAV : 웹 어플리케이션 상에서 개발 하기 편하려고 만들어진 기능


파라미터 변조

  • 식별 - 누군지 구분 - 아이디
  • 인증 - 너인지 확인 - 비번
  • 인가 - 어디까지 ㄱㄴ - 권한
  1. Request에 파라미터를 바꾸기
    -> 서버에서 처리를 하고나서 결과가

  2. Response에 파라미터를 바꾸기
    -> Javascript

파라미터 변조 공격 Case
1. URL 유추 -> 직접 접근
2. 파라미터 유추 -> 파라미터 변조
3. 숫자(금액)
Integer Overflow -> 엄청 큰 숫자
Int -> -21억 ~ +21억


Session/Cookie 취약점 3가지

Javascript 실행

  1. HTML 안에서
  2. Tag 안에서 이벤트핸들러로 실행
  3. 외부파일 참조

정보 누출

1번 <!script>
2번 이벤트핸들러
3번 외부js

  • 원하는 함수 찾기 -> 개발자도구 - 소스
  • 파일 선택 Ctrl+F -> 현재 파일에서 찾기
    전체 파일 안에서 Ctrl+Shift+F -> 전체에서 찾기

서버에 요청을 보내 전! 브라우저에서
1. form 전송할때 실행
2. button을 클릭할때 실행
3. <!script>안에서 document. .. 지정해서 실행
4. 바깥에 있는 js실행


SQL Injection

: 쿼리문이 작동할 때 사용자가 입력한 문자열(파라미터)이 쿼리문으로 작동하는 것

ex) select * from 테이블 where 컬럼 = " ㅣ ㅏ ㅓ ㅣ ㅣ ㅏ ㅓ '

공격하면?
1. DB가 털림 -> 개인정보 유출
2. 해시화 되어있는 비밀번호 -> 크래킹 -> 계정정보를 이용 -> 로그인 -> 나쁜짓 ~
3. SQL Injection을 통해 서버에 원격 명령 실행, 임의 파일 업로드 . . .

==> DB에 있는 정보를 꺼낼 수 있다.

DB

테이터베이스 : 통합문서 1
테이블 : sheet1, sheet2 . . .
열 = 컬럼 = Column name
행 = 로우 = Row name

  1. 계정 생성
    ALTER SESSION
    CREATE USER 아이디 identified by 비밀번호;
    grant connect, resource, dab to test; /권한부여
  2. 테이블 생성
    create table FRIENDS
    (
    name varchar2(20),
    age number(4),
    addr varchar2(20),
    hobby varchar2(20)
    );
  3. 데이터 조작
    조회 select - 가장 많이 씀 ~
    삽입 insert
    수정 update
    삭제 delete
  • = 전체
    select 컬럼명 form 테이블명 where 조건 order by 컬럼명(컬럼번호)

    jsp = oracle
    php = mariadb
    asp = mssql

    중요한것!

  1. 쿼리문을 유추

  2. 공격 포인트를 찾기
    -- 취약점진단

  3. 실제 공격구문 작성해서 공격
    -- 모의해킹

    Union SQL Injection

    : 가장 쉽고 가장 많은 데이터를 한번에 뽑아낼 수 있음
    but 제약사항이 많음 = 컬럼의 개수, 컬럼의 자료형 맞춰여함

  4. 공격포인트 찾기

  5. 컬럼의 개수 알아내기
    2-1. 정렬기능
    select * from friends where name like '%멍멍%' order by 숫자
    : 숫자가 5인데 오류가 난다면? 컬럼이 4개 인거임~~
    2-2. null select null form dual에서 에러가 안날때까지 null을 추가

    1. 각 컬럼의 자료형 = 오라클만 이럼/딴 디비는 자료형 안맞아도 걍 햡쳐짐
      select * from
      union select null,null, null,null from dual;
      에서 null 자리에 자료형을 다 넣어보면서 어떤 자료형인지 알아내기
  6. 테이블명 알아내기
    select * from all_tables; / 모든 테이블 호출(모든 db
    select table_name from user_tables; / 유저의 모든 테이블 호출 (오라클만
    5.테이블의 컬럼명 알아내기
    select column_name from all_tab_columns where table_name = "탈취한테이블명'

  7. 테이블명과 칼럼명을 알아내면 union 사용가능 !
    union select 컬럼1, 컬럼2, 컬럼3 from 테이블

    Union 공격 다시 정리

  8. 쿼리문 유추
    select 칼럼들 ~ from 주소 where 읍/면/동 like '%[검색어]%'
    공격할라면 : select 칼럼들 ~ from 주소 where 읍/면/동 like '%검색어%' union [공격쿼리] and/where 'g%'='g%'
    select ~ where union select ~ where : 둘의 결과를 같이 보여줌
    검색어빈칸 : 검색어%' union [공격쿼리] and/where 'g%'='g

  9. 공격 포인트
    2-1) 삼성동을 쳤을때 에러가 안나니 문자열이라고 추측
    쿼리문 : where 읍/면/동 like '%삼성동%' and 't%'='t%'
    검색어 빈칸 : 삼성동%' [ ] where 'a%'='a
    'a%'='a 은 의미 없는 구문
    where이 있으면 and
    그냥은 where
    where 조건~

    Oracle vs MySQL/MariaDB

  10. 주석
    --,/* / VS #,--,/ */

  11. DB정보

  • 테이블 : all_tables, user_tables VS information_schema.tables

  • 컬럼 : all_tab_columns, user_tab_cilumns, cols VS information_schema.columns

  • 계정 : OWNER VS table_schema


    Error-based SQL Injection

    : 에러를 유발 시켜서 에러 메시지에서 원하는 데이터를 탈취

  • 서브 쿼리 : 하나의 테이블로 만들어서 다시 사용하는 거

  • 서브쿼리로 나온 결과 테이블은 원래 테이블과 별개

  • 컬럼명이바뀌었을때 바권걸로 써여함

    공격순서

  1. 쿼리문 유추
    select * from friends where name like '%[검색어]%'
    검색어 : 야옹%' and 1=CTXSYS.DRITHSX.SN(user,[공격쿼리]) and 'o%'='o

  2. 공격 포인트 찾기

  3. 에러 유발 공격
    3-1) 에러메시지
    3-2) 호출 시 쿼리 결과가 어디에 나오는지 확인
    3-3) 쿼리결과가 어디에 나오는지

  4. 테이블 찾기
    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. 컬럼찾기
    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. 데이터 탈취
    6-1) 탈취할 테이블의 데이터 개수
    select 컬럼 from 테이블
    select count(컬럼) from 테이블
    6-2) 데이터를 1row 씩개씩
    select 컬럼 from (select 컬럼, rownum as line from 테이블) where line = 1~count


    Blind SQL Injection

    : 유니온 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'이 댐

    SQL Injection 대응방안

  7. 근본적인 대응방안 : 쿼리문 수정
    내가 입력하는 값(파라미터, 요청에 전달되는 모든 값)이 쿼리문에 사용 될 때 무조건
    문자열(데이터)로 삽입이 되도록 개발

  • 1)

  • 2) prepared statement 방식
    나온 이유 : DB 성능
    컬럼과 테이블을 고정시켜서 여기에는 바인딩이 안되고

    • 100% 안전할까? 똑바로쓰면 100프로 안젠!!!
  1. 사용자 입력값 검증 -> filtering
  • Whitelist Filtering : 사용자 입력값에 대한 제한

  • Blacklist Filtering -> Blocklist Filtering : 못쓰게할거 지정

    Blind SQL Injection 심화

    Time-based Blind SQL Injection

    select * from 테이블 where 이름 like '%멍%' and [공격쿼리] and (시간을 많이 잡아먹는 쿼리) and 'q%'='q%'
    이라몬 db가 뻣어요
    (시간을 많이 잡아먹는 쿼리)

    Binary Search(이진 탐색)

    듀아~!

    세션과 쿠키

    세션 : 서버에 저장하는 정보
    쿠키 : 브라우저에 저장하는 정보

    세션id : 세션을 구별하기 위한 id(이름)
    세션id = 로그인을 마친 인증값

    취약점 _

    1. 세션 재사용
      : 탈취한 세션 ID 쿠키값을 내가 쓰니까 피해자 권한을 탈취
      -> 최소한 서버 접속자의 IP를 체크

    세션 재사용_보안솔루션

  1. 최소한의 인증 : ip -> but 한계가 있음

  2. 쿠키값 탈취를 못하게
    cookie:PHPSESSION=asdf; HttpOnly

    1. 세션 고정 - Session Fixation
    2. 세션 만료
    3. 유추가능한 인증정보

    XSS

  3. Reflected XSS
    요청->서버->응답->스크립트가 사용자 브라우저

  4. Stored XSS
    요청->서버->DB
    DB->서버->사용자 브라우저 스크립트

  5. Dom XSS = 국내에서 잘 안씀

    copy클립보드
    주소

    대응 방안

  6. 공격에 필요한 문자들을 전부다 HTML Entitiy Replace -> HTML 인코딩
    ! 어디에서 할지 ㅋ
    1) 저장 시
    + 장점 : 저장할 때부터 공격구문 실행이 되지 않게 저장
    + 단점 : 데이터 무결성
    2) 조회 시
    + 장점 : 무결성이 보장
    + 단점 : 사용자가 DB 내용을 조회할수 있는 '모든메뉴'에서 치환


    Reflected XSS

  7. 공격 포인트

  8. 공격 유형

    Javascript 함수 호출
    1) 태그와 태그 사이
    2) 태그 안에 입력값이 들어갈 때
    3) 이미 스크립트 태그 안에 입력값이 들어갈 때

  • 공격포인트
    keyword에서 먼저 키워드를 넣어보고 test1 test2 test3 이렇게 넣고
    특수문자 넣어보고
    특수문자가 치환이 안되고 나온다 > 공격 포인트

  • Reflected
    : n번의 공격으로 한번이 걸림 = 사용자 과실

  • Stored
    : 한번의 공격으로 여러번의 공격이 옴

    XSS 하는법

    1. 공격포인트 찾기
      = 이후에 코드에 절대 없을거같은 문구 예를 들어 SKR같은걸 넣어봄
      리피터에서 SEND했을때 RESPONSE에 결과가 나오는 포인트를 찾음
    2. 공격구문을 넣기위해 평문을 탈출을 위한 특수문구 치환 확인
      치환이 되면 -> 공격포인트는 안댐
      치환이 안되면 -> 공격할수 있는 여부가있음!
    3. 자바스크립트코드를 보고 탈출할수 있는 여부를 확인하여 공격구문을 넣기

    Stored XSS

    공격 스크립트 -> 입력 -> 저장
    조회 -> 실행

    1. 응답에 노출되는 요청 파라미터 찾기
    2. 입력값 노출 유형 확인 ( 태그와 태그사이, 태그안, 스크립트안 )
    3. 공격에 필요한 특수문자 치환 여부확인 <>"'();

      CSRP (Cross-site Request Forgery)

      : 피해자에게 서버로 요청을 보내게 해서 몰래 해당 기능을 실행시키는 공격

    XSS vs CSRF

    • XSS
      취약점 : 실행만 되면
      대응 : 브라우저에서 스크립트가 실행이 안되도록 응답을 인코딩
  • 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
profile
시들시들한 올빼미

0개의 댓글