이번 주차를 마지막으로 대표적인 웹 해킹 기법 정리를 마치도록 하겠습니다.
이때까지 공부했던 것을 알아보면
1. SQL Injection: SQL을 삽입하여 공격자가 원하는 SQL문 을 실행시키는 공격
2. XSS: 스크립트를 삽입하여 클라이언트 측에서 공격자가 원하는 스크립트를 실행시키는 공격
3. CSRF: 피해자가 서버로 공격자가 원하는 요청을 보내게하는 공격
4. File Upload: 공격자가 원하는 파일을 서버에 업로드할 수 있는 공격
5. File Download: 서버에서 공격자가 원하는 파일을 다운로드 할 수 있는 공격
간단하게 이런 공격이었다는 것만 정리해보았습니다.
이번에 할 것은 인증&인가 취약점입니다.
인증 취약점은 초반에 간단하게 하고 넘어갔는데 대표 케이스를 통해 다시 알아보겠습니다.
인증이란? (Authentication)
본인이 맞는 지 확인하는 작업이라 생각하시면 됩니다. 예를 들어 Id와 Password를 사용하여 본인인지 확인하는 것이 있습니다.
인증 취약점 대표 케이스
1. 쿠키를 통해 인증을 할 경우 (admin 계정 로그인)
Step 1) 일반 계정 로그인후 확인
로그인을 하고 쿠키 정보를 보니 loginUser에 유저정보가 포함되는 것을 확인할 수 있습니다.
Step 2) loginUser로 로그인을 확인하는 것 같으니 admin으로 바꿔보겠습니다.
loginUser를 admin으로 바꾸니 admin 계정으로 로그인됩니다.
여기서 알 수 있는 것은 인증을 클라이언트 측 정보로 인증을 하면 안됩니다. 쿠키 정보는 얼마든지 사용자가 조작을 할 수 있기 때문입니다.
2. 프로세스 점프 (다음 단계로 그냥 넘어가기)
어떤 행동을 하기위해 여러 절차를 거치는 경우 바로 다음 단계를 직접 접근하여 넘어갈 수 있습니다.
Step 1) 다음 단계로 넘어가기위해 확인을 누릅니다.
Step 2) 다음 단계로 넘어가기 위해 관리자 인증이 필요합니다.
파일 명을 보니 Step1, Step2 이렇게 증가하는 것을 보니 다음 단계는 Step3로 추측해볼 수 있습니다.
Step 3) step3 파일 직접 접근
다음 단계의 파일을 추측하여 직접 접근하여 인증을 우회할 수 있습니다.
예를 들어 회원가입에서 약관 동의 -> 본인 인증 -> 회원 가입 이렇게 단계별 절차를 밟아 회원가입이 돼야하는 데 직접 접근으로 회원 가입페이지에 바로 접근하면 본인 인증 없이 회원가입을 할 수 있게 되는 것입니다.
이렇게 전 단계를 거치지 않고 다음 단계를 요청할 경우 접근이 안되도록 막아야합니다.
3. 파라미터 응답값 변조
파라미터 응답값에 인증 정보를 포함하여 인증하는 경우 응답값을 변조하여 인증을 우회할 수 있습니다.
Step 1) 로그인 실패 경우
로그인을 실패할 경우 result에 fail이라는 값을 넣어 응답하여 로그인을 성공 여부를 확인합니다.
Step 2) 로그인 성공 경우
로그인 성공 시 result에 ok라는 값이 포함되어 응답이 오며 이것을 통해 로그인을 성공시켜 줍니다.
그럼 admin으로 로그인 후 실패했을 경우의 fail 값을 ok로 바꿔주면 인증을 우회할 수 있습니다.
Step 3) 응답값 변조
intercept로 패킷을 잡아 result 값을 ok로 바꿔줍니다.
admin 계정으로 로그인할 수 있습니다.
이 경우 인증을 자바스크립트로 즉, 클라이언트 측에서 실행하고 있어 이런 우회가 가능합니다.
그렇기 때문에 인증을 처리하는 것도 클라이언트 측에서 실행되면 안됩니다.
4. 무차별 대입 공격
위의 경우가 아니라도 가능한 경우의 비밀번호를 모두 시도해봄으로써 인증을 할 수 있습니다.
비밀번호가 숫자 4자리라고 합니다. 그럼 0000부터 9999 까지 만번 시도해본다면 어느 한가지는 맞을 수 밖에 없습니다.
저는 빠른 공격을 위해 파이썬으로 짜보았는데 이런 코드를 짜는 것은 간단합니다.
import requests # 요청을 위한 라이브러리
url="http://ctf.segfaulthub.com:1129/6/checkOTP.php" # 공격 대상
# 만번 수행
for i in range(10000):
code = str(i).zfill(4)
param = {'otpNum': code}
res = requests.get(url=url, params=param)
print(code)
# 만약 실패가 아닐 경우 반복 종료후 출력
if "Fail" not in res.text:
print(code)
break
이렇게 간단한 비밀번호를 사용하면 무차별 대입 공격으로 비밀번호를 알아낼 수 있고 인증을 우회할 수 있습니다.
이 경우는 비밀번호 인증 횟수 제한이 없기때문에 발생하기 때문에 인증 횟수는 제한을 해야합니다.
이렇게 인증에대한 대표적인 케이스를 살펴보았고 다음에는 인가 취약점에 대해 알아보겠습니다.
'웹 해킹' 카테고리의 다른 글
[주통기반] 로컬 웹 서버 취약점 찾기 (SQL Injection) (0) | 2024.03.22 |
---|---|
웹 해킹 공부 일기장 12 - 2 (인가 취약점) (0) | 2024.02.23 |
웹 해킹 공부 일기장 11 - 2 (파일 다운로드) (0) | 2024.02.19 |
웹 해킹 공부 일기장 11 - 1(파일 업로드) (0) | 2024.02.18 |
웹 해킹 공부 일기장 10 - 1 (File Upload 취약점) (0) | 2024.02.08 |