Root Me 에서 제공하는 SQL Injection 문제
문제의 목표는 취약점을 이용해 administrator 의 비밀번호를 빼앗는 것이다.
문제페이지에 접속하면
이렇게 간단한 로그인 창이 나오게 된다.
시험삼아 Login / Password 에
admin / admin 이라고 입력해봤다.
당연하게 Error : no such user/password 라는 문구가 출력된다.
웹을 구현할 때 DB와 상호작용하는 로그인창, 게시판, 검색창 등등 부분에
SQL(Structrued Query Language) 이라는 DB 언어를 이용해
데이터를 불러오고, 또 저장하는데
서버에서 DB로 전달하는 SQL문을 비인가자가 조작이 가능할 경우 취약점이 발생한다.
SQL 인젝션 취약점이 존재하는지 알아볼 수 있는 가장 쉬운 방법은
작은따옴표( ' ) 하나를 입력해보는 것이다.
아이디를 입력하는 칸에 작은따옴표를 입력했을때
위처럼 syntax error 가 난다면 SQL Injection 취약점이 있는것이다.
SELECT * FROM users WHERE username= '사용자 입력값'
SQL 쿼리가 위처럼 최초에 작성이 되어있다고 가정하고
만약에 아이디 칸에 hello 라고 입력했다면
SELECT * FROM users WHERE username= 'hello'
이런식으로 DB로 전달이 될 것이다.
그런데 아까처럼 작은따옴표를 입력한다면,
SELECT * FROM members WHERE username= '''
이렇게 입력이 들어가게 되는데 여기서 문제가 발생한다.
작은따옴표는 하나를 열었으면, 하나를 닫아줘야 한다.
즉, 작은따옴표의 총 개수가 홀수가 되면 안된다.
그런데 위처럼 작은따옴표의 개수가 홀수일 경우 아직 닫히지 않은 작은따옴표가 생기기 때문에
에러가 발생하는 것이다.
이제 본격적으로 로그인 절차를 우회해 본다.
' or 1=1-- - 라고 입력을 하게되면
SELECT * FROM users WHERE username= '' or 1=1-- -'
이런식으로 쿼리가 전달될 것이다.
여기서 1=1 은 참(True) 이고, 참과 or을 하면 그 결과 역시 참이기 때문에
WHERE(조건절)이 항상 참인 결과가 나오게 된다.
그리고 아직 닫히지 않은 맨끝의 작은따옴표는 주석(-- -)을 입력해 줌으로써 없애버릴 수 있다.
그럼 결국 DB로 전달되는 쿼리는
SELECT * FROM users 가 되어서 로그인이 우회된다.
로그인이 성공되어서 user1 이라는 계정으로 접속된 것이 보인다.
하지만 원하는 계정은 admin 의 계정이기 때문에 한가지 더 작업이 필요하다.
아까 user1 계정으로 로그인이 된건,
테이블에 user1 계정이 맨 위에 있기 때문인데,
다른 계정으로 로그인하고 싶다면 limit 를 사용하면 된다.
' or 1=1 limit 1,1 -- - 이라고 입력하면 두번째 계정을 불러올 수 있다.
그러면 admin 계정으로 로그인이 되어지는데
비밀번호가 ㅇㅇㅇ 으로 마스킹되어있어 바로 확인이 불가하다.
f12를 눌러 해당 페이지의 웹 소스를 확인해보면
마스킹되어있던 admin의 비밀번호를 확인할 수 있다.
'워게임 > Root Me' 카테고리의 다른 글
[Root Me] SQL injection - Authentication - GBK - 웹해킹 / Burp Suite (50) | 2022.09.26 |
---|---|
[Root Me] SQL injection - String - 웹해킹 (62) | 2022.09.23 |
[Root Me] Logs analysis - web attack - 포렌식 / 로그분석 / Python (58) | 2022.09.15 |
[Root Me] ELF x86 - Stack buffer overflow basic 2 - 포너블 / 버퍼오버플로우 (42) | 2022.09.11 |
[Root Me] IP - Time To Live - 네트워크 / Wireshark (60) | 2022.09.08 |