Natas Level 24 입니다.
저번 레벨과 같이 Password 입력폼이 하나 있군요.
아무 값이나 넣어 봤지만 당연하게도 인증 실패로 Wrong! 문자열을 출력했습니다.
소스코드를 봐봅시다.
소스코드입니다. 이번에도 짧네요. 아주 좋습니다.
저번 레벨 코드보다 더 간단한데요? 그냥 맞는 패스워드를 입력하면 됩니다.
단, 조건문이 strcmp함수로 이루어져 있군요.
strcmp 함수는 문자열을 비교하는 함수입니다.
문자열이 같을 경우 -> 0
다를 경우 -> 0이 아닌 정수 ( 상황에 따라서 음수, 양수 모두 출력함 )
쉽게 말해서, 같으면 FALSE 다르면 TRUE 를 출력합니다. 또한, 대소문자를 구별합니다.
위 소스코드엔 !strcmp 이렇게 !(NOT) 연산이 들어가 있으니, 올바른 패스워드를 입력하면 통과되겠네요.
어떻게 해결해야 할까요? 소스코드에서 패스워드는 <censored> 이렇게 검열되어 있으니 말이죠.
Brute force를 시도해야 하는 걸까요? 사전파일이나, 정해진 범위도 없이?
아닙니다. strcmp 함수만의 우회 방법이 따로 존재합니다.
strcmp 함수는, 인자로써 문자열 형태가 아닌 것을 입력받을 경우(배열 등) NULL 값을 출력합니다. 이것을 이용하는 방법입니다.
PHP의 일부 버전에서는, NULL 값에 특정 연산을 할 경우 TRUE 값을 반환합니다. ( 일종의 취약점입니다 )
!NULL -> TRUE
NULL == 0 -> TRUE
위 사진처럼, 이렇게 2가지 연산이 TRUE를 반환하게 됩니다.
자, 해당 문제 소스코드에서 조건문이 어떻게 사용되고 있죠?
if(!strcmp ..... 이렇게 진행되죠? 친절하게도 strcmp 함수에 NOT연산을 직접 해주고 있습니다!!
그렇다면 우리가 해야 할 일은, 어떤 값이든 배열 형태로 전달하기만 하면 되는 겁니다.
일단 가장 간단한 방법.
URL 칸에 passwd[] 형태로 아무 값이나 전달해 주면 됩니다.
passwd 뒤에 [] 를 붙임으로써, 배열 형태로 인식되게 하는 것입니다.
두번째 방법.
Burp Suite로 패킷을 잡아, 1행에 보이는 것처럼 입력해 주면 됩니다.
import requests
username = 'natas24'
password = '0xzF30T9Av8lgXhW7slhFCIsVKAPyl2r'
url = f"http://{username}.natas.labs.overthewire.org/?passwd[]=asdfasdf&debug=true"
response = requests.post(url, auth=(username, password), )
print(response.text)
세번째 방법입니다.
파이썬 코드로 위와 같은 내용을 전달해 주면 됩니다.
코드 실행 결과입니다.
2행에서 다음 레벨 password를 확인할 수 있습니다.
어떤 방식으로 무엇을 전달하든, 배열 형태로 전달하기만 하면 password를 획득할 수 있습니다.
strcmp함수의 특성과 PHP 일부 버전 취약점을 이용한 방법이었습니다.
===============
참고하기 좋은 블로그 글 링크입니다.
'Hacking > [Web]Natas' 카테고리의 다른 글
OverTheWire [Natas Level 25] (2) | 2023.05.22 |
---|---|
OverTheWire [Natas Level 23] (0) | 2023.04.11 |
OverTheWire [Natas Level 22] (0) | 2023.04.05 |
OverTheWire [Natas Level 21] (0) | 2023.04.04 |
OverTheWire [Natas Level 20] (0) | 2023.04.04 |