1. 개요
CVE 코드 |
CVE–2020-8547 |
분류 |
Broken Authentication |
대상 어플리케이션 |
phpList 3.5.0 |
취약 코드 |
lists/admin/phpListAdminAuthentication.php |
실행 환경 |
Apache 2.0 / Windows 7 x64 / phpList |
phpList는 메일 리스트를 관리하기 위한 오픈 소스이다.
뉴스레터,뉴스,광고 같은 정보를 제공해 주기한 소프트웨어이다.
phpListAdminAuthentication.php 에서 암호함수가 ==연산자를 사용하여 Loose Comparison가 발생한다.
해쉬값 값이 0e+number로 이루어져 있다면 0으로 인식하여 0e+number로 표현되는 해시 값들이 전부 인증이 되는 현상이 발생한다.
환경 구성
Exploit-db에서 취약 소프트웨어를 다운 받는다.
/apache2/htdocs에 lists폴더를 한다.
lists/config/config.php 에서 db정보를 입력한다.
lists/base/vendor/phplist/core/resources/Database/schema.sql 파일의 데이터 스키마를 sql에 등록해준다.
Mysql 콘솔에 phplistdb를 생성하고 그대로 복사해주면 된다.
비밀번호를 0+number 포맷으로 변환되는 ‘TyNOQHUS’으로 설정해주었다
URL/lists/admin/에 해당 비밀번호로 접속한다.
패스워드가 hash화 되어 저장되어진다.
취약점을 확인하기위한 환경구성이 완료되었다.
PHP – loose comparison
== 비교연산자는 다른 자료형과 쉽게 쓸 수 있게 Type Juggling을 지원한다.
String → float → int를 선호하여 숫자 포맷이 있으면 숫자로 casting후 계산한다.
0e+number를 특수 숫자 포맷으로 인식하여 자동으로 숫자로 변환하여 비교한다.
0e13515 = 0e66
→ 0*10^13515 == 0*10^66
→ 0 == 0 (true) 가된다.
2. 상세분석
2.1. 발생 원리
로그인을 검증하는 함수이다.
비교연산자가 ==로 되어있어 loose comparison으로 인한 인증 우회가 발생할 가능성이 있다.
2.2 취약점 확인
admin의 암호는 0e66298694359207596086558843543959518835691168370379069085300385 이다.
SHA256해쉬함수에서 0e+number 형식의 해시 값이 생성되는 값을 찾는다.
loose comparison으로 인하여 34250003024812를 사용하여 로그인에 성공하였다.
2.3 공격 시나리오
Loose Comparison 취약점을 가진 채로 암호 해시 파일이 유출된다면 공격자는 손쉽게 사용자 계정에 로그인 할 수 있다.
3.대응 방안
==(loose) 비교연산을 ===(strict) 비교연산으로 교체하여 Type Juggling이 발생하지 않도록 한다.
적용 후
4. 참고자료
- phpList 3.5.0
https://www.exploit-db.com/apps/b7d437efdcf604442a5a0a580fcd802c-phplist-3.5.0.zip
- Exploit-DB
https://www.exploit-db.com/exploits/47989
- SHA256 Online
https://emn178.github.io/online-tools/sha256.html
- PHP Loose Comparison
https://velog.io/@woounnan/ROOTME-PHP-Loose-Comparison%20PHP%20-%20Loose%20Comparison
'취약점 분석 > CVE' 카테고리의 다른 글
[CVE] CVE-2018-6015 취약점 분석 - Information Disclosure (0) | 2020.11.11 |
---|---|
[CVE] CVE-2020-24609 취약점 분석 - XSS (0) | 2020.10.18 |
[CVE] CVE-2020-11530 취약점 분석 - Blind SQL Injection (0) | 2020.09.29 |