Study
EDB-49420, 49428 본문
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 페이지다.
- admin계정으로 로그인 성공 후 Rooms tab선택 시
홈페이지에 나와있는 방들에 대한 리스트가 나온다.
- 리스트 중 하나를 선택하면 선택한 방에 대한 정보를 변경할 수 있다.
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인젝션 공격이 성공하게된다.
- ROOMDESC을 비롯한 여러 변수들의 입력값을 검증하지 않고 그대로 사용하고 있기 때문에
xss취약점이 발생한다.
2.2 취약점 확인
- Admin Authentication Bypass : sql injection 공격 수행
공격자(Kali)는 login request 패킷을 burpsuite를 통해 확인한다.
email에 admin' or 1=1 -- a를 넣어준다.
주석처리 부분 뒤에 a를 넣어주는 이유는 login.php에서
post방식으로 받은 값을 trim()함수에 넣어주기 때문이다.
trim()함수는 문자열의 양쪽에서 공백을 제거하기 때문에 admin' or =1=1 -- 이렇게 넣어줬을 경우
공백이 제거 되어 주입한 쿼리가 제대로 실행되지 않을 것이다.
--뒤에 공백이 한칸 있어야 주석처리가 제대로 작동하기 때문이다.
그래서 --뒤에 한칸 공백을 주고 임의의 값을 넣어줘서 끝이 공백이 되지 않도록 만들어주면 된다.
pass는 임의로 값을 넣어줘도 무방하다.
패킷을 포워딩해주면
아래와 같이 admin페이지에 로그인된다.
-XSS 공격 수행
공격자(Kali)는 먼저 /var/www/html에 cookie.php를 작성 후 저장한다.
cookie.php는 http://localhost/marimar/index.php?p=rooms로 접속하는 사용자들의 쿠키값을
'data' 변수에 담아서 공격자의 PC에 data.txt로 저장시키는 소스코드다.
cookie.php 파일에 777 권한을 부여해서 다른 사용자에 의해서도 cookie.php가 실행될 수 있도록 한다.
이제 공격을 시작해보자
http://localhost/marimar/admin/mod_room/index.php로 이동하여 공격 스크립트를 넣을 방을 선택한 후에
(그림 3) Edit Room에서 "description" parameter에 아래의 XSS 공격 스크립트를 저장한다.
피해자(Win7)PC는 secu lee는 로그인되어있는 상태이다.
피해자가 Rooms를 누르면 아래와 같은 팝업이 뜨면서 공격자 PC로 피해자의 쿠키값이 전달된다.
공격자 PC에 data.txt라는 파일이 추가된 것을 확인할 수 있다.
그리고 (그림 13)과 같은 쿠키 값인것 또한 확인할 수 있다.
그럼 공격자는 공격자의 pc에서 피해자 secu lee의 쿠키값을 이용해 로그인할 수 있다.
burp suite를 통해 요청패킷의 쿠키값을 피해자 쿠키값으로 변경해서 forward한다.
포워딩 결과 secu lee로 로그인에 성공한다.
3. 대응 방안
-Admin Authentication Bypass : sql injection 대응방안
POST방식으로 email, pass값을 받아온 후
mysqli_real_escape_string()함수를 통해 인젝션 공격에 사용되는 특수문자들을 필터링 한다.
수정된 소스코드로 다시 인젝션 공격을 수행했지만 로그인에 실패하였다.
-XSS 대응방안
htmlspecialchars()함수를 이용해
입력값으로 특수문자가 들어오더라도 HTML인코딩 시켜줘서 일반 문자열로 인식될 수 있도록 코드를 수정한다.
시큐어 코딩한 대로 잘 작동하는지 확인해보았다.
Edit Room의 'description' 파라미터에 <script>alert(document.cookie)</script>을 삽입 후 저장한다.
아래와 같이 팝업창이 뜨지 않고 공격 스크립트가 일반 문자열로 보여지는 것을 확인할 수 있다.
4. 참고자료
- Exploit-DB
www.exploit-db.com/exploits/49420
- mysqli_real_escape_string()
'웹 보안 > 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 |