๐ Introduction
Type Juggling์ ๋ณต์์ ๋ณ์๋ฅผ ๋น๊ตํ ๋ ์ฌ์ฉ๋๋ Loose/Strict Comparison์ ๋ฐ๋ผ ๊ฐ๋ฐ์๊ฐ ์๋ํ์ง ์์ ๊ฐ์ผ๋ก if ๋ฌธ ๋ฑ์ ํต๊ณผํ ์ ์๋ ์ทจ์ฝ์ ์ ์๋ฏธํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก PHP๊ฐ ์ํฅ์ ๋ฐ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. ๋ณดํต PHP type juggling ๋๋ Magic hashes attack์ผ๋ก ๋ง์ด ์๋ ค์ ธ ์์ต๋๋ค.
Comparison |
Equal |
Not Equal |
Description |
Loose |
== |
!= |
the same value |
Strict |
=== |
!== |
the same type and the same value |
๐ก Offensive techniques
Detect
PHP ์ฝ๋์์์ ==
๋๋ !=
๋ก ๋ถ๊ธฐ๋๊ฑฐ๋ ๋น๊ตํ๋ ๊ตฌ๋ฌธ์ ๋ชจ๋ ์ํฅ์ ๋ฐ์ต๋๋ค. ์ด๋ ๋จ์ํ ๊ฐ๋ง ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ํ์
์ ๊ฐ์์ true๋ฅผ ๋ฐํ์ํฌ ์ ์์ต๋๋ค.
True statements
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
'123' == 123 #true
'123a' == 123 #true
'abc' == 0 #true
var_dump('0010e2' == '1e3'); # true
var_dump('0xABCdef' == ' 0xABCdef'); # true PHP 5.0 / false PHP 7.0
var_dump('0xABCdef' == ' 0xABCdef'); # true PHP 5.0 / false PHP 7.0
var_dump('0x01' == 1) # true PHP 5.0 / false PHP 7.0
var_dump('0x1234Ab' == '1193131');
'' == 0 == false == NULL
'' == 0 # true
0 == false # true
false == NULL # true
NULL == '' # true
|
Null statements
1
2
|
var_dump(sha1([])); # NULL
var_dump(md5([])); # NULL
|
Exploitation
Bypass auth
0e
๋ก ์์ํ๋ ๊ฐ์ ๊ฒฝ์ฐ ์๋ Magic Hashes์ ๊ฐ์ด ture๋ฅผ ๋ฐํํ ์ ์๋ ๋ค๋ฅธ ๊ฐ๋ค์ด ์์ต๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ์ค์ ๋ฐ์ดํฐ ๊ฐ์ ๋ชฐ๋ผ๋ ์ด๋ฅผ ์ด์ฉํ์ฌ ์ฐํํ ์ ์์ต๋๋ค.
1
2
3
4
5
6
|
hash_hmac(admin|1424869663) -> "e716865d1953e310498068ee39922f49"
hash_hmac(admin|1424869664) -> "8c9a492d316efb5e358ceefe3829bde4"
...
hash_hmac(admin|1835970773) -> "0e174892301580325162390102935332"
// "0e174892301580325162390102935332" == "0"
// => True
|
Magic Hashes
Hash |
Magic Number / String |
Magic Hash |
MD5 |
240610708 |
0e462097431906509019562988736854 |
MD5 |
QNKCDZO |
0e830400451993494058024219903391 |
MD5 |
0e1137126905 |
0e291659922323405260514745084877 |
MD5 |
0e215962017 |
0e291242476940776845150308577824 |
MD5 |
129581926211651571912466741651878684928 |
06da5430449f8f6f23dfc1276f722738 |
SHA1 |
10932435112 |
0e07766915004133176347055865026311692244 |
SHA-224 |
10885164793773 |
0e281250946775200129471613219196999537878926740638594636 |
SHA-256 |
34250003024812 |
0e46289032038065916139621039085883773413820991920706299695051332 |
SHA-256 |
TyNOQHUS |
0e66298694359207596086558843543959518835691168370379069085300385 |
1
2
3
4
|
var_dump(md5('240610708') == md5('QNKCDZO')); # bool(true)
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
|
๐ก Defensive techniques
PHP์์ ๊ตฌ๋ฌธ ๋น๊ต ์ Loose Comparison์ด ์๋ Strict Comparison์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ ์ ์์ต๋๋ค.
Weak
1
2
3
4
5
|
if (secret == hash_hmac(admin|1835970773)) {
// admin page
} else {
// 403
}
|
Secure
1
2
3
4
5
|
if (secret === hash_hmac(admin|1835970773)) {
// admin page
} else {
// 403
}
|
๐ References