워게임/Root Me

[Root Me] SQL injection - Authentication - 웹해킹

SecurityMan 2022. 9. 18. 11:00

 

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의 비밀번호를 확인할 수 있다.

반응형