SQL Injection - sp_msdropretry

  • Post author:
  • Post category:
  • Post comments:0 Comments
  • Post last modified:July 11, 2006

한때 함께 일했던 조운영씨가 가끔 Microsoft SQL Server 2000에 관해 물어보신다. SQL Injection와 관련된 쿼리를 다루시는 것 같다. 오늘은 시스템 저장프로시저 sp_MSdropretry에 대해 알아봤다. 서비스팩 3 이전의 sp_MSdropretry의 코드는 다음과 같다.

CREATE PROCEDURE sp_MSdropretry (
	@tname sysname
, 	@pname sysname)
as
	declare @retcode int
	/*
	** To public
	*/
	exec ('drop table ' + @tname)
	if @@ERROR <> 0 return(1)
	exec ('drop procedure ' + @pname)
	if @@ERROR <> 0 return(1)
	return (0)
GO

눈치 빠른 사람은 벌써 뭐가 문제인지 알았을 것이다. 다음과 같은 쿼리를 실행시키면, 첫번재 매개변수 뒤의 select * from master.dbo.sysxlogins가 실행되어 버린다.

exec sp_MSdropretry
	'mytable select * from master.dbo.sysxlogins'
,	'mytable'

서비스팩 3 이후에는 이같은 문제를 해결하기 위해 sp_MSdropretry의 구현이 다음과 같이 바뀌었다.

CREATE PROCEDURE sp_MSdropretry (
	@tname sysname
,	@pname sysname)
as
	declare @retcode int
	declare @quotedtname sysname
	declare @quotedpname sysname

	/*
	** To public
	*/
	if not exists (select * from dbo.sysmergepublications
		where 1 = {fn ISPALUSER(pubid)})
	begin
		RAISERROR (14126, 11, -1)
		return (1)
	end

	select @quotedtname = quotename(@tname)
	select @quotedpname = quotename(@pname)

	exec ('drop table ' + @quotedtname)
	if @@ERROR <> 0 return(1)
	exec ('drop procedure ' + @quotedpname)
	if @@ERROR <> 0 return(1)
	return (0)

첫번째 if 문은 어떤 의미인지 정확하게 모르겠다. ISPALUSERsp_MSdropretry와 마찬가지로 문서화되어 있지 않은데다가, 복제와 관련해서는 경험이 부족하다.

내가 중요하게 보는 부분은 quotename 함수이다. 종전에는 첫번째 매개변수 값이 'mytable select * from master.dbo.sysxlogins'였을 때, 실행되는 쿼리는 drop table mytable select * from master.dbo.sysxlogins였다. quotename 함수가 추가됨으로써 이제는 drop table [mytable select * from master.dbo.sysxlogins]가 실행된다. 당연히 문법 에러가 발생하고 쿼리는 실행되지 않는다.

여기서 소개한 것은 마이크로소프트에서 기본적으로 제공하는 시스템 저장프로시저의 취약점이었다. 하지만 많은 개발자들이 잘 모르고 이런 식의 동적 쿼리를 많이 작성한다. 나 역시 마찬가지고, 조금 더 세심하게 작업해야겠다.

Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
follow me
  • 일이든 소셜이든 잠시 숨을 고르고 멈춰서 둘러보면 산으로 가는 일이 비일비재하다.
    2 days ago
  • 최선의 노력을 투입해 거대한 쓰레기를 내놓는다던가, 차라리 조금 더 망설이며 천천히 했으면 계곡 깊숙히 차를 쳐박기 전에 돌아나오기라도 했을텐데 문제를 제기한 배경을 이해하고 진짜 문제가 맞는지 의심해보지… https://t.co/naZX8nGkVZ
    2 days ago
  • 세상에 똑똑한 친구가 참 많은데 현명한 친구는 또 그렇지 않단 말이지. 문제가 있으면 그 문제를 잘 분석해서 최적화하고 그럴 듯한 보고서든 실물이든 잘 만든다. 그런데 전제와 가정을 주의깊게 안 보니 실은… https://t.co/2PS5SU1mJl
    2 days ago
Buy me a coffeeBuy me a coffee
×
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
Latest Posts