Natas Level 14 입니다.
ID와 패스워드 입력란이 보입니다.
로그인 폼 문제는 Natas에서 처음 나왔죠?
따라서 SQL Injection 문제일 것 같은 예감이 팍 듭니다. ( 대중적이며 강력한 공격기법이므로 )
일단 소스코드를 확인하겠습니다.
일단 로그인 기능을 하는 소스코드인 것 같은데요.. 우리가 ID와 패스워드 칸에 입력한 값을 SQL 쿼리에 대입하여 실행하고 있습니다.
mysqli_num_rows 함수를 이용해 로그인 성공여부를 판단하네요.
해당 함수는 쿼리에 대한 결과값 레코드의 개수를 반환하는 함수인데,
해당 값이 1이상이라면 우리가 입력한 아이디와 패스워드와 일치하는 계정이 있다는 소리이니 로그인 성공으로 판단하게 되는 것입니다.
그렇다면 방법은 둘중 하나입니다.
1. 인증과정 자체를 우회하기
2. DB 계정정보를 탈취하여 정상 로그인 하기
저는 1번 방법을 선택하겠습니다.
대표적인 인증우회 구문입니다.
이렇게 입력하게 되면 SQL 쿼리문을 변조하여 무조건 참(TRUE) 을 반환하게 할 수 있습니다.
ID를 따로 입력하지 않았지만 쿼리의 반환값이 참이라면,
결과적으로 해당 users 테이블의 모든 레코드를 출력하게 됩니다.
보통 그렇게 되면 계정 중 가장 먼저 생성된 계정, 즉 맨 위에 있는 계정(일반적으로 관리자 계정)으로 로그인 됩니다.
마지막에 -- (주석) 을 붙였기 때문에 Password 부분엔 아무 값이나 입력해도 됩니다. 주석처리 됩니다.
입력값은
' or 1=1 --
입니다.
이렇게 입력하고 Login을 눌러보면,
실패했습니다.
사실 인증우회 구문에는 다양한 방법이 있습니다.
또한, 쿼리문에서 '(쿼터) "(더블쿼터) 둘 중 무엇을 사용한지 모르기에 둘 다 시도해 봐야 하며
주석또한 DB마다 -- 또는 ## 로 갈리기 때문에 둘 다 시도해 봐야 합니다.
하지만 이번 문제의 소스코드에서 "(더블쿼터) 를 사용한다는 것을 알 수 있군요.
더블쿼터를 사용해 보겠습니다.
" or 1=1 --
입력했습니다.
실패입니다.
다시 시도합니다. 주석을 -- 가 아닌 ## 로 바꿔봅시다.
" or 1=1 ##
입력했습니다.
로그인 성공! password를 획득했습니다.
'Hacking > [Web]Natas' 카테고리의 다른 글
OverTheWire [Natas Level 16] (0) | 2023.03.28 |
---|---|
OverTheWire [Natas Level 15] (0) | 2023.03.27 |
OverTheWire [Natas Level 13] (0) | 2023.03.17 |
OverTheWire [Natas Level 12] (0) | 2023.03.16 |
OverTheWire [Natas Level 11] (2) | 2023.03.16 |