위 사진은 에러입니다.
이번 문제는 sql_injection이다.
먼저 low와 다른 점은 user_id를 입력하는 것이 아닌 아래처럼 select 폼을 이용해서 제출하는 형식이었다.
이렇게 되면 직접 입력으로 sql문을 삽입할 수는 없고 프록시로 패킷을 가로채 요청 내용을 조작하는 수 밖에 없었다.
일단 패킷을 잡아보았다.
low레벨과 달리 GET 메서드가 아닌 POST 메서드로 서버에 http요청을 하고 있다.
아래 id페이로드가 3으로 되어 있는 곳에 sql문을 삽입하면 되겠다.
먼저 low와의 서버 코드의 차이점을 알기 위해 똑같이
' or 1=1 --
이라는 sql구문을 넣어 조작하였다.
하지만 아래와 같은 문법 에러가 나왔다.
에러의 내용을 보면 '에 문제가 있는 것을 알 수 있었고 전에 있던 '가 없는 형태라는 것을 알 수 있었다.
그래서 먼저 오류가 나지 않게 1이라는 값은 그대로 두고 or 연산으로 모두 참이되게 하여 모든 유저를 조회할 것이다.
그러면 아래와 같이 모든 유저가 성공적으로 조회가 된다.
이제 진짜 목적인 유저들의 패스워드를 알아내보자.
low에서 했듯이 union을 이용할 것이다.
union select user_id, password from users --
union의 특성상 컬럼 수가 맞아야하는데 아마 low에서 처럼 id는 바로 변수로 받고 sql문에서 찾는 컬럼은 2개일 것이기 때문에 아래와 같이 user_id,password를 찾아주는 코드를 삽입한다.
그럼 아래처럼 모든 해쉬처리된 패스워드를 얻을 수 있다.
low에서도 말했지만 union의 특성상 전자의 컬럼 기준으로 전자의 데이터들 아래에 후자의 데이터들이 오게 된다.