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-49420, 49428 본문

웹 보안/Exploit-db

EDB-49420, 49428

^_^? 2021. 1. 27. 15:47

1. 개요

EDB ID EDB-49420, EDB-49428
분류 Admin Authentication Bypass  / 'description' Stored Cross-site Scripting
대상 어플리케이션 Online Hotel Reservation System 1.0
취약 코드 /marimar/admin/login.php,
/marimar/admin/mod_room/controller.php
실행 환경 공격자 PC
: Apache 2.4.38 /
 PHP Version 7.3.4 / Kali-Linux 2019.2 

피해자 PC : Windows 7 x64

 

 

1.1 대상 어플리케이션 설명

 

- Online Hotel Reservation System 1.0의 admin 페이지다.

 

(그림 1) http://localhost/marimar/admin/login.php

 

 

- admin계정으로 로그인 성공 후 Rooms tab선택 시 

  홈페이지에 나와있는 방들에 대한 리스트가 나온다.

  

(그림 2) http://localhost/marimar/admin/mod_room/index.php

 

 

- 리스트 중 하나를 선택하면 선택한 방에 대한 정보를 변경할 수 있다.

(그림 3) Edit Room

 

 

 

 

1.2 공격 시나리오

 

 

  1. http://localhost/marimar/admin/login.php 로 접속해 admin페이지로 이동한다.

 

  2. sql Injection 공격으로 관리자 인증을 우회한다.

 

  3. http://localhost/marimar/admin/mod_room/index.php로 이동하여

     XSS 공격 스크립트를 넣을 방을 선택한다.

 

  4. Edit Room에서 "description" parameter에 XSS 공격 스크립트를 저장한다.

  

  5. 피해자가 공격스크립트를 저장한 Rooms 탭에 접속하면

     공격자 PC에 피해자의 쿠키값이 전송되어 쿠키값 탈취성공

 

  6. 공격자가 피해자의 계정으로 로그인에 성공한다.

 

 

2. 상세 분석

 

2.1 발생원리

 

   - username과 password 입력값에 대한

    특수문자 필터링이 이루어지지 않기 때문에 sql인젝션 공격이 성공하게된다.

 

(그림 4) /marimar/admin/login.php

 

 

- ROOMDESC을 비롯한 여러 변수들의 입력값을 검증하지 않고 그대로 사용하고 있기 때문에

  xss취약점이 발생한다.

 

(그림 5) /marimar/admin/mod_room/controller.php

 

 

 

2.2 취약점 확인

  

 

  - Admin Authentication Bypass : sql injection 공격 수행

 

   공격자(Kali)는 login request 패킷을 burpsuite를 통해 확인한다.

 

(그림 6) login request

   

email에 admin' or 1=1 -- a를 넣어준다.

 

주석처리 부분 뒤에 a를 넣어주는 이유는 login.php에서 

 

(그림 7) email, pass 변수 처리 부분

 

post방식으로 받은 값을 trim()함수에 넣어주기 때문이다.

 

trim()함수는 문자열의 양쪽에서 공백을 제거하기 때문에 admin' or =1=1 -- 이렇게 넣어줬을 경우

공백이 제거 되어 주입한 쿼리가 제대로 실행되지 않을 것이다.

--뒤에 공백이 한칸 있어야 주석처리가 제대로 작동하기 때문이다.

그래서 --뒤에 한칸 공백을 주고 임의의 값을 넣어줘서 끝이 공백이 되지 않도록 만들어주면 된다.

 

pass는 임의로 값을 넣어줘도 무방하다.

 

 

패킷을 포워딩해주면

아래와 같이 admin페이지에 로그인된다.

 

(그림 8) 관리자 메인 페이지

 

   -XSS 공격 수행

     

     공격자(Kali)는 먼저 /var/www/html에 cookie.php를 작성 후 저장한다.

   

(그림 9) cookie.php

     cookie.php는 http://localhost/marimar/index.php?p=rooms로 접속하는 사용자들의 쿠키값을 

     'data' 변수에 담아서 공격자의 PC에 data.txt로 저장시키는 소스코드다.

 

    

   

(그림 10) cookie.php 파일 권한 변경

 

    cookie.php 파일에 777 권한을 부여해서 다른 사용자에 의해서도 cookie.php가 실행될 수 있도록 한다.

    

 

     이제 공격을 시작해보자

     http://localhost/marimar/admin/mod_room/index.php로 이동하여 공격 스크립트를 넣을 방을 선택한 후에

     (그림 3) Edit Room에서 "description" parameter에 아래의 XSS 공격 스크립트를 저장한다.

     

(그림 11) XSS 공격 스크립트

 

 

 

피해자(Win7)PC는 secu lee는 로그인되어있는 상태이다.

 

(그림 12) 피해자 PC secu lee 로그인 화면

 

 

피해자가 Rooms를 누르면 아래와 같은 팝업이 뜨면서 공격자 PC로 피해자의 쿠키값이 전달된다.

 

(그림 13) 피해자 PC에서 실행되는 화면

 

 

공격자 PC에 data.txt라는 파일이 추가된 것을 확인할 수 있다.

그리고 (그림 13)과 같은 쿠키 값인것 또한 확인할 수 있다.

 

(그림 14) 공격자 PC에 저장된 data.txt

 

그럼 공격자는 공격자의 pc에서 피해자 secu lee의 쿠키값을 이용해 로그인할 수 있다.

burp suite를 통해 요청패킷의 쿠키값을 피해자 쿠키값으로 변경해서 forward한다.

 

 

(그림 15) 쿠키값 변조

 

포워딩 결과 secu lee로 로그인에 성공한다.

 

(그림 16) 피해자 계정 로그인 성공 화면

 

 

3. 대응 방안

 

-Admin Authentication Bypass : sql injection 대응방안

 

 

POST방식으로 email, pass값을 받아온 후

mysqli_real_escape_string()함수를 통해 인젝션 공격에 사용되는 특수문자들을 필터링 한다.

 

(그림 17) 수정 후 login.php

 

 

수정된 소스코드로 다시 인젝션 공격을 수행했지만 로그인에 실패하였다.

 

(그림 18) 로그인 실패 화면

 

 

 

 

 

-XSS 대응방안 

 

   htmlspecialchars()함수를 이용해 

   입력값으로 특수문자가 들어오더라도 HTML인코딩 시켜줘서 일반 문자열로 인식될 수 있도록 코드를 수정한다.

 

(그림 19) 수정 후 controller.php

 

 

 시큐어 코딩한 대로 잘 작동하는지 확인해보았다.

 Edit Room의 'description' 파라미터에 <script>alert(document.cookie)</script>을 삽입 후 저장한다.

 

(그림 20) XSS 공격 스크립트 삽입

 

 

 

아래와 같이 팝업창이 뜨지 않고 공격 스크립트가 일반 문자열로 보여지는 것을 확인할 수 있다.

 

(그림 21) XSS 공격 차단 - 일반 문자열로 인식

 

 

 

4. 참고자료

- Exploit-DB

  exploit-db.com/exploits/49428

  www.exploit-db.com/exploits/49420

 

- mysqli_real_escape_string()

  www.php.net/manual/en/mysqli.real-escape-string.php

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

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
EDB-ID-48822  (0) 2020.12.30