물먹는산세베리아

6주차 과제_웹 해킹 본문

Web

6주차 과제_웹 해킹

suntall 2020. 12. 2. 06:52

미리 만들어둔 게시판을 활용해 SQL Injection 실습 하기

 

[환경 만들기]

board.php 일부
query.php

먼저, 게시판 목록이 보이는 board.php 파일에 게시판 제목으로 검색할 수 있는 검색창을 만들었다.

GET 방식을 사용하여, query.php에서 글 제목(search)을 가져오도록 했고 mysql과 연동하였다. search를 정상적으로 가져왔다면 search즉, title을 기준으로 번호, title(제목), id(작성자)를 가져온다. 그 후에는 가져온 값들을 출력하기 위해 mysqli_fetch_assoc()을 활용하여 해당 값들을 출력해 주었다.

board.php 화면
query.php 화면 search=testtitle

search값에 'testtitle'이라는 제목을 입력했더니 query.php로 이동하여 번호, 제목, 작성자가 출력되었다.

 

* 데이터를 한번 지운 적이 있기 때문에 목차에 있는 글의 수와 num의 숫자가 다르다.

 

 

[ testtitle' or 1=1 ;# ]

query.php 화면 search=testtitle' or 1=1 ;#

search값에 'testtitle' or 1=1 ;#'을 입력했더니 위와 같은 결과가 출력되었다. 

이때 'or 1=1'라는 구문은 where title로 한정해준 부분을 모두 참으로 바꾸어 버린다. 즉, title이 'testtitle'이거나 참인 모든 정보를 출력하라는 의미이다. 모든 정보를 조회하면 가장 먼저 만들어진 계정으로 로그인을 할 수 있는데, 보통은 관리자 계정일 확률이 높기 때문에 악용될 가능성이 있다.

cmd창에서 본 쿼리

 

[ union1 ]

union은 두 개의 쿼리를 보낼 수 있는 키워드로 사용법은 다음과 같다.

쿼리1 union 쿼리2

 

(주의할 점)

조회되는 컬럼 수가 동일해야 한다.

 

컬럼 수가 동일한지 그렇지 않은지는 order by 라는 키워드로 확인할 수 있다.

oder by n : n번째 컬럼으로 오름차순 정렬하기(단, n번째 행이 존재하지 않으면 오류 발생)

 

 

'order by 1;# 입력
'order by 3;#
'order by 4;# 입력

'order by 4;#을 입력했을 때 쿼리 오류가 발생했으므로 컬럼의 수는 3개임을 알 수 있다.

(search로 컬럼을 가져올때 num, title, id 총 3가지를 가져왔으므로 3개가 맞다.)

* query error는 코드 참고 (에러시 출력되도록 해둠)

[ information_schema ]

Mysql이 갖고 있는 메타데이터들을 종류별로 묶어 테이블을 만들었는데, 이 테이블을 모아 데이터 베이스를 만는 것이 Information_schema이다. mysql 서버가 운영하는 모든 데이터베이스의 정보를 저장하는데, 이 안에는 데이터베이스 이름, 테이블 이름, 컬럼 자료형, 접근 권한 등이 들어 있어 SQL Injection공격에서 쓰인다.

(* 메타데이터: 데이터의 종류가 너무 많아 목록화 시킨 것, 정보에 대한 정보)

 

union과 함께 사용할 때는

' union all select table_schema,table_name,column_name from information_schema.columns;#

전체값이 다 출력되었다.

 

email이라는 단어 찾기

페이지에 가입할 때 id, password, 이름, 메일 주소를 적었기 떄문에 칼럼명에 email이 있을 것이라고 예상할 수 있다. 검색 결과 같은 테이블에 email 외에도 id, pwd, name이 있고 테이블명은 member, 데이터베이스명은 mydb임을 확인할 수 있었다.

 

Database명 mydb
Table명 member
컬럼 id, pwd, name, email

 

[ union2 ]

union은 양쪽의 컬럼수를 맞춰야 하기 때문에 search(3가지: num, title, id)에 맞춰 위 과정에서 알아낸 4개의 컬럼 중 id, pwd, email 3가지만 사용하였다.

'union all select id, pwd, email from mydb.member;#

게시글의 num, title, id와 회원정보 member의 id, pwd, email

최종적으로 게시글 목록의 num, 제목, 작성자 정보와 회원정보인 member(테이블)의 id, pwd, email 정보를 조회하였다.

'Web' 카테고리의 다른 글

JSP, JS 차이  (0) 2021.11.04
Server-side  (0) 2021.01.13
php - session  (0) 2020.09.23
POST, GET 방식의 차이  (0) 2020.09.23
Web, HTML 복습 정리  (0) 2020.09.17