일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 안티디버깅
- shadow
- 포렌식
- 케쉴주
- Frida
- SW에듀서포터즈
- 모바일프로그래밍
- Autoware
- 써니나타스
- Mobile
- K-shield Jr 10기
- upx
- 디스크
- ZIP
- Reversing
- CodeEngn
- ctf-d
- swing
- John the ripper
- 침해사고대응
- 리버싱핵심원리
- Interceptor
- crack
- K-sheild Jr
- 파일해시생성
- Android
- tar
- Multimedia
- disk
- Today
- Total
물먹는산세베리아
6주차 과제_웹 해킹 본문
미리 만들어둔 게시판을 활용해 SQL Injection 실습 하기
[환경 만들기]
먼저, 게시판 목록이 보이는 board.php 파일에 게시판 제목으로 검색할 수 있는 검색창을 만들었다.
GET 방식을 사용하여, query.php에서 글 제목(search)을 가져오도록 했고 mysql과 연동하였다. search를 정상적으로 가져왔다면 search즉, title을 기준으로 번호, title(제목), id(작성자)를 가져온다. 그 후에는 가져온 값들을 출력하기 위해 mysqli_fetch_assoc()을 활용하여 해당 값들을 출력해 주었다.
search값에 'testtitle'이라는 제목을 입력했더니 query.php로 이동하여 번호, 제목, 작성자가 출력되었다.
* 데이터를 한번 지운 적이 있기 때문에 목차에 있는 글의 수와 num의 숫자가 다르다.
[ testtitle' or 1=1 ;# ]
search값에 'testtitle' or 1=1 ;#'을 입력했더니 위와 같은 결과가 출력되었다.
이때 'or 1=1'라는 구문은 where title로 한정해준 부분을 모두 참으로 바꾸어 버린다. 즉, title이 'testtitle'이거나 참인 모든 정보를 출력하라는 의미이다. 모든 정보를 조회하면 가장 먼저 만들어진 계정으로 로그인을 할 수 있는데, 보통은 관리자 계정일 확률이 높기 때문에 악용될 가능성이 있다.
[ union1 ]
union은 두 개의 쿼리를 보낼 수 있는 키워드로 사용법은 다음과 같다.
쿼리1 union 쿼리2
(주의할 점)
조회되는 컬럼 수가 동일해야 한다.
컬럼 수가 동일한지 그렇지 않은지는 order by 라는 키워드로 확인할 수 있다.
oder by n : n번째 컬럼으로 오름차순 정렬하기(단, n번째 행이 존재하지 않으면 오류 발생)
'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;#
전체값이 다 출력되었다.
페이지에 가입할 때 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, 제목, 작성자 정보와 회원정보인 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 |