๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”’์ •๋ณด๋ณด์•ˆ/์›น ๋ณด์•ˆ

์›น ๋ณด์•ˆ - PHP ๋งค์ง ํ•ด์‹œ(Magic Hashes) ์ทจ์•ฝ์ 

by Janger 2023. 5. 24.
728x90
๋ฐ˜์‘ํ˜•

 

 

 

ํƒ€์ž… ์ €๊ธ€๋ง(Type Juggling)


PHP๋Š” ํƒ€์ž… ๊ฐ•๋„๊ฐ€ ์•ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋”ฐ๋ผ ํƒ€์ž…์ด ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ํƒ€์ž… ์ €๊ธ€๋ง(Type Juggling)์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

ํƒ€์ž… ์บ์ŠคํŒ…๊ณผ ๋‹ค๋ฅธ ์ ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ • ex) (float) a ํ•˜๋Š” ๊ฒƒ์„ ํƒ€์ž… ์บ์ŠคํŒ…์ด๊ณ ,

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ž๋™์ ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ํƒ€์ž… ์ €๊ธ€๋ง์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. 

 

php > var_dump(5 * "2");
int(10)

์ •์ˆ˜ํ˜•(int) 5์™€ ๋ฌธ์žํ˜•(string) 2๋ฅผ ์—ฐ์‚ฐ์‹œํ‚ค๋ฉด ์ •์ˆ˜ํ˜•(int) 10์ด ๋ฐ˜ํ™˜๋œ๋‹ค. 

 

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ $a == $b๋ฅผ ๋น„๊ตํ•  ๋•Œ ๋˜ํ•œ ํƒ€์ž… ์ €๊ธ€๋ง์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.

php > var_dump('1234'==1234);
bool(true)

 

php > var_dump("123" == "123.0");
bool(true)

๋ฌธ์ž์—ด(string) 123๊ณผ ๋ฌธ์ž์—ด(string) 123.0์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋Š” ๋†€๋ž๊ฒŒ๋„ ๊ฐ™๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค. 

 

 

๋งค์ง ํ•ด์‹œ(Magic Hashes)

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ง€์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ์—๋Š” ex) 1*10^2 = 1e2 ์ด๋Ÿฐ ์‹์œผ๋กœ ์•ŒํŒŒ๋ฒณ e๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉด์„œ ์ด๋Ÿฐ ์ง€์ˆ˜ํ˜•ํƒœ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ๋งค์ง ํ•ด์‹œ(Magic Hashes)๋ผ๊ณ  ํ•œ๋‹ค. 

php > var_dump(md5("240610708"));
string(32) "0e462097431906509019562988736854"

๋งค์šฐ ๋“œ๋ฌผ๊ฒŒ 0e{์ˆซ์ž} ํ˜•ํƒœ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. 

 

 

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

๋งŒ์•ฝ md5๋ฅผ ๊ฑฐ์นœ ํŒจ์Šค์›Œ๋“œ๊ฐ€ 0e{์ˆซ์ž} ํ˜•ํƒœ๊ฐ€ ๋‚˜์™”์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๋กœ ๋ถ€ํ„ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ํ•ด์‹œ๋ฅผ ๊ฑฐ์นœ ๊ฒŒ ๋˜ 0e{์ˆซ์ž} ํ˜•ํƒœ์ผ ๊ฒฝ์šฐ

 

์•„๋ž˜์˜ ์‹์ฒ˜๋Ÿผ == (Equal)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์ €๊ธ€๋ง์„ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉด์„œ ๋‘ ์ˆ˜์˜ ๊ฒฐ๊ณผ๋Š” 0๊ณผ 0์ด๋ฏ€๋กœ

(0e{์ˆซ์ž}์˜ ๊ฒฐ๊ณผ๋Š” ์–ธ์ œ๋‚˜ 0 [0*10^์ˆซ์ž = 0])

 

์ฐธ์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. 

php > var_dump(md5("240610708") == md5("QNKCDZO"));
bool(true)

 

๋Œ€์ฒ˜ ๋ฐฉ๋ฒ•

ํƒ€์ž… ์ €๊ธ€๋ง์„ ๊ฑฐ์น˜์ง€ ์•Š๋Š” ์ฆ‰ ๊ฐ™์€ ํƒ€์ž…์ธ string๊ณผ string์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” === (Identical)์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. 

 

php > var_dump(md5("240610708") === md5("QNKCDZO"));
bool(false)

 

 

ํ•ด์‹œ ํ•จ์ˆ˜ ์ข…๋ฅ˜๋ณ„ ๋งค์ง ํ•ด์‹œ(Magic Hashes) ๋ชจ์Œ

 

์•„๋ž˜ ๊นƒํ—ˆ๋ธŒ ์ฃผ์†Œ๋กœ ๊ฐ€๋ฉด MD5, SHA-1, SHA-224, SHA-256 ๋“ฑ ๋‹ค์–‘ํ•œ ํ•ด์‹œ ํ•จ์ˆ˜๋“ค์˜ ๋งค์ง ํ•ด์‹œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

https://github.com/spaze/hashes

 

GitHub - spaze/hashes: Magic hashes – PHP hash "collisions"

Magic hashes – PHP hash "collisions". Contribute to spaze/hashes development by creating an account on GitHub.

github.com

 

[MD5]
240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911

...

[sha256]
34250003024812:0e46289032038065916139621039085883773413820991920706299695051332
TyNOQHUS:0e66298694359207596086558843543959518835691168370379069085300385
CGq'v]`1:0e24075800390395003020016330244669256332225005475416462877606139
\}Fr@!-a:0e72388986848908063143227157175161069826054332235509517153370253
|+ydg uahashcat:0e47232208479423947711758529407170319802038822455916807443812134

 

 



์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ :
https://youtu.be/VCwiZ2dh17Q



https://www.tcpschool.com/php/php_basic_typeJuggling

 

์ฝ”๋”ฉ๊ต์œก ํ‹ฐ์”จํ”ผ์Šค์ฟจ

4์ฐจ์‚ฐ์—…ํ˜๋ช…, ์ฝ”๋”ฉ๊ต์œก, ์†Œํ”„ํŠธ์›จ์–ด๊ต์œก, ์ฝ”๋”ฉ๊ธฐ์ดˆ, SW์ฝ”๋”ฉ, ๊ธฐ์ดˆ์ฝ”๋”ฉ๋ถ€ํ„ฐ ์ž๋ฐ” ํŒŒ์ด์ฌ ๋“ฑ

tcpschool.com

 

https://rootable.tistory.com/148

 

๋งค์งํ•ด์‹œ(Magic Hashes) ์ทจ์•ฝ์ 

* ๋งค์งํ•ด์‹œ(Magic Hashes)๋ž€ ? - ๋น„๊ต ์—ฐ์‚ฐ์„ ํ•  ๋•Œ Type Juggling์„ ์ด์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ด ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์ธ์‹๋˜๋„๋ก ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ๋™์ž‘ - ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ('0e'๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์ผ

rootable.tistory.com

 

https://www.php.net/manual/en/language.operators.comparison.php

 

728x90
๋ฐ˜์‘ํ˜•