Vulnerability: Command Injection
์ปค๋งจ๋ ์ธ์ ์ (Command Injection)์ ๋ํ Prcatice ์ด๋ค.
Command Injection์ ์น ์์ฒญ ๋ฉ์์ง์ ์์์ ์์คํ ๋ช ๋ น์ด๋ฅผ ์ฝ์ ํ๊ณ ์ ์ก, ์น ์๋ฒ์์ ํด๋น ๋ช ๋ น์ด๋ฅผ ์คํํ๋๋ก ํ๋ ๊ณต๊ฒฉ์ด๋ค.
(์น์์ ์์คํ ๋ช ๋ น์ด(command)๋ฅผ ์ ๋ ฅํ๋ ๋ถ๋ถ์์ ์ถ๊ฐ์ ์ธ ๋ช ๋ น์ด์ ์คํ์ ํตํด ๊ณต๊ฒฉํ๋ ๊ฒ์ด๋ค.)
Vuln Point
์น ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์์คํ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ์ํฉ์์ ์ ๋ ฅ๊ฐ์ ๋ํ ์ ์ ํ ๊ฒ์ฌ ์์ด ์์คํ ๋ช ๋ น์ด์ ์ผ๋ถ๋ถ์ผ๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ, ๊ณต๊ฒฉ์๊ฐ ์ ๋ ฅ๊ฐ์ ์กฐ์ํ์ฌ ์์์ ์์คํ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๋ค.
Vuln Example
DVWA์ ์์์ ๊ฐ์ด ์ฌ์ฉ์๊ฐ IP ์ฃผ์๋ฅผ ์ ๋ ฅํ์ ๋ ์น ์๋ฒ์์ ping ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์น ํ์ด์ง๊ฐ ์๋ค๊ณ ํด๋ณด์.
ping: ์ ๋ ฅ๋ IP ์ฃผ์์ ์์คํ ์ด ํ์ฌ ๋์ ์ค์ธ์ง ํ์ธํ๋ ๋ช ๋ น์ด
ping ๋ช ๋ น์ด๊ฐ ์คํ๋๋ ๊ณผ์ ์ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์์ ๊ณผ์ ์์ ์นํ์ด์ง๊ฐ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ๋ํ์ฌ ์ ๋๋ก ๊ฒ์ฌ๋ฅผ ํ์ง ์๋๋ค๋ฉด, ๊ณต๊ฒฉ์๋ IP์ฃผ์ ๋ค์ ๋ค๋ฅธ ์์คํ ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐ๋ก ์ ๋ ฅํ์ฌ ์น ์๋ฒ์์ ์ํ๋ ์์คํ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ๋๋ค.
ํด๋น ๊ณผ์ ์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
IP ์ฃผ์ ์ ๋ ฅ์ ์๋ ์คํ๋์ด์ผ ํ๋ ping ๋ช ๋ น์ด์, ๊ณต๊ฒฉ์๊ฐ ์ ๋ ฅํ ๋ช ๋ น์ด(command)๊ฐ ๊ฐ์ด ์คํ๋๋ ๊ฒ์ด๋ค.
(์์ ๊ณผ์ ์ด ์ปค๋งจ๋ ์ธ์ ์ (Command Injection) ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ ์์คํ ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ ฅํ์ ๋ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.)
๋ง์ฝ ๊ณต๊ฒฉ์๊ฐ ip ์ฃผ์ ๋ค์, cat ../../../../../../etc/passwd ์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ, ์น ์๋ฒ๋ ping ๋ช ๋ น์ด์ cat ๋ช ๋ น์ด๋ฅผ ๋ชจ๋ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ๊ณต๊ฒฉ์์๊ฒ ์ ๋ฌ(return)ํ๊ฒ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ณต๊ฒฉ์๋ ์ํ๋ ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ ฅํจ์ผ๋ก์จ ํด๋น ์ ๋ณด๋ฅผ ๋นผ์ฌ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ช ๋ น์ด ์ฐ๊ฒฐ - ํน์๋ฌธ์
๊ณต๊ฒฉ์๊ฐ ์ ๋ ฅ๊ฐ์ ํตํด ์ํ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ๋ณต์์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ํน์๋ฌธ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
&๋ ์ ๋์ค ๊ณ์ด์์๋ ๋ท๋ฉด ์์ (background job)์ด๋ค. ์๋์ฐ์์๋ ๋ช ๋ น์ด๊ฐ ํ๋์ฉ ์คํ๋๋ ์์ฐจ์ ์ฐ๊ฒฐํ์ผ๋ก ํด์ํ๋ค. #์ ๋ท๋ถ๋ถ์ ๋๋ถ๋ถ์ ์์์ ์ฃผ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๋ช ๋ น์ด ๊ตฌ๋ถ์ ์ํ ํน์๋ฌธ์
๋ช ๋ น์ด ์ฝ์ ์ ์(shell)์์ ์ด์์ฒด์ ๋ช ๋ น์ด๋ฅผ ์ฐ์ด์ด ์ฌ์ฉํ ์ ์๋ ํน์ง์ ์ด์ฉํ๋ค. ์ ๋์ค(Unix) ๊ณ์ด์ ์ด์์ฒด์ (Linux)์์ ๋ช ๋ น์ด ์ฐ๊ฒฐ ํ์์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
์์ฐจ์ ์ฐ๊ฒฐ( ; ),
๋ท๋ฉด ์คํ( & ),
ํ์ดํ ์ฐ๊ฒฐ( | ),
์ฐธ ์กฐ๊ฑดํ ์ฐ๊ฒฐ( && ),
๊ฑฐ์ง ์กฐ๊ฑดํ ์ฐ๊ฒฐ( || ),
์ค๋ฐ๊พธ๊ธฐํ ์ฐ๊ฒฐ( \n )
MS ์๋์ฐ ๊ณ์ด๋ ์ ์ฌํ ๋ฐ ์ ๋์ค์ ๋ท๋ฉด ์คํ ์ฐ๊ฒฐ(&)์ด ์์ฐจ์ ์ฐ๊ฒฐ๋ก ํด์๋๋ ๊ฒ์์ ์ฐจ์ด๊ฐ ์๋ค.
๋ช ๋ น์ด ์ฝ์ ์ทจ์ฝ์ ์ ์ ๊ฒํ ๋๋ ๋๋ถ๋ถ์ ์ด์์ฒด์ ์์ ๊ณตํต์ ์ผ๋ก ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก &๋ฅผ ์ฌ์ฉํ๋ค.
DVWA Command Injection ์ค์ต
์ค์ต ํ๊ฒฝ
- Windows Docker๋ฅผ ์ด์ฉํ DVWA
- Windows ํ๊ฒฝ์ Burp Suite
Command Injection์ ๋ค์ด๊ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฐฝ์ด ๋์จ๋ค.
์ ๋ ฅ ๋ถ๋ถ์ ip ์ฃผ์๋ฅผ ์ ๋ ฅํ๋ฉด ํด๋น ์ฃผ์์ ๋ํ ping ๋ช ๋ น์ด๊ฐ ์คํ๋๋ค.
์์ ๊ฐ์ด ์ ๋ ฅํ ip์ฃผ์ 127.0.0.1์ ๋ํ 4๋ฒ์ ping ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Security Level: Low
Low ๋ ๋ฒจ์ ๊ฒฝ์ฐ, ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ช ๋ น์ด ๊ตฌ๋ถ์ ์ํ ํน์๋ฌธ์๊ฐ ๋ชจ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
127.0.0.1; cat ../../../../../../etc/passwd
์์ ๊ฐ์ด ip ์ฃผ์ ๋ค์ ; ๋ฅผ ์ ๋ ฅํ๊ณ ์ํ๋ ๋ช ๋ น์ด(etc/passwd)๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ ฅํ์ฌ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ด๊ฒ์ Burp Suite์ ํตํด ์์ฒญ(Request)์ ์๋ต(Response)๋ฅผ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์์ ๊ฐ์ด 127.0.0.1; cat ../../../../../../etc/passwd ๋ฅผ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ, ping ๋ช ๋ น์ด์ ๊ฒฐ๊ณผ ๋ค์ cat ๋ช ๋ น์ด๊ฐ ์คํ๋์ด ๋ด๋ถ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.
Security Level: Medium
Medium ๋ ๋ฒจ์ ๊ฒฝ์ฐ, ๋ช ๋ น์ด ์ฐ๊ฒฐ์ ์ํ ํน์๋ฌธ์๋ค ์ค ์ผ๋ถ๋ถ์ ํํฐ๋ง ํ๊ณ ์๋ค.
&&, ; ์ ๋๊ฐ์ง๋ง ํํฐ๋งํ๊ณ ์์ด์ ์ด์ธ์ ํน์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ทจ์ฝํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
127.0.0.1& cat ../../../../../../etc/passwd
์์ ๊ฐ์ด ์ ๋ ฅ ๊ฐ์ ๋ํ์ฌ &&, ; ์ ๊ฒฝ์ฐ์ ๋ํ์ฌ ๋ธ๋๋ฆฌ์คํธ ํํฐ๋ง์ ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Security Level: High
High ๋ ๋ฒจ์ ๊ฒฝ์ฐ, ๋ช ๋ น์ด ์ฐ๊ฒฐ์ ์ํ ํน์๋ฌธ์์ ๋๋ถ๋ถ ํํฐ๋ง ํ๊ณ ์๋ค.
ํ์ง๋ง | ์ ๊ฒฝ์ฐ '|' ๊ฐ ์๋ '| ' ์ ๊ฐ์ด ๊ณต๋ฐฑ์ด ํ๋ ๋ค์ด๊ฐ ๊ฒ์ ํํฐ๋ง ํ๊ณ ์์ด์, | ๋ฅผ ๋ถ์ฌ ์ฐ๋ ๊ฒฝ์ฐ์๋ ํํฐ๋ง ํ์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. (๊ฐ๋ฐ์์ ์ค์๋ผ๊ณ ํ ์ ์๋ค.)
127.0.0.1|cat ../../../../../../etc/passwd
์์ ๊ฐ์ด ์ ๋ ฅ ๊ฐ์ ๋ํ์ฌ ๋๋ถ๋ถ์ ๋ฌธ์์ด์ ๋ํ์ฌ ๋ธ๋๋ฆฌ์คํธ ํํฐ๋ง์ ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ์ง๋ง ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ํฌํจ๋ ๊ฒ์ ํ์ธํ๋ ๊ฒฝ์ฐ ๊ณต๋ฐฑ์ด ํฌํจ๋์ด์ผ๋ง ํด๋น ๋ฌธ์์ด๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ ์ฐํ๊ฐ ๊ฐ๋ฅํ๋ค.
Security Level: Impossible
Impossible ๋ ๋ฒจ์ ๊ฒฝ์ฐ, ํด๋น ๋ณด์ ์์ค์์๋ ping ๋ช ๋ น์ด์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉ๋๋ ip ๋ณ์๋ฅผ ์จ์ ํ๊ฒ ๊ฒ์ฆํ๋ค.
ping ๋ช ๋ น์ด๋ฅผ ์ํด ip ์ฃผ์๋ฅผ ์ ๋ ฅ์ผ๋ก์ ๋ฐ๋ ๊ณผ์ ์์ ๋ค๋ฅธ ๋ช ๋ น์ด๋ค์ ์ถ๊ฐ์ ์ผ๋ก ์คํํ ์ ์๋ ๊ฒ์ด ๋ฌธ์ ์๋๋ฐ, ์ ๋ ฅ ๊ฐ์ ๋ํ์ฌ ip ์ฃผ์ ์ธ์ ๋ค๋ฅธ ๊ฐ์ด ๋ค์ด์ค๋๋ผ๋ ip ์ฃผ์๋ฅผ ๊ฒ์ฆํ๋ ๋ก์ง์ ์ด์ฉํ์ฌ ip ์ฃผ์๋ง์ ์ธ์ํ๋๋ก ํ๋ค.
// Split the IP into 4 octects
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ip ๋ณ์๋ฅผ ์จ์ ํ๊ฒ ๊ฒ์ฆํ๊ธฐ ์ํด, ์ซ์ ๋ค๊ฐ๋ฅผ ๋ง์นจํ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์ ๋ ฅ์ด ๋ค์ด์ฌ ์ ์๋ ์ฌ์ง๋ฅผ ์ฐจ๋จํ๋ ๋ฐฉ์์ด๋ค.
Command Injection ๋์
์๋ฒ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ์์ ์์คํ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋ฅํ ํผํ๋ ๊ฒ์ด ์ข๋ค.
ํ์ง๋ง ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฌ์ฉ์์ ์ ๋ ฅ์ด ์ ๋ฌ๋๋ ๊ฒ์ ์ฐจ๋จํด์ผ ํ๋ค.
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์