[Security] Secure Coding(6-3) - Command Injection
[Security] Secure Coding(6-3) - Command Injection
π μνμ΄ μ½λ© μμ μ 리
Command Injection
πCommand Injection: μ¬μ©μ μ λ ₯κ°μ΄ μ μ ν κ²μ¦ μμ΄ μμ€ν λͺ λ Ήμ΄μ μΌλΆλ‘ μ¬μ©λ λ λ°μνλ 보μ μ·¨μ½μ
π‘λ°μ μμΈ
- μ΄μ체μ λͺ λ Ήμ μ€ννλ ν¨μλ₯Ό μ¬μ©νλ κ²½μ°
- κ²μ¦λμ§ μμ μ¬μ©μ μ λ ₯ κ°μ΄ λͺ λ Ήμ΄λ λͺ λ Ήμ νλΌλ―Έν°λ‘ μ¬μ©λλ κ²½μ°
μ΄μ체μ λ³ λͺ λ Ήμ΄ μ€ν λ°©μ μ΄ν΄
Windows
- κΈ°λ³Έ λͺ
λ Ήμ΄ μΈν°ν리ν°
- μ£Όλ‘
cmd.exe
μ μ΅κ·ΌμλPowerShell
μ¬μ© - λ΄λΆ λͺ λ Ήμ΄μ μΈλΆ νλ‘κ·Έλ¨ νΈμΆ λ°©μ ꡬλΆ
- μ£Όλ‘
- λͺ
λ Ήμ΄ νμ± λ° μ€ν κ³Όμ
- νΉμλ¬Έμ(μ:
&
,|
,>
)λ₯Ό μ΄μ©ν λͺ λ Ήμ΄ μ°κ²° λ° λ¦¬λ€μ΄λ μ
- νΉμλ¬Έμ(μ:
- 보μ κ³ λ €μ¬ν
- Command Injection μ, cmd.exeμ νΉμλ¬Έμ ν΄μμ μ μ© κ°λ₯
- PowerShellμ μ€ν¬λ¦½νΈ μ€ν μ μ± λ° λͺ λ Ήμ΄ νμ₯ μ·¨μ½μ μ‘΄μ¬
Linux
- κΈ°λ³Έ λͺ
λ Ήμ΄ μΈν°ν리ν°
- κΈ°λ³Έμ μΌλ‘
/bin/sh
(λλΆλΆ Bash κΈ°λ°) μ¬μ© - μμ νμ₯ κΈ°λ₯(νμ΄ν, 리λ€μ΄λ μ , μμΌλμΉ΄λ λ±) νμ©
- κΈ°λ³Έμ μΌλ‘
- λͺ
λ Ήμ΄ νμ± λ° μ€ν κ³Όμ
- 곡백, λ°μ΄ν, μ΄μ€μΌμ΄ν λ¬Έμ() μ²λ¦¬ λ°©μ
- νκ²½ λ³μ, λͺ λ Ήμ΄ μΉν(`, $() λ±)μ ν΄μ κ³Όμ ν¬ν¨
- 보μ κ³ λ €μ¬ν
- μ λ©νλ¬Έμ λ° νμ΄ν, λͺ λ Ήμ΄ μΉνμ μλͺ»λ μ²λ¦¬λ‘ μΈμ μ μν μ¦κ°
- νκ²½ λ³μ μ‘°μ λ° κ²½λ‘ λ³μ‘° 곡격 κ°λ₯μ±
Command Injection μ§λ¨
μλ μ§λ¨
- λͺ©ν
- μ¬μ©μ μ λ ₯μ΄ μμ€ν λͺ λ Ήμ΄μ κ²°ν©λμ΄ μ€νλλ κ²½μ°, μ μμ μΈ μ‘°μμ΄ κ°λ₯νμ§ νμΈ
- μλμΉ μμ λͺ λ Ή μ€νμ΄λ μΆλ ₯ μ‘°μμ ν΅ν΄ μ·¨μ½μ μ νμ§
π‘κΈ°λ³Έ μ κ·Ό λ°©λ²
- ν μ€νΈ μ λ ₯ κ°μ νΉμλ¬Έμ λ° μ μ΄ λ¬Έμλ₯Ό μ½μ νμ¬ λͺ λ Ήμ΄μ μ€ν νλ¦ λ³νλ₯Ό κ΄μ°°
- λ€μν OS(Windows, Linux)μ μμ νμ± κ·μΉμ κ³ λ €νμ¬ ν μ€νΈ μΌμ΄μ€ μ€κ³
λͺ λ Ήμ΄ μ°κ²°μ ν μ€νΈ
&
,&&
,||
,;
λ±μΌλ‘ μΆκ° λͺ λ Ήμ΄ μ€ν ν μ€νΈ- μ)
"test && cat /etc/passwd"
λλ"test; ls"
- μ)
νμ΄ν λ° λ¦¬λ€μ΄λ μ ν μ€νΈ
|
,>
,<
λ±μ νμ©ν΄ λͺ λ Ήμ΄ μ‘°μ ν μ€νΈ- μ)
"test | ls"
,"test > output.txt"
- μ)
νκ²½ λ³μ νμ© ν μ€νΈ
$PATH
,$IFS
λ±μ μ΄μ©νμ¬ λͺ λ Ήμ΄ μ€ν νκ²½ λ³κ²½νκ±°λ, κ²μ¦ μ°ν μλ- μ)
"test $PATH"
λλ"test$IFSls"
μ²λΌ νκ²½λ³μ νμ© κ°λ₯νμ§ ν μ€νΈ
- μ)
μλΈ λͺ λ Ή μ€ν ν μ€νΈ
- λ°±ν± (`) λλ $()`λ₯Ό μ¬μ©ν΄ μλΈ λͺ
λ Ήμ΄ μ€νλλμ§ ν
μ€νΈ
- μ) βtest `ls`β λλ βtest $(ls)β
μλνλꡬ ZAP
- ZAP 곡μ μ¬μ΄νΈ(https://www.zaproxy.org/)μμ μ΅μ λ²μ λ€μ΄λ‘λ λ° μ€μΉ
ZAP μ€ν ν, νλ‘μ ν¬νΈ(κΈ°λ³Έ
8080
) νμΈ- μ§λ¨ λμ μΉ μλΉμ€ μ€λΉ
- λΈλΌμ°μ νλ‘μ μ€μ
- λΈλΌμ°μ μ νλ‘μ μ€μ μ ZAPμ νλ‘μ(μ:
localhost:8080
)λ‘ λ³κ²½νμ¬ λͺ¨λ νΈλν½μ΄ ZAPμ ν΅ν΄ νλ₯΄λλ‘ μ€μ
- λΈλΌμ°μ μ νλ‘μ μ€μ μ ZAPμ νλ‘μ(μ:
- ZAPμ μλ κ²μ¬ Active Scan μν λ°©λ²
- ZAP μ’μΈ‘ νΈλ¦¬μμ ν
μ€νΈ λμ URL μ ν ν,
μ° ν΄λ¦ β "Attack" β "Active Scan" μ€ν
- ZAP μ’μΈ‘ νΈλ¦¬μμ ν
μ€νΈ λμ URL μ ν ν,
- μ€μΊ κ²°κ³Ό νμΈ
- μ€μΊ κ²°κ³Ό μ°½μμ βCommand Injectionβ κ΄λ ¨ μλ¦Ό (μ: μλ¬ λ©μμ§, λΉμ μ μλ΅ μ½λ λ±) νμΈ
- μλ¦Ό μμΈ μ 보λ₯Ό ν΅ν΄ μμ¬λλ μ λ ₯ νλ λ° μ€ν κ²°κ³Ό λΆμ
Command Injection λμ
μνμ΄ μ½λ© μ μ©
- Command Injectionμ΄ λ°μνλ κ²½μ°
1
2
3
4
// βμμ νμ§ μμ μ½λ
String version = request.getParameter("version"); // versionμ΄ κ²μ¦ μμ΄ λͺ
λ Ήμ΄μ μ§μ κ²°ν©
String cmd = new String("cmd.exe /K \"run.bat \""); // μ 체 λͺ
λ Ήμ΄κ° νλμ λ¬Έμμ΄λ‘ ꡬμ±λμ΄ μμμ ν΄μ
Runtime.getRuntime().exec(cmd + " c:\\prog_cmd\\" + version);
1
2
3
4
5
6
String version = request.getParameter("version");
if(version.matches("[0-9.]+")) { // μ κ·μ [0-9.]+λ‘ μ«μμ μ λ§ νμ©
Runtime.getRuntime().exec(new String[]{"cmd.exe","/c", "run.bat", version}); //String[] λ°°μ΄λ‘ κ° μΈμλ₯Ό λΆλ¦¬νμ¬ μ ν΄μ λ°©μ§
} else {
λΆμ ν©ν κ°μΌλ‘ μ²λ¦¬
}
- μμ ν API μ¬μ©
- μ§μ OS λͺ
λ Ήμ΄λ₯Ό μ€ννμ§ μκ³ , μμ νκ² νλ‘μΈμ€λ₯Ό μ€ννλ API (μ: μΈμ λ°°μ΄ λ°©μμ
ProcessBuilder
,execvp()
λ±) μ¬μ©
β Command μΈμ μ μνμ μ€μ΄κΈ° μν΄ νλΌλ―Έν°μ λͺ λ Ήμ΄λ₯Ό λͺ ννκ² λΆλ¦¬
- μ§μ OS λͺ
λ Ήμ΄λ₯Ό μ€ννμ§ μκ³ , μμ νκ² νλ‘μΈμ€λ₯Ό μ€ννλ API (μ: μΈμ λ°°μ΄ λ°©μμ
- μ¬μ©μ μ
λ ₯ κ° κ²μ¦
- νμ΄νΈλ¦¬μ€νΈ κΈ°λ° κ²μ¦: νμ©λ κ°λ§ λ°μλ€μ΄κ³ , μμμΉ λͺ»ν μ
λ ₯μ λͺ¨λ κ±°λΆ
β μ κ· ννμ, νμ μ²΄ν¬ λ±μ νμ©νμ¬ μ¬λ°λ₯Έ ν¬λ§·λ§ ν΅κ³Ό
- νμ΄νΈλ¦¬μ€νΈ κΈ°λ° κ²μ¦: νμ©λ κ°λ§ λ°μλ€μ΄κ³ , μμμΉ λͺ»ν μ
λ ₯μ λͺ¨λ κ±°λΆ
- λ©ν λ¬Έμ νν°λ§
- μ¬μ©μ μ
λ ₯μμ νΉμλ¬Έμ (&, ;, |, >, <, $(), `` λ±)λ₯Ό μ κ±°νκ±°λ μ΄μ€μΌμ΄ν μ²λ¦¬
β μ λ ₯ κ°μ ν¬ν¨λ λ©νλ¬Έμλ₯Ό λͺ μμ μΌλ‘ μΉννκ±°λ μ κ±°νμ¬, λͺ λ Ήμ΄ κ²°ν© μ°ν λ°©μ§
- μ¬μ©μ μ
λ ₯μμ νΉμλ¬Έμ (&, ;, |, >, <, $(), `` λ±)λ₯Ό μ κ±°νκ±°λ μ΄μ€μΌμ΄ν μ²λ¦¬
- μλ¬ νΈλ€λ§ λ° λ‘κΉ
- μ
λ ₯ κ° κ²μ¦ μ€ν¨ λ° λͺ
λ Ήμ΄ μ€ν μ€λ₯ μ, λ―Όκ° μ λ³΄κ° λ
ΈμΆλμ§ μλλ‘ μμ νκ² μ²λ¦¬
β μ€λ₯ λ°μ μ λ΄λΆ λ‘κ·Έμλ§ κΈ°λ‘νκ³ , μ¬μ©μμκ²λ μ΅μνμ μ λ³΄λ§ μ 곡
- μ
λ ₯ κ° κ²μ¦ μ€ν¨ λ° λͺ
λ Ήμ΄ μ€ν μ€λ₯ μ, λ―Όκ° μ λ³΄κ° λ
ΈμΆλμ§ μλλ‘ μμ νκ² μ²λ¦¬
- μ½λ 리뷰 λ° μ μ λΆμ
- μ κΈ°μ μΈ μ½λ 리뷰μ μ μ λΆμ λꡬλ₯Ό νμ©νμ¬ Command μΈμ μ μ·¨μ½μ μ¬μ νμ§
- 보μ κ΄λ ¨ λΌμ΄λΈλ¬λ¦¬ λ° νλ μμν¬μ μ΅μ μ λ°μ΄νΈ μ μ©
- ν
μ€νΈ μΌμ΄μ€ λ§λ ¨
- λ€μν μ μμ μ λ ₯(μ°ν νμ΄λ‘λ, μΈμ½λ© λ³ν λ±)μ ν¬ν¨ν λ¨μ ν μ€νΈ, ν΅ν© ν μ€νΈλ₯Ό μν
μμ€ν λ³΄νΈ μ λ΅
- μ΅μ κΆν μμΉ μ μ©
- μ ν리μΌμ΄μ λλ λͺ λ Ήμ΄ μ€ν μ λΉκΆν μ¬μ©μ κ³μ μ νμ©
- μμ€ν μλΉμ€λ μΉ μλ²μ μ€ν κΆν μ νμ ν΅ν΄ 곡격 μ±κ³΅ μ νΌν΄ λ²μ μ΅μν
- μ ν리μΌμ΄μ
μλλ°μ± λ° μ»¨ν
μ΄λν
- μλλ°μ€ νκ²½ λλ 컨ν μ΄λ(μ: Docker)λ₯Ό μ΄μ©ν΄ μ ν리μΌμ΄μ 격리
- μΈλΆ λͺ λ Ή μ€ν μ 격리λ νκ²½ λ΄μμ μ€ννμ¬ μμ€ν μ 체μ μν₯μ μ£Όμ§ μλλ‘ κ΅¬μ±
- λ‘κΉ
λ° λͺ¨λν°λ§ νμ±ν
- λͺ λ Ήμ΄ μ€ν λ‘κ·Έ, μλ¬ λ‘κ·Έ, μ κ·Ό λ‘κ·Έλ₯Ό 체κ³μ μΌλ‘ κΈ°λ‘
- μ΄μ νλ κ°μ§ μ μ¦κ° μλ¦Ό λ° λμν μ μλ λͺ¨λν°λ§ μμ€ν ꡬμΆ
This post is licensed under CC BY 4.0 by the author.