[SQL Server] xp_cmdshell오류 해결 방법과 보안 취약점
xp_cmdshell을 통해 BCP 명령어를 실행해서 대량의 데이터를 가져올 일이 있었습니다만 여러 오류를 만났습니다.
오류 해결 과정을 기록해둡니다.
1. xp_cmdshell 이 activate 되어있는지 확인합니다.
EXEC sp_configure 'show advanced options', 1
go
RECONFIGURE
go
EXEC sp_configure 'xp_cmdshell', 1
go
RECONFIGURE
go
2. SQL Server 구성관리자에서 TCP/IP를 사용중인지 확인합니다.
=> SQL Server 네트워크 구성 -> MSSQLSERVER에 대한 프로토콜 -> TCP/IP 사용으로 변경
3. . 을 찍기....
소유한 데이터베이스 앞에 .를 찍습니다.
xp_cmdshell는 시스템데이터베이스인 master 데이터베이스의 시스템확장 저장프로시져입니다.
따라서 EXEC .master..xp_cmdshell 'dir C:\' 와 같이 실행하면 정상 실행됩니다.
그냥 EXEC .xp_cmdshell 'dir C:\' 로 실행해도 됩니다.
(추측컨데, 현재 접속한 server 의 SP라고 명시적으로 지정해주는 것같습니다... 누가 제발 알려주세요..)
https://stackoverflow.com/questions/27744071/xp-cmdshell-transport-level-error에서 참고했습니다.
아래 오류 메세지를 반환했다면 3번 방법으로 해결될 확률이 높습니다.
서버로부터 결과를 수신하는 동안 전송 수준 오류가 발생했습니다. (provider: TCP Provider, error: 0 - 세마포 제한 시간이 만료되었습니다.)
xp_cmdshell 취약점
mssql 의 가장 큰 보안 취약점은 xp_cmdshell 을 이용한 injection 해킹입니다.
xp_cmdshell을 사용한다면 cmd창에서 날릴수 있는 모든 명령어를 날릴 수 있다보니, 암호를 변경하고 사용자 활성화를 할 수 있습니다. 따라서 xp_cmdshell은 되도록이면 비활성화 해두는 것이 좋습니다.
참고 : https://iseogs.tistory.com/74 / http://ankyu.entersoft.kr/lecture/security/05_security_01.asp