본문 바로가기

보안

[웹해킹] SQL인젝션

DVWA 를 이용해서 SQL인젝션을 해본다.

안의 구조를 보니 숫자값을 입력하면 그에 맞는 아이디를 보여주는 방식이였다

1 번이 admin 으로 데이터베이스에 등록이되어있어서 위의 UserID 에 1 을입력하면

admin이라는 아이디를 보여준다.

그럼 위와같은 동작을하게되는 SQL 구분을 생각했을때

select 컬럼 from 테이블명 where userid=' ' 이와 같은 구분형태로 되어있을것이고

위의 화면에서 값을 넣으면

where= 뒤의 싱글쿼터(') 사이에 값이들어가서 그에맞는 값을 보여줄것이다.

위에서 말한것처럼 1을 넣었을때 admin이 나오는걸봐서는

select userid from member where useid= '1' => admin 이 나오는것으로 예상이된다 .

(컬럼과 테이블명은 그냥 상상만한것)

그렇다면 where 문법을 무시할수있는방법을 사용하면 조건이 걸리지않고

모든 정보를 볼수있을것이다.

이때 사용할것은 or 연산자이다.

일단 싱글쿼터 사이에 값이들어가기때문에 싱글쿼터도 잘 처리해줘야한다

입력창에 싱글쿼터(') 를 입력을한다면

where userid=' ' ' 이러한 형태가될것이고. 조건을 간단하게 뛰어넘을수있을것이다

하지만 뒤의 싱글쿼터가 하나 더 남기때문에 주석을 이용해서 이를 제거해줘야한다.

주석은 # 으로 처리한다.

where userid = ' ' # ' 를 사용하면 완전히 조건을 빠져나오면서 에러가나지않은 문법이 된다.

이제 or 문법을 이용해서 모든것을 꺼내보자.

' or 1 #

위와같이 ' or 1 # 이 문법이 어떠한 형태가되는지 잘생각을해야한다.

where userid = ' ' or 1 이러한 형태가 될것이다. 물론 뒤에 # ' 라는 주석이있을것이다.

그럼 조건이 or 로 1 이되어 참이되었기때문에 모든 값이 이 조건에 충족할것이고 값을 꺼낼것이다.

출력된 값을 보니 DB에있는 모든 id를 보여주고있다.

그럼 이 뒤에 우리가원하는 정보가 더있다면 union문법을 이용해서 시도해볼수있을것이다.

그전에 union은 컬럼의 갯수가 맞아야하기때문에 몇개의 컬럼이 있는지 확인해보자

컬럼 확인 방법은 두가지가있다 두가지 모두 해보자.

컬럼의 수 확인 -union 사용

union을 할때 컬럼의 수가 다르면 에러가 나는데 이걸이용해서 에러가안날때까지 해보는방법이있다.

먼저 ' union select null # 을 해보자.

만약 앞에있는 테이블의 컬럼수가 1개라면 문제없이 실행될것이다.

결과

에러가났다.

그렇다면 null 을 두개로 늘려보자.

' union selcet null,null # 을 한결과 정상적으로 처리된모습이다

이를통해 컬럼이 두개라는 것을 알수있다.

컬럼의 수 확인 -order by 사용

orber by 를 이용해서 1번 컬럼 을 기준으로 정렬 , 2번컬럼 기준으로 정렬 을 시킬수가있는데 이를 이용하는것이다.

1` order by 1# 을 실행한 결과 에러가 나지않고

1` order by 2# 를 실행해본 화면이다.

정상적으로 잘나오고있다.

하지만 1` order by 3# 을 실행한 결과 에러가 난 모습이다.

3번 컬럼이 없는데 3번컬럼으로 정렬 하라고하니 에러가난것이다.

이렇게 여러 방식을 통해 테이블의 컬럼수를 알수있다.

이제 컬럼수도 알았으니 원하는 정보들을 뽑아보자.

내장함수중 무슨 DB를 사용하는지 알수있는 함수가있다.

그 함수는 database() 인데 이를 이용해서 알아보자.

컬럼 수를 맞추기 위해 database() , null 로 한것이다.

나온정보를 보니 dvwa라는 db를 사용하고있다는걸 알수있다.

중간쯤 부터 명령문을 1' 로 시작하고있어서 원하지않는 admin 이 게속 같이 출력되고있는데

1만 안쓰면 불필요한 정보를 볼필요없다.

이제 DB가 뭔지도 알았으니 DB에 어떠한 테이블들이있는지 확인해보자.

DBWA 가 가지고있는 모든 테이블 명을 보여줘라.

그결과 dvwa안에 guestbook , users 테이블이 있다는걸 파악했다.

 

각 테이블에는 어떠한 컬럼들이있는지 확인해보자.

이렇게 모든 테이블들을 확인해보았는데

users안의 컬럼을 보니 user 와 password 가 신경쓰이니 확인해보자.