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에서 취약 소프트웨어를 다운 받는다.

[그림 1]  https://www.exploit-db.com/exploits/47989

 

/apache2/htdocs에 lists폴더를 한다.

lists/config/config.php 에서 db정보를 입력한다.

[그림 3] config.php

 

lists/base/vendor/phplist/core/resources/Database/schema.sql 파일의 데이터 스키마를 sql에 등록해준다.

Mysql 콘솔에 phplistdb를 생성하고 그대로 복사해주면 된다.

 

[그림 4] 데이터 베이스 구성 완료

 

비밀번호를 0+number 포맷으로 변환되는 ‘TyNOQHUS’으로 설정해주었다

 

URL/lists/admin/에 해당 비밀번호로 접속한다.

 

패스워드가 hash화 되어 저장되어진다.

 

취약점을 확인하기위한 환경구성이 완료되었다.

 

PHP – loose comparison

== 비교연산자는 다른 자료형과 쉽게 쓸 수 있게 Type Juggling을 지원한다.

String → float → int를 선호하여 숫자 포맷이 있으면 숫자로 casting후 계산한다.

0e+number를 특수 숫자 포맷으로 인식하여 자동으로 숫자로 변환하여 비교한다.

[그림 8] Php loose comparison

0e13515 = 0e66

→ 0*10^13515 == 0*10^66

→ 0 == 0 (true) 가된다.


2. 상세분석

2.1. 발생 원리

로그인을 검증하는 함수이다.

비교연산자가 ==로 되어있어 loose comparison으로 인한 인증 우회가 발생할 가능성이 있다.

[그림 9] ==으로 패스워드를 비교한다.  

2.2 취약점 확인

admin의 암호는 0e66298694359207596086558843543959518835691168370379069085300385 이다.

SHA256해쉬함수에서 0e+number 형식의 해시 값이 생성되는 값을 찾는다.

[그림  SEQ 그림 \* ARABIC 10] 34250003024812

loose comparison으로 인하여 34250003024812를 사용하여 로그인에 성공하였다.

 

[그림 12] 로그인 성공

2.3 공격 시나리오

Loose Comparison 취약점을 가진 채로 암호 해시 파일이 유출된다면 공격자는 손쉽게 사용자 계정에 로그인 할 수 있다.


3.대응 방안

==(loose) 비교연산을 ===(strict) 비교연산으로 교체하여 Type Juggling이 발생하지 않도록 한다.

[그림 13] strict로 비교연산자 수정

 

 

적용 후

[그림 14] 34250003024812으로 로그인이 되지 않는다.


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

 

+ Recent posts