[Web Hacking] DH SeverSide: Command Injection

KyungH·2024년 3월 10일

DH Lecture - Web Hacking

목록 보기
12/17
post-thumbnail

DH Web Hacking

📝SeverSide: Command Injection

📌Command Injection

다양한 웹 애플리케이션 제작용 언어는 시스템에 내장되어있는 프로그램들을 호출할 수 있는 함수를 지원한다. 각 언어별 시스템 함수로는 PHP의 system, NodeJS의 child_process, 파이썬의 os.system이 있다. 이러한 함수는 전달된 인자를 셸 프로그램에 전달하여 명령어를 실행한다.

그러나 함수의 인자를 셸의 명령어로 전달한다는 점에서 치명적인 취약점으로 이어지기도 한다. Command Injection은 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생한다.

시스템 함수를 사용하여 이용자의 입력을 소프트웨어의 인자로 전달할 수 있다. 그러나 이러한 함수를 사용할 때, 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수 있다.

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

메타문자

명령어 치환

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

$ echo `echo theori` theori

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

$ 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)

References

DreamHack 강의 - ServerSide: Command Injection

0개의 댓글