셸이란
명령어를 받아 해석·실행하는 프로그램. 사용자와 커널 사이 인터페이스.
핵심 성질 = 특수문자(메타문자) 해석. 입력을 곧이곧대로 실행하지 않고 ; | $() 를 먼저 문법으로 해석함. → 명령 주입이 성립하는 근거. 사용자 입력이 셸 문자열에 섞이면 입력 속 메타문자가 명령으로 해석됨.
명령 이어붙이기
| |
$(cmd)가 핵심: 구분자(;) 없이 기존 명령 문자열 안에 코드 삽입 가능. ;가 막힌 주입 지점(쿠키 등)에서 이어붙이기 대체재.
리다이렉션
| |
stdout / stderr
| |
기본은 둘이 따로 흐름. find처럼 권한 없는 경로를 훑는 명령은 stderr 대량 발생:
- 결과+에러 한 곳에 모으기 →
2>&1 - 에러 버리고 결과만 보기 →
2>/dev/null(실전에서 더 자주 씀)
공백 우회: ${IFS}
IFS = Internal Field Separator. 셸이 단어를 끊는 기준 변수, 기본값 = 공백·탭·개행.
| |
공백을 직접 못 넣는 주입 지점(쿠키, 일부 URL 파라미터)에서 공백 대용. $()(구분자 우회) + ${IFS}(공백 우회) = 필터 우회 기본 한 쌍.
자주 쓰는 명령
| |
exfiltration:
| |
--data-urlencode 권장: 대상 파일에 {}·공백·개행 있어도 안 깨짐. -d @는 날것이라 특수문자에서 깨질 위험.
find는 범위를 좁힐 것
find / 통째로는 /proc·/sys(가상 파일 수천 개)까지 훑어 매우 느림. blind에서 결과를 파이프로 넘기면 소비자(curl)가 find 종료까지 대기 → 결과 안 옴 / 타임아웃.
| |