OverTheWire(나타의 레벨 14)

나타의 레벨 14.


레벨 14

아이디와 비밀번호 입력란이 보입니다.

등록 양식의 문제는 나타스에서 먼저 나왔죠?

그래서 SQL 삽입 문제일 수도 있다는 느낌이 듭니다. (대중적이고 강력한 공격기법이기 때문에)

먼저 소스코드를 확인하겠습니다.


소스 코드

우선 로그인 기능을 수행하는 소스 코드인 것 같습니다. ID 및 암호 필드에 입력한 값이 SQL 쿼리에 연결되어 실행됩니다.


비밀번호 획득 조건

mysqli_num_rows 함수는 로그인이 성공했는지 확인하는 데 사용됩니다.

이 함수는 쿼리에 대한 결과 레코드 수를 반환합니다.

값이 1 이상이면 입력한 아이디와 비밀번호와 일치하는 계정이 있다는 의미이므로 로그인에 성공한 것으로 간주합니다.

그렇다면 두 가지 옵션 중 하나입니다.

1. 인증 프로세스 자체를 우회

2. DB 계정 정보 도용 및 정상적으로 로그인

방법 1을 선택합니다.


첫 번째 공격

이것은 일반적인 인증 우회 구문입니다.

이렇게 입력하면 무조건 TRUE를 리턴하도록 SQL 쿼리문을 변경할 수 있다.

ID를 입력하지 않았지만 쿼리의 반환 값이 true인 경우,

결과적으로 이 사용자 테이블의 모든 레코드를 출력합니다.

일반적으로 이렇게 하면 생성된 첫 번째 계정인 최상위 계정(일반적으로 관리자 계정)으로 로그인됩니다.

–(주석)이 마지막에 추가되므로 비밀번호 부분에 아무 값이나 입력할 수 있습니다. 주석 처리됩니다.

입구는

‘ 또는 1=1 —

보지마.

이렇게 입력하고 로그인을 누르면


실패하다

실패한.

실제로 인증을 우회하는 방법에는 여러 가지가 있습니다.

저도 두 개의 ‘(분기)'(double quarter) 중 어떤 것이 쿼리문에 사용되는지 모르기 때문에 둘 다 시도해야 합니다.

주석도 각 DB별로 — 또는 ##으로 구분되므로 둘 다 시도하십시오.

그런데 이 문제의 소스코드가 “(double quarter)를 사용하고 있음을 알 수 있습니다.

더블 쿼터를 시도해 봅시다.


두 번째 공격

” 또는 1=1 —

들어갔다.


실패 2

그것은 실패입니다.

다시 시도하십시오. 주석을 — 대신 ##으로 바꾸자.


세 번째 공격

” 또는 1=1 ##

들어갔다.


구매 비밀번호

성공적 로그인! 비밀번호를 받았습니다.