400점인 52번 문제를 풀어보자.
guest 계정으로 로그인하게 되면 다음과 같은 페이지가 뜬다.
문제에서는 $_SESSION['login'] == "admin"이고, $_SERVER['REMOTE_ADDR']의 ip주소가 172.17.0.으로 시작한다면 flag값을 얻을 수 있게 된다.
그러나 해당 문제에서는 HTTP Basic Authentication 취약점을 이용하여 문제를 해결할 것이다.
우선, 웹 인증에 대한 내용과 종류를 알아야 한다.
- 웹 인증이란?
웹에 접근하는 사용자가 허가 받은 사용자인지 확인 하기 위해 사용하는 인증 방법으로서, 주로 사용자를 확인할 때 ID/PW를 이용하여 인증한다.
- 웹 인증 종류
1) Basic Authentication
기본 인증
웹 서버에 보낼 아이디와 암호를 Base64 방식으로 인코딩 후 전달
사용자 계정은 시스템 계정(Server user ID/PW) 이용
2) HTTP NTLM Authentication
윈도우 통합인증
Explore와 IIS에서만 사용가능(제한적)
호환성을 위해 웹 인증에 NTLM은 사용되지 않음
3) HTTP Digest Authentication
Windows의 경우 Domain 계정을 이용하여 인증
MD5 Hash 값 이용
4) Anonymous Authentication
익명 인증
Web Server에서 제공하는 익명 계정을 이용하여 서버의 자원을 클라이언트에게 제공
사용자는 웹 사이트에 접속하면 인증절차 없이 접속이 가능하다
(관리자가 미리 인증한 상태)
5) Form Based Authentication
HTML Form 태그를 이용하여 인증 정보를 서버 측에 전송
Form 태그로 ID/PW를 입력하는 로그인 창을 생성
대부분의 웹 어플리케이션에서 사용하는 방식
SSL(port 443)을 이용한 암호화가 필요함
이제 공격 구문을 작성해 보자. request 헤더에 인증정보를 injection 할 것이다. 각 줄의 구분은 CRLF(%0d%0a)를 사용한다.
Authorization 헤더에 admin으로 인증우회하기 위해 base64 인코딩 한다.
Authorization:%20Basic%20YWRtaW4%3d%0d%0a
그 후 쿠키값과 http 버전(HTTP/1.1)을 담아줄 임시 헤더값을 넣어준다.
그리고 URL에 page파라미터에 전달하게 되면 FLAG값을 확인할 수 있다.
최종 url : page=/admin/%20HTTP/1.1%0d%0aAuthorization:%20Basic%20YWRtaW4%3d%0d%0aCookie:%20PHPSESSID=세션 값%0d%0atemp:%20
FLAG 값 : FLAG{Server_Side_Request_Forgery_with_proxy!}
Auth 페이지에 FLAG 값을 제출해보자.
'CTF & WarGame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 54번 문제 (0) | 2020.03.16 |
---|---|
[webhacking.kr] 53번 문제 (0) | 2020.03.16 |
[webhacking.kr] 51번 문제 (0) | 2020.03.15 |
[webhacking.kr] 50번 문제 (0) | 2020.03.15 |
[webhacking.kr] 49번 문제 (0) | 2020.03.15 |