Command Injection [2]

DATE : 2023/9/26

OS Command Injection

Command Injection [1]에서 다룬 내용을 간단한 LAB을 통해 확인해볼까 한다.

LAB으로 들어가면 여러 상품들의 post를 볼 수 있다.

그 중에서 아무거나 클릭해서 상품 페이지로 들어가면

상품 이미지와 간단한 설명을 볼 수 있고 하단에는 재고를 확인할 수 있는 form이 눈에 들어온다.

지점을 선택하고 "check stock" 버튼을 누르면

선택한 지점에 해당 상품이 몇 개 남아있는 지 알려준다.

이번 LAB에는 이 재고 확인 기능을 통해 command injection을 실행할 수 있을 듯하다.

일단 재고 확인 시 만들어지는 packet 내용을 확인해보자.

POST method로 /product/stock에 productID & storeID 값을 전달하고 있다.

이때 전달되는 productID & storeID에 실행하고자 하는 명령어를 이어 붙이면 될 듯하다.

LAB의 목표는 현재 username을 알아내는 것이므로 whoami command를 실행할 것이다.

productID=3&storeID=2&whoami

간단하게 whoami command를 separator &로 연이어 작성해주면!

🤪 아마 재고만 나올 것이다.

흠 이상하다 싶어

productID=3&whoami&storeID=2

중간에도 넣어보고

whoami&productID=3&storeID=2

맨 앞에도 넣어보고

productID=3&storeID=2&whoami&

뒤에 다른 내용이 더 있나 싶어 Ampersand를 하나 더 붙여도 봤지만..!

다 실패했다. 😠

아무래도 이번 LAB에서는 & 기호를 separator로 사용할 수 없는 듯하다.

그렇다면 다른 separator를 써볼까??

productID=3&storeID=2&&whoami

일단은 && 기호를 사용해봤다. 하지만 이번에도 재고만 나온다..

productID=3&storeID=2||whoami

그 다음으로 || 기호를 사용했더니..! 이번에도 꽝이다.

productID=3&storeID=2|whoami

그렇다면 | 기호는 어떨까??

기대를 품고 check stock 버튼을 눌렀더니

성공했다! 이 LAB에서는 separator로 | 기호만 사용할 수 있도록 제한해둔 듯하다.

혹시나 싶어

productId=3|whoami&storeID=2

동일한 명령어를 중간에 넣어봤더니

이번에는 에러 문구가 나온다. 에러 내용을 보면

"/home/peter-h4pFub/stockreport.sh"에서 에러가 난 걸 알 수 있고 여기서

(1) username이 peter-h4pFub라는 것과

(2) 재고 확인을 위해 실행되는 shell이 stockreport.sh이라는 것도 알 수 있다.

whoami|productID=3&storeID=2

만약 맨 앞쪽에 "whoami|"를 주입하면

stock 확인이 불가 하다는 결과가 나온다.

(아마 whoami & productID를 "|" 기준으로 분리하지 않고 하나의("whoami|productID") parameter로

해석해서 그런 듯..?)


풀이 과정에서 보았듯이, command 사이에 사용할 수 있는 separator는 |, ||, &, &&, ; 이 있는데

";"의 경우에는 unix 기반 OS에서만 사용할 수 있는 separator라는 점!

이번 LAB의 경우,

separator를 완전히 차단했다면 좀 더 어려운 난이도가 되지 않았을까 싶다.

아무튼!

이번LAB처럼 개발자가 의도한 기능을 벗어나 다른 명령어의 결과를 얻을 수 있는 공격이

바로 command injection이며 command injection에 대한 아무런 조치도 취하지 않은 경우,

간단하게 취약점을 악용할 수 있다는 걸 기억하자!

Last updated