IDOR (Insecure Direct Object Reference)

πŸ” Introduction

IDOR(Insecure Direct Object References)λŠ” Access Controlμ—μ„œ λ°œμƒν•˜λŠ” 취약점 쀑 외뢀에 λ…ΈμΆœλ˜κ±°λ‚˜ μ œκ³΅λ˜λŠ” μž…λ ₯이 Object에 직접 μ°Έκ³ ν•˜κ³  μ—‘μ„ΈμŠ€ν•  λ•Œ 이λ₯Ό μ΄μš©ν•˜μ—¬ 본인의 κΆŒν•œμ„ λ„˜μ–΄μ„œλŠ” μ•‘μ…˜μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Origin Request

1
GET /info?accountId=15442

IDOR Request

1
GET /info?accountId=1110

일반적으둠 Horizontal privilege escalation 즉, μˆ˜ν‰μ μœΌλ‘œ κΆŒν•œμ„ μ•…μš©ν•  수 μžˆμ§€λ§Œ λ•Œλ•Œλ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ κ΅¬μ„±μ΄λ‚˜ 정책에 λ”°λΌμ„œ Vertical privilege escalation(수직적 κΆŒν•œ μƒμŠΉ)으둜 연결될 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ—‘ Offensive techniques

Detect

μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 처리 λ‘œμ§μ—μ„œ μ‚¬μš©μž μž…λ ₯ 값이 Object에 직접 μ°Έμ‘°λ˜λŠ” 뢀뢄듀이 λͺ¨λ‘ 영ν–₯ λ°›μŠ΅λ‹ˆλ‹€. 일반적으둜 ID, Username λ“± 식별 값이 ν¬μΈνŠΈκ°€ 되며, νŒŒλΌλ―Έν„°κ°€ μ•„λ‹Œ Static File λ“±μ—μ„œλ„ 식별 정보λ₯Ό κΈ°λ°˜μœΌλ‘œν•œ 데이터 μ°Έμ‘°κ°€ μžˆλŠ” 경우 IDOR의 영ν–₯을 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

Origin Request

1
2
3
POST /save_profile HTTP/1.1

account=15442&name=aaa

IDOR Request

1
2
3
POST /save_profile HTTP/1.1

account=1110&name=aaa

μœ„ μ˜ˆμ‹œμ—μ„œ account와 같이 μ‚¬μš©μžμ˜ Object에 μ°Έμ‘°λ λ§Œν•œ νŒŒλΌλ―Έν„°μ— λ‹€λ₯Έ μ‚¬μš©μžμ˜ 값을 λ„£μ–΄ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 처리, λ¦¬ν„΄λ˜λŠ” λ°˜μ‘μ„ μ‚΄ν•λ‹ˆλ‹€. λ§Œμ•½ account 값을 1110을 μ‚¬μš©ν•˜λŠ” μœ μ €μ˜ 데이터가 λ³€κ²½λ˜μ—ˆλ‹€λ©΄ IDOR에 μ·¨μ•½ν•œ κ²ƒμœΌλ‘œ νŒλ‹¨ν•©λ‹ˆλ‹€.

With HUNT

ZAP, Burpsuite에선 HUNTλΌλŠ” AddOn을 톡해 IDOR의 κ°€λŠ₯성을 κ°€μ§€λŠ” Requestλ₯Ό Passive Scan ν˜•νƒœλ‘œ 식별할 수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜ 글을 μ°Έκ³ ν•΄μ£Όμ„Έμš”.

With GF-Patterns

GF-Patterns에 λͺ…μ‹œλœ λŒ€ν‘œμ μΈ νŒŒλΌλ―Έν„° 이름은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. 이런 νŒŒλΌλ―Έν„°λ“€μ€ IDOR의 μ£Όμš” ν‘œμ μ΄ λ©λ‹ˆλ‹€.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
    [
        "id=",
        "user=",
        "account=",
        "number=",
        "order=",
        "no=",
        "doc=",
        "key=",
        "email=",
        "group=",
        "profile=",
        "edit=",
        "report="
    ]
}

Exploitation

Horizontal privilege escalation

μˆ˜ν‰ κΆŒν•œ μƒμŠΉμ€ IDORλ₯Ό 톡해 μœ μ‚¬ν•œ κΆŒν•œμ„ 가진 λ‹€λ₯Έ μ‚¬μš©μžμ˜ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν˜•νƒœμ˜ λ°©λ²•μž…λ‹ˆλ‹€.

Origin Request

1
2
3
POST /save_profile HTTP/1.1

account=15442&name=aaa

IDOR Request

1
2
3
POST /save_profile HTTP/1.1

account=1110&name=aaa

Vertical privilege escalation

수직 κΆŒν•œ μƒμŠΉμ€ IDORλ₯Ό 톡해 μƒμœ„ κΆŒν•œμ„ 가진 λ‹€λ₯Έ μ‚¬μš©μžμ˜ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν˜•νƒœμ˜ λ°©λ²•μž…λ‹ˆλ‹€. 보톡 일반 κ³„μ •κ°„μ˜ κΆŒν•œ λ¬Έμ œκ°€ μ•„λ‹Œ Admin λ“± μƒμœ„ κΆŒν•œμ˜ 데이터λ₯Ό μΉ¨λ²”ν•˜λŠ” ν˜•νƒœμ˜ λ°©λ²•μž…λ‹ˆλ‹€.

Origin Request

1
2
3
POST /save_profile HTTP/1.1

account=15442&name=aaa

IDOR Request

1
2
3
POST /save_profile HTTP/1.1

admin_account=1&name=aaa

Bypass protection

HPP

IDORλŠ” HPP(Http Parameter Pollution)을 톡해 μš°νšŒν•  수 μžˆλŠ” κ²½μš°κ°€ μ’…μ’… μžˆμŠ΅λ‹ˆλ‹€.

Bypass Request

1
2
3
POST /save_profile HTTP/1.1

account=15442&account=1110&name=aaa

Bypass Request (Array)

1
2
3
POST /save_profile HTTP/1.1

account[]=15442&account[]=1110&name=aaa

JSON Array

Origin Request

1
2
3
4
5
POST /save_profile HTTP/1.1

{
    "account":"15442"
}

Origin Request

1
2
3
4
5
6
7
8
POST /save_profile HTTP/1.1

{
    "account":[
        "15442",
        "1110"
    ]
}  

Change Method

Bypass Request

1
2
3
PUT /save_profile HTTP/1.1

account=1110&name=aaa

πŸ›‘ Defensive techniques

λŒ€μ‘ λ°©μ•ˆμ€ κ°„λ‹¨ν•©λ‹ˆλ‹€. μ‚¬μš©μžμ˜ μž…λ ₯을 μ‹ λ’°ν•˜μ§€ μ•Šκ³  μ„Έμ…˜, μΏ ν‚€ λ“± 인증 정보와 λΉ„κ΅ν•˜μ—¬ κΆŒν•œμ„ μ •ν™•ν•˜κ²Œ 검증해야 ν•©λ‹ˆλ‹€.

λ˜ν•œ 인증 정보λ₯Ό 검증할 수 μ—†λŠ” API λ“±μ˜ 경우 μ‚¬μš©μžκ°€ 직접 데이터λ₯Ό ν†΅μ œν•  수 없도둝 λ²‘μ—”λ“œ 뒀에 MSA ν˜•νƒœλ‘œ μˆ¨κΈ°λ˜κ°€ μ•žμ— λ³„λ„μ˜ Interfaceλ₯Ό κ΅¬ν˜„ν•˜μ—¬ λŒ€μ‘ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

πŸ•Ή Tools

πŸ“š Articles

πŸ“Œ References

Licensed under CC BY-NC-SA 4.0