์ƒˆ์†Œ์‹

Game/wargame

[wargame.kr] md5_compare

  • -
๋ฐ˜์‘ํ˜•

[wargame 10๋ฒˆ ๋ฌธ์ œ ํ’€์ด]

 

 

md5 ๋น„๊ต.. ?

 

๋ญ๊ฐ€ md5()ํ•จ์ˆ˜์˜ ์ทจ์•ฝ์„ฑ์„ ์ด์šฉํ•œ ๋ฌธ์ œ ๊ฐ™..๋‹ค?

 

 

 

 

๋‹จ์ง€ ๋น„๊ต ๋งŒํ•˜์‹ญ์‹œ์˜ค.
๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ : D

 

...?

 

 

ํŽ˜์ด์ง€๋ฅผ ๋“ค์–ด๊ฐ€๋ณด๋‹ˆ ์ •๋ง value 1,2 ์˜ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ ํ‘ธ๋Š” ๋ฌธ์ œ๋Š” ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

 

์†Œ์Šค ์ฝ”๋“œ์ค‘ ํ•ต์‹ฌ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•ด๋ณด์ž

 

 

<?php
    if (isset($_GET['view-source'])) {
         show_source(__FILE__);
         exit();
    }

    if (isset($_GET['v1']) && isset($_GET['v2'])) {
        sleep(3); // anti brute force

        $chk = true;
        $v1 = $_GET['v1'];
        $v2 = $_GET['v2'];

        if (!ctype_alpha($v1)) {$chk = false;}
        if (!is_numeric($v2) ) {$chk = false;}
        if (md5($v1) != md5($v2)) {$chk = false;}

        if ($chk){
            include("../lib.php");
            echo "Congratulations! FLAG is : ".auth_code("md5_compare");
        } else {
            echo "Wrong...";
        }
    }
?>

 

ํ™•์ธํ•ด๋ณด๋‹ˆ v1๊ณผ  v2 ๋‘˜๋‹ค ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ณ 

๋‘˜๋‹ค ๋ชจ๋‘ get๋ฐฉ์‹์œผ๋กœ ๋„˜์–ด์˜จ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด,

 

 

sleep(3) 

 

์ฆ‰ 3์ดˆ๋’ค ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ->  brute force ๊ณต๊ฒฉ ๋ฐฉ์ง€์šฉ

chk ๋ณ€์ˆ˜์— true;๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  v1๊ณผ v2์— ๊ฐ๊ฐ ์ž…๋ ฅํ•œ ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.

 

 

chk๊ฐ€ true์ธ ๊ฒฝ์šฐ flag๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”๋ฐ,

chk๊ฐ’์ด ์กฐ๊ฑด๋ฌธ 3๋ฒˆ์— ๊ฑธ์ณ false๋กœ ์ถœ๋ ฅ๋˜๊ฒŒ๋” ๋˜์–ด์žˆ๋‹ค.

 

if (!ctype_alpha($v1)) 

์ด ์ค„์€ v1์— ๋Œ€ํ•œ ์ œ์•ฝ์ด๋‹ค.

์ฆ‰ v1์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ๋ชจ๋‘ ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด  chk ๋ณ€์ˆ˜๋Š” false;

 

 

if(! is_numeric($v2))

์ด ์ฝ”๋“œ๋Š” v2์— ๋Œ€ํ•œ ์ œ์•ฝ์œผ๋กœ

 v2์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ๋ฌธ์ž์—ด ํ˜น์€, ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด chk ๋ณ€์ˆ˜๋Š” false

 

 

๋งˆ์ง€๋ง‰ ์ œ์•ฝ์€ v1๊ฐ’์„ md5ํ•ด์‹œํ™” ํ•œ ๊ฐ’๊ณผ v2๋ฅผ md5ํ•ด์‰ฌ ํ•œ ๊ฐ’์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด chk ๋ณ€์ˆ˜๋Š” false๊ฐ€ ๋œ๋‹ค.

 

 

์ด ๋ฌธ์ œ์—์„œ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ๋“ค

 

1. is_numeric () ํ•จ์ˆ˜๋Š” SQL injection์— ์ทจ์•ฝํ•˜๋‹ค. (๋ฌธ์ž์—ด ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ)

2. ํ•ด์‰ฌ ๊ฐ’์€ ์ ˆ๋Œ€ ๊ฐ™์„ ์ˆ˜ ์—†๋‹ค๊ณ  ํ•˜์ง€๋งŒ, ์‚ฌ์‹ค ํ•ด์‹œ ์ถฉ๋Œ์— ์˜ํ•ด ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

3. loose compare ์ฆ‰, php์— ๋Š์Šจํ•œ ๋น„๊ต ๋•Œ๋ฌธ์— ์ผ์–ด๋‚˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ์ .

 

 

 

(์ด๋Ÿฌํ•œ '==' ๋Š์Šจํ•œ ๋น„๊ต๋Š” ํ˜•์˜ ๋น„๊ต๋Š” ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— "0"๊ณผ 0 ์˜ ๊ฐ™์„ true๋กœ ์คŒ.)

 

 

 

์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ํ† ๋Œ€๋กœ ์ ‘๊ทผํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”

 

 

์ด ๋ฌธ์ œ์— ํฌ์ธํŠธ(Point)๋Š”

 

๋ฐ”๋กœ 

 

"md5 ๋งค์ง ํ•ด์‹œ ์ทจ์•ฝ์ "์ด๋‹ค.

 

 

MD5 ๋งค์ง ํ•ด์‹œ ์ทจ์•ฝ์ 


๋งค์ง ํ•ด์‹œ :

๋น„๊ต ์—ฐ์‚ฐ์„ ํ•  ๋•Œ type Juggling์„ ์ด์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ด ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์ธ์‹๋˜๋„๋ก ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ๋™์ž‘     

//type Juggling : ํ˜•๋ณ€ํ™˜, ์ฆ‰ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.


์ฆ‰ :
0e<์ˆซ์ž>์ผ ๊ฒฝ์šฐ์—๋Š” PHP์—์„œ์˜ '==' ์—ฐ์‚ฐ์ž ๊ธฐํ˜ธ๋กœ๋Š” ๊ฐ’์ด 0์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.



*ํŠน์ˆ˜ ์ˆซ์ž ํฌ๋งท

- 16์ง„์ˆ˜ : 0xC(10์ง„์ˆ˜ ๊ฐ’์œผ๋กœ 12)

- 8์ง„์ˆ˜ : 0o11(10์ง„์ˆ˜ ๊ฐ’์œผ๋กœ 9)

- ์ง€์ˆ˜ : 3e2(10์ง„์ˆ˜ ๊ฐ’์œผ๋กœ 3x10^2=300)



md5 ex)

240610708= 0e462097431906509019562988736854

QNKCDZO= 0e830400451993494058024219903391



์ฆ‰, ์ด ๋‘๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ๋Š์Šจํ•œ ๋น„๊ต์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ์‹œ ์ธ์ฆ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ถœ์ฒ˜ : https://aboutsc.tistory.com/100

 

์ฆ‰ , 0e๋กœ ์‹œ์ž‘ํ•˜๋Š” md5 ํ•ด์‹œ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค๋ฉด, ์ด ๊ฒƒ๋“ค์€ ๋Š์Šจํ•œ ๋น„๊ต ์—ฐ์‚ฐ์ž์— ์˜ํ•ด

"0" == 0  ๊ฒฐ๊ตญ true  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜์–ด ์ธ์ฆ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ฐ’์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ช‡๊ฐ€์ง€ md5ํ•ด์‹œ ๊ฐ’์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋ฅผ magic hash๋ผ๊ณ  ํ•œ๋‹ค.

 

humit.tistory.com/170

 

Magic Hash

PHP์—์„œ ==๋กœ ๋น„๊ตํ•  ๋•Œ ์ƒ๊ธฐ๋Š” type conversion์œผ๋กœ ์ธํ•œ ์ทจ์•ฝ์ ์ด๋‹ค. ์ฆ‰ ๋ฌธ์ž์—ด์˜ ํ˜•์‹์ด ^0+e\d*$ ๋กœ ๋˜์–ด์žˆ์„ ๋•Œ, ์ด๊ฒƒ์„ ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ์™€ ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด 0์ด๋ผ๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹์„ ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด $0^

humit.tistory.com

์œ„ ์‚ฌ์ดํŠธ์—์„œ magic hash์— ๋Œ€ํ•ด ๋”์šฑ ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

 

 

๊ฒฐ๊ตญ magic hash๋ฅผ ์ด์šฉํ•œ ์šฐํšŒ ๋ฌธ์ œ์ธ ๊ฒƒ์ด๋‹ค.

 

https://duwjdtn11.tistory.com/357

 

 

์ด๋ ‡๊ฒŒ ๊ณตํ†ต๋˜๋Š” ๊ฐ’

์ฆ‰ ์šฐํšŒ ๋˜๋Š” ๋‘ ๊ฐ’์„ ์ฐพ์•˜๋‹ค๋ฉด ์ด ๊ฐ’์„ v1, v2์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์œ ๋ช…ํ•œ magic hash ์˜ˆ๋กœ 

QNKCDZO == 240610708 ์ด ์žˆ์—ˆ๋‹ค.

 

๊ฐ’์„ ์ž…๋ ฅ ํ›„ chk ๋ฅผ ๋ˆ„๋ฅด๋‹ˆ 3๊ฐ€์ง€ ์กฐ๊ฑด์— ๋ชจ๋‘ ๋ถ€ํ•ฉํ•˜์ง€ ์•Š์•„์„œ chk = true๊ฐ€ ๋˜์—ˆ๋‹ค.

 

flag ๊ฐ’์ด ์ถœ๋ ฅ๋จ.

 

--> Clear...

 

 

 

์ž์ฃผ ๋“ฑ์žฅํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ข…์ข… ๋ณด์ด๋Š” ๋ฌธ์ œ์ด๊ณ ,

์•ฝ๊ฐ„์€ ? ์‹ ๋ฐ•ํ•œ ์ทจ์•ฝ์ ์ด๋‹ˆ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค ใ…Žใ…Ž

 

 

 

 

 

 


์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ํŽ˜์ด์ง€

 

 

- magic hash : johyungen.tistory.com/56

 

php ๋น„๊ต ์—ฐ์‚ฐ์ž ์ทจ์•ฝ์ (md5 ๋งค์งํ•ด์‹œ)

*๋งค์ง ํ•ด์‹œ - ๋น„๊ต ์—ฐ์‚ฐ์„ ํ• ๋•Œ Type Juggling์„ ์ด์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ด ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์ธ์‹๋˜๋„๋ก ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ๋™์ž‘ - 0e<์ˆซ์ž>์ผ ๊ฒฝ์šฐ์—๋Š” PHP์—์„œ์˜ "=="์—ฐ์‚ฐ์ž ๊ธฐํ˜ธ๋กœ๋Š” ๊ฐ’์ด 0์ด ๋˜๋Š” ๊ฒƒ โ€ปType Juggli

johyungen.tistory.com

 

- ์ค‘๋ณต md5 ? -> hacker news : news.ycombinator.com/item?id=9484757

 

PHP: md5('240610708') == md5('QNKCDZO') | Hacker News

 

news.ycombinator.com

 

- php ๊ฒฐํ•จ : medium.com/@mena.meseha/php-functions-security-issues-755ce4c8643c

 

PHP functions security issues

Although PHP is the best language in the world, there are some security issues that arise because of weakly typed languages. In the history…

medium.com

 

- php is_numeric() ์ทจ์•ฝ์  :  beyondsecurity.tistory.com/2

 

php is_numric function bypass

is_numeric() — ๋ณ€์ˆ˜๊ฐ€ ์ˆ˜๋‚˜ ์ˆ˜ ๋ฌธ์ž์—ด์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค bool is_numeric ( mixed $var ) ์ฃผ์–ด์ง„ ๋ณ€์ˆ˜๊ฐ€ ์ˆ˜์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ ๋ฌธ์ž์—ด์€ ๋ถ€์ˆ˜์ ์ธ ๋ถ€ํ˜ธ, ์ˆซ์ž๋“ค, ๋ถ€์ˆ˜์ ์ธ ์†Œ์ˆ˜์  ๋ถ€๋ถ„๊ณผ ๋ถ€์ˆ˜์ ์ธ ์ง€์ˆ˜๋ถ€๋กœ

beyondsecurity.tistory.com

 

- php ctype_alpha() : www.php.net/manual/en/function.ctype-alpha.php

 

PHP: ctype_alpha - Manual

The above example will output:

www.php.net

 

php is_numeric () : php.kambing.ui.ac.id/manual/en/function.is-numeric.php 

 

PHP: is_numeric - Manual

If you want detect integer of float values, which presents as pure int or float, and presents as string values, use this functions: PHP_INT_MAX) {        return false;    }    return is_float($val) ? false : preg_match('~^((?:\+|-)?[0-9]+)$~', $val

php.kambing.ui.ac.id

 

๋ฐ˜์‘ํ˜•

'Game > wargame' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[wargame.kr] DB is really GOOD  (0) 2021.01.28
wargame ํ’€์ด ๋ชจ์Œ์ง‘  (0) 2021.01.28
[wargame.kr] md5 password  (0) 2021.01.25
[wargame.kr] strcmp  (0) 2021.01.25
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.