문제에서 알 수 있는 힌트는 다음과 같다.
- 로그인할 수 있는 아이디와 패스워드
- 관리자 계정이 존재
문제들을 풀다보니 로그인하는 과정에서 쿠키를 변조할 수도 있었고, 리다이렉트할 때 패킷을 변조할 수도 있었다. 그래서 패킷을 확인했을 때 role이 별도로 있는지 확인했는데 내 좁은 시야에서는 확인할 수 없었다.
sql인젝션 가능성을 확인해보자.
normaltic1' OR '1'='1 #
userId에 위와 같이 넣고 패스워드를 아무거나 입력했을 때 normaltic1 로 로그인되었다.
다른 문제 중에는 패스워드가 별도 sql로 있어 #으로 주석처리해도 생략되지 않는 경우들이 있었는데, 이 문제는 그렇지는 않았다.
아무튼 일단 인젝션공격이 가능한 상태라는 것이다.
패스워드랑 상관없이 normaltic1 대신 아이디를 알아내거나, 아까 role처럼 권한을 변경해줘야 하지 않을까 싶다.
여러 sql문을 의심해보다가 아이디에 다른 결과값이 나오는 것을 확인하기도 했다.
normaltic1' OR '1'='1' #
맨 뒤 주석 직전에 ' 으로 닫아주었을 때 normaltic1이 아닌 login_acc 로 로그인되는 것을 확인할 수 있었다.
그렇다는건 현재 상황은 normaltic1로 접속을 시도했지만 db의 다른 데이터가 반환되었음을 유추해볼 수 있다.
그리고 normaltic1 이라는 아이디가 있음에도 불구하고 login_acc로 로그인되었다는 것은 sql이 어떻게 되어 있는지 정확히 알 수는 없지만 대충 or 뒤의 구문으로 인해서 첫 번째 값이 들어와 있는 것이 아닌가 생각했다.
normaltic1' or '1'='1' limit 0,1 #
첫번째 값을 찾는 방법은 0번 row를 가져오는 것이고, 예상대로 login_acc 로 로그인되었다.
normaltic1' or '1'='1' limit 1,1 #
그래서 나중에 완전탐색을 하더라도 일단 바로 다음 값을 가져와봤는데 바로 답이 잘 나왔다.
'개발 > 코딩테스트' 카테고리의 다른 글
[CTF | JavaScript] segfault practice - SQL Injection 2 (1) | 2024.05.24 |
---|---|
[CTF] segfault practice - SQL Injection 1 (0) | 2024.05.23 |
[CTF | JavaScript] segfault practice - Pin Code Crack (0) | 2024.05.16 |
[프로그래머스 | JavaScript] 문자열 겹쳐쓰기 (0) | 2023.11.07 |
[프로그래머스 | javascript] 정사각형으로 만들기 (0) | 2023.10.11 |