[WARGAME] DVWA write-up/ SQL_Injection/ low

jckim22·2022년 10월 20일
0

[WEBHACKING] STUDY (WARGAME)

목록 보기
23/114

이번 문제는 SQL_Injection 취약점을 공격하는 문제이다.

먼저 코드를 보지 않고 웹페이지만 살펴보자.
User ID를 입력하면 그 유저의 First name과 Surname이 나오게 된다.

이걸로 유추해봤을 때 이 웹의 sql문은

select ID,FirstName,SurName from table where userid = '4'

대충 이런 식의 SQL 문일 것이다.

그럼 Sql을 Injection하여 원하는 응답과 다른 응답을 받아보자


아래 사진에는 숫자 대신 'or '1=1 -- 이라는 sql문을 삽입 했을 때의 결과이다.

select ID,FirstName,SurName from table where userid = ''or '1=1' -- 

sql문이 이런식으로 바뀌었을 것이다.
그 table에서 ID,FirstName,SurName을 가져오는데 userid가 없을때 참이거나 그냥 참 이라는 뜻이다.
그리고 그 뒤에 ;는 주석처리와 함께 의미가 없어진다.
결국 userid의 유무와 상관없이 그냥 참이기 때문에 모든 테이블의 데이터를 가져오는 것이다.

이제 다른 방법으로 패스워드 까지 가져오려고 했다.
그래서 union 문법을 사용하였다.
union은 두 개의 sql 문의 응답을 합쳐주는 것을 말한다.
그래서 나는 'union select * from users -- 이라는 sql문을 테이블 명과 컬럼명을 알아냈다는 가정하에 삽입했다.
이렇게 되면 union의 특성의 따라 처음 쿼리문의 컬럼명을 살리고 그 다음에 데이터를 붙이는 형식으로 모든 데이터가 나올 것이다.

하지만 아래와 같은 오류가 떴다.
오류를 해석하면 두 개의 select 문의 컬럼 수가 다르다는 이야기였다.

그래서 'union select user_id,user,password from users -- 로 컬럼명을 3개로 맞춰 주었다.
하지만 오류는 똑같았다.

이걸로 유추했을 때 id는 쿼리문에 포함되어 있지 않고 내가 입력한 값을 직접 사용했다는 것을 알 수 있다.
그렇다면 쿼리문에는 first name과 surname 두 컬럼만 사용되었을 것이니 나도 컬럼 수를 두 개로 맞춰줘야 한다.

그래서 'union select user_id,password from users -- 로 쿼리를 변경했더니 아래처럼 테이블 맨 아래부터 데이터를 가져와 두번째 쿼리의 값들이 출력되어 패스워드를 가져올 수 있었다.

profile
개발/보안

0개의 댓글