본문 바로가기
요즘공부

CLASS101 화이트햇 해킹, IT 취준생과 현직개발자를 위한 웹 해킹 입문 강의 공부4

by 게으른 피글렛 2024. 12. 15.
반응형

사이트 : CLASS 101 

강의명 : 화이트햇 해킹, IT 취준생과 현직개발자를 위한 웹 해킹 입문

 

공부 내용

3. 웹해킹

1) OWASP TOP10 알아보기

사이트 : https://sucuri.net/

RESOURCES -> GUIDE -> OWASP Top Security Risks & Vulnerabilities 2021 Edition 클릭

 

  1. Injection : 공격자가 악의적인 데이터를 삽입하여 애플리케이션의 SQL, LDAP, XML 등의 쿼리를 변조하거나 실행시켜 시스템을 공격하는 취약점.
  2. Broken Authentication : 인증 시스템이 약하거나 잘못 구현되어 공격자가 사용자로 가장하거나 계정 탈취가 가능한 취약점.
  3. Sensitive Data Exposure : 민감한 정보(비밀번호, 신용카드 번호 등)가 암호화되지 않거나 안전하게 저장되지 않아 유출될 위험이 있는 취약점.
  4. XML External Entities (XXE) : XML 파싱 시 외부 엔티티가 참조되어 시스템 파일을 읽거나 원격 서버와 통신하는 등의 공격을 가능하게 하는 취약점.
  5. Broken Access Control : 사용자가 자신의 권한을 넘어선 리소스에 접근할 수 있게 되는 취약점. 권한이 없는 사용자가 중요한 정보에 접근할 수 있음.
  6. Security Misconfigurations : 시스템, 서버, 데이터베이스 등에서 잘못된 설정이나 기본값을 사용하여 보안이 취약해지는 상태.
  7. Cross Site Scripting (XSS) : 공격자가 악성 스크립트를 웹사이트에 삽입하여 다른 사용자의 브라우저에서 실행시키는 공격.
  8. Insecure Deserialization : 신뢰할 수 없는 데이터를 역직렬화할 때 발생하는 취약점으로, 공격자가 악의적인 데이터를 주입하여 코드 실행이나 서버를 공격할 수 있음.
  9. Using Components with Known Vulnerabilities : 알려진 취약점을 가진 라이브러리나 컴포넌트를 사용하는 경우, 이를 통해 공격자가 시스템을 침해할 수 있음.
  10. Insufficient Logging and Monitoring : 보안 이벤트나 공격을 감지할 수 있도록 충분한 로깅과 모니터링이 이루어지지 않아, 사고 발생 시 신속하게 대응할 수 없는 취약점.
 

 

 

2) SQL Injection

공격방법: 개발자의 의도 범위를 벗어남.

id 와 pw 에 내가 기존에 입력해두었던 DB값이 아닌 다른 값을 넣어 로그인을 시도함

-- 올바른 id, pw 입력시, 

 

-- 잘못된 id,pw 입력시

 

<SQL Injection 공격하기>

id 부분에 잘못된 문구를 넣어 로그인을 시도함

1) id를 알고 있을 경우

id : admin'--

// '를 넣으면 '의 개수가 홀수가 되어 오류가 발생함 그뒤로 -- (주석)을 넣어 오류를 잡음

 

결과 : 로그인성공

 

2)  id를 모를 경우

id : aaaa' or 1<2--

//참값을 넣어 query문을  참값으로 만들고, -- 로 뒷부분은 주석처리함

 

결과 : 로그인 성공(DB내의 user id중 가장 첫번째값이 출력됨)

 

** SQL Injection 방어 방법

1) ' 가 문자로 인식되지 않도록 함

id='admin\' -- '

단점 : id에 숫자가 있을 경우 해결되지 않음

$ cd var/www/html
$ sudo vi login.php

 

addslashes 문구 추가

 

결과 : 역슬래시 생성됨 로그인 실패

 

 

2) Prepared Statement 방식 : 사용자 입력 범위 지정

$ cd var/www/html
$ sudo vi login_safe.php #login_safe.php 파일 생성

 

아래 코드 입력

(중간부 prepared statement 부분 확인)

<?php
$id = $_GET['id_box']; 
$pw = $_GET['pw_box']; 

$db_conn = mysqli_connect("localhost", "webhacking", "webhacking", "login");

if(!$db_conn) {
    echo mysqli_connect_error();
    echo "connect error";
    exit();
}

$query = "select id from user where id=? and pw=?";
$stmt = mysqli_prepare($db_conn, $query);

if($stmt === false) {
    echo('prepared statement failed : '.mysqli_error($db_conn));
    exit();
}

$bind = mysqli_stmt_bind_param($stmt, "ss", $id, $pw);

if($bind === false) {
    echo('binding failed : '.mysqli_error($db_conn));
    exit();
}

$exec = mysqli_stmt_execute($stmt);

if($exec === false) {
    echo('execute failed : '.mysqli_error($db_conn));
    exit();
}

$result = mysqli_stmt_get_result($stmt);
$result_chk = 0;

if($result) {
    if($row = mysqli_fetch_assoc($result)) {
        echo "id = ".$row['id'];
        $result_chk = 1;
    } else {
        echo "login failed";
    }
    mysqli_free_result($result);
    mysqli_stmt_close($stmt);
} else { 
    echo "query error";
}

mysqli_close($db_conn); 
?>

 

login_safe.php를 login.html에 반영해주어야함

$ sudo vi login.html
# html에서 실행 php 파일 수정

 

결과: Prepared Statements 로 인해 로그인 실패

 

<Reflected XSS 공격하기>

공격방법 : 요청에 따라 반사되는 응답을 통해 공격하는 방법

사이트 : https://xss-game.appspot.com/

사이트로 대신 테스트 할 수 있음

 

창에 test123 입력 -> 결과값에 내가 입력한 값이 그대로 출력됨을 확인할 수 있음

get 방식으로 출력됨을 추측할 수 있음

 

값에 

<script>alert('3');</script>

입력

 

결과 : 성공

 

 

** XSS 방어 방법

범위를 벗어날수없도록 특수문자 필터링 필요함

필터링 방법

1) HTML Entity Encoding(추천) -> 화면에는 특수문자로 표현되나 HTML 코드로 취급되지 않게 변환하는 방식

2) 직접 서버에서 특수문자 필터링

 

 

 

강의를 마치며

강의 추천 사이트 및 공부방법

학습사이트
https://w3schools.com

https://opentutorials.org

wargame 추천사이트

강의시 다뤘던 사이트

- SQL Injection https://los.rubiya.kr/
- XSS https://xss-game.appspot.com/

(인코딩사이트 : https://www.urlencoder.org/ko/)

 

그 외
https://webhacking.kr
https://suninatas.com
https://dreamhack.io

 

해답은 여러 사이트에서 다뤄지고 있으므로 검색할 것

 

추천책
1. 그림으로 배우는 http & network basic
2. 웹해킹 & 보안 완벽가이드

반응형