[md5_compare]

md5_compare라는 이름에서 md5암호화를 통해 무언가를 비교하는 문제인 것 같다.

[md5_compare start]

value1과 value2 값을 입력 받는 것을 확인한 후 소스를 확인해 보았다.

[md5_compare view source]

php로 작성되어 졌으며 Get방식으로 value1, 2를 받는 것을 알 수 있다.

ctype_alpha는 인자값이 알파벳인지 확인하는 php 함수이다. v1이 문자인지 확인한다.

is_numeric은 인자값이 숫자인지 확인하는 php 함수이다. v2가 숫자인지 확인한다.

 

value1 -> v1

value2 -> v2

 

최종적으로 v1과 v2를 md5로 암호화한 값을 비교해서 같을 경우 flag를 알려주는 문제이다.

 

어느 부분에서 문제가 발생할지 고민 끝에 php함수 자체 취약점이라고 결론을 내리고 어떤 함수가 문제인지 찾아보았지만 눈에 뛰는 내용은 없었다.

 

그러던중 php는 == 연산자 뿐만 아니라 =, === 연산자를 이용한 정밀 검사가 있다는 것을 알게 되어 == 연산자에 취약점이 있는지 찾아보게 되었다.

 

아래 링크를 통해 php compare 연산자의 문제점을 알게 되었다.

www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison

 

PHP: Comparison Operators - Manual

When you want to know if two arrays contain the same values, regardless of the values' order, you cannot use "==" or "===".  In other words: To answer that question, use: A related, but more strict problem, is if you need to ensure that two arrays contain

www.php.net

'='은 값을 지정해줄때 사용한다.

'=='은 값이 같은지 비교해줄 때 사용한다.

'==='은 값과 데이터 형식이 같은지 비교할 때 사용한다.

 

www.php.net/manual/en/function.md5.php

 

PHP: md5 - Manual

I've found multiple sites suggesting the code:md5(file_get_contents($filename));Until recently, I hadn't noticed any issues with this locally... but then I tried to hash a 700MB file, with a 2048MB memory limit and kept getting out of memory errors...There

www.php.net

[md5_compare vulnerability]

php는 두 md5의 해시 값이 '0e'로 시작하기 때문에 참으로 판단한다고 한다. 참 어이가 없다.

 

[md5_compare flag]

'Challenge > Dreamhack' 카테고리의 다른 글

[Dreamhack] blind-command  (0) 2022.01.04
[wargame.kr] type confusion  (0) 2021.01.04
[wargame.kr] pyc decompile  (0) 2020.12.29
[wargame.kr] tmitter  (0) 2020.10.13
[wargame.kr] DB is really GOOD  (0) 2020.10.06

이번에는 wargame.kr을 올클을 목표로 임해보려 합니다.

이번에 푼 문제는 DB is really GOOD입니다.

User 이름과 DB의 상관관계에 대해서 찾아보라고 힌트를 주고 있습니다.

 

BLUEMEMO SYSTEM이라는 문구와 함께 로그인을 위한 USER 이름 요청란이 있습니다.

USER란에 [이름]을 입력하면 POST 요청을 통해 로그인이 되는 것을 확인 할 수 있습니다.

위 그림에서 보시는 바와 같이 1234라는 ID로 메모를 작성할수 있습니다.

사람들이 그동안 입력해왔던 로그를 확인해 보았습니다.

 

ID를 바꿔서 진행해 보았습니다.

하단에 메모 내용이 달라지는 것을 확인 할 수 있었습니다.

 

Admin이 아닌 admin으로 시도 해본 결과 dont access with 'admin'이라는 alert창이 떴습니다.

이를 통해 admin이라는 계정은 접근 권한이 없을 뿐이지 존재는 한다라는 결론을 내리게 되었습니다.

그래서 admin계정으로 로그인 해보려 시도하였습니다.

 특수문자들이 그대로 출력되는 걸로 보아 필터링이 걸려 있다고 생각하였습니다.

필터링 걸리지 않는 특수문자가 뭐가 있을까 생각하며 다 집어 넣어 보았습니다.

그 결과 . -> _로 / -> fatal error을 뿜는 것을 확인해 내었습니다.

'db를 열수 없다.'라는 메세지와 함께 ./db/wlrm_/.db 경로의 존재를 확인 할수 있었습니다.

완전한 경로가 아니기 때문에 /를 이용해 실마리를 더 찾아 내어야 했습니다.

a/를 넣어 본 결과 wkrm_ 뒤에 입력값 그대로 값이 들어가는 것을 확인했습니다.

경로를 수정하여 ./db/wkrm_[입력값].db를 URL에 넣어보았습니다.

 

wkrm_admin 파일을 다운 받을 수 있었습니다.

이 db파일을 hxd에 떨구고 flag를 검색해보았습니다.

Here is flag!라는 말과 함께 ~~~.php파일을 확인 할 수 있었습니다.

.php인 것으로 보아 url 주소라고 생각하였습니다.

FLAG를 획득 할 수 있었습니다.

 

의식의 흐름 정리

사실... DB와 USER NAME의 상관관계라는 힌트에 주의 해준다면 XSS에서 시간을 크게 뺏기지 않을 것입니다.

'Challenge > Dreamhack' 카테고리의 다른 글

[Dreamhack] blind-command  (0) 2022.01.04
[wargame.kr] type confusion  (0) 2021.01.04
[wargame.kr] pyc decompile  (0) 2020.12.29
[wargame.kr] tmitter  (0) 2020.10.13
[wargame.kr] md5_compare  (0) 2020.10.13

+ Recent posts