Command Injection [2]
DATE : 2023/9/26
Last updated
DATE : 2023/9/26
Last updated
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를 실행할 것이다.
간단하게 whoami command를 separator &로 연이어 작성해주면!
흠 이상하다 싶어
중간에도 넣어보고
맨 앞에도 넣어보고
뒤에 다른 내용이 더 있나 싶어 Ampersand를 하나 더 붙여도 봤지만..!
아무래도 이번 LAB에서는 & 기호를 separator로 사용할 수 없는 듯하다.
그렇다면 다른 separator를 써볼까??
일단은 && 기호를 사용해봤다. 하지만 이번에도 재고만 나온다..
그 다음으로 || 기호를 사용했더니..! 이번에도 꽝이다.
그렇다면 | 기호는 어떨까??
기대를 품고 check stock 버튼을 눌렀더니
성공했다! 이 LAB에서는 separator로 | 기호만 사용할 수 있도록 제한해둔 듯하다.
혹시나 싶어
동일한 명령어를 중간에 넣어봤더니
이번에는 에러 문구가 나온다. 에러 내용을 보면
"/home/peter-h4pFub/stockreport.sh"에서 에러가 난 걸 알 수 있고 여기서
(1) username이 peter-h4pFub라는 것과
(2) 재고 확인을 위해 실행되는 shell이 stockreport.sh이라는 것도 알 수 있다.
만약 맨 앞쪽에 "whoami|"를 주입하면
stock 확인이 불가 하다는 결과가 나온다.
(아마 whoami & productID를 "|" 기준으로 분리하지 않고 하나의("whoami|productID") parameter로
해석해서 그런 듯..?)
풀이 과정에서 보았듯이, command 사이에 사용할 수 있는 separator는 |, ||, &, &&, ; 이 있는데
";"의 경우에는 unix 기반 OS에서만 사용할 수 있는 separator라는 점!
이번 LAB의 경우,
separator를 완전히 차단했다면 좀 더 어려운 난이도가 되지 않았을까 싶다.
아무튼!
이번LAB처럼 개발자가 의도한 기능을 벗어나 다른 명령어의 결과를 얻을 수 있는 공격이
바로 command injection이며 command injection에 대한 아무런 조치도 취하지 않은 경우,
간단하게 취약점을 악용할 수 있다는 걸 기억하자!
아마 재고만 나올 것이다.
다 실패했다.