SQL 인젝션 악성코드 해결방법 > 기술자료 | 해피정닷컴

SQL 인젝션 악성코드 해결방법 > 기술자료

본문 바로가기

사이트 내 전체검색

SQL 인젝션 악성코드 해결방법 > 기술자료

MSSQL SQL 인젝션 악성코드 해결방법

페이지 정보


본문

1. SQ Injection 설명

현재 대부분의 웹 사이트들은 사용자로부터 입력받은 값을 이용해 데이터 베이스 접근을 위한 sql query를 만들고 이용하고 있습니다.

sql injection은 웹 페이지의 반환 메시지를 이용하여 불법 인증 및 정보를 유출하거나 웹 프로그램에 sql 구문을 삽입하여 내부 DB 서버의 데이터를 유출 및 변조하고 관리자 인증을 우회할 수도 있습니다.

사용자로부터 입력받은 값에 sql 구문에 대한 필터링이 없을 경우 공격자가 sql문으로 해석될 수 있는 입력을 시도하여 DB에 접근하고 자료를 무단으로 유출하거나 변조할 수 있습니다.


2. 공격사례

최근 대량 SQL injection 삽입 공격의 웹로그를 확인해보면 아래와 같은 형식으로 공격을 시도하고있습니다.

(암호화된 HTTP Request)
POST /board_view.asp?idx=15;DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x4400450043004C
0041005200450020004000540020007600610072006300680061007200280032003500350029002C00400
04300200076006100720063006800610072002800320035003500290020004400450043004C0041005200
450020005400610062006C0065005F0043007500720073006F007200200043005500520053004F0052002
...생략...
500720073006F007200%20AS%20NVARCHAR(4000));EXEC(@S);-- 80 - 60.169.3.130 Mozilla/3.0+(compatible;+Indy+Library) 200 0 0

(디코딩한 SQL 쿼리)
DECLARE @S NVARCHAR(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,['+@C+']))+''''')FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor;EXEC(@S);--

위의 쿼리는 DB테이블에 를 삽입하는 쿼리이며 HTTP 메소드 중 POST 메소드를 이용하는 것을 알 수 있습니다.


3. 점검방법

www.google.com 에서 자신이 운영중인 도메인을 검색하여 피해유무 파악

서비스중인도메인이 abc.com일 경우 검색방법
abc.com 0.js / abc.com 1.js / abc.com 2.js / abc.com fuckjp.js 으로 각각 검색해서
아래와 같은 결과가 나올 경우 이미 공격을 받은 것입니다.

모두 공통적으로 형태의 코드가 삽입된것을 확인할 수 있습니다.

데이터베이스나 홈페이지 소스파일을 확인하시고 형태의 코드나 정상적이지 않은 내용의 테이블이 있다면 SQL Injection 공격으로 인해 악성코드 배포지로 악용당한 경우입니다.


4. 대처방법

아래의 asp 예제 소스를 참고하시고 운영중인 사이트 특성에 맞춰 소스를 수정하시기 바랍니다.
board_view.asp 파일이 아래와 같을 경우 idx에서 특정문자를 필터링 하지 않으면
idx값이 15로 전달되는 것이 아니라 공격자가 작성한 sql문이 포함된 상태로 전달이 되어
DB서버의 데이터에 변조가 발생하게 됩니다.

SQL injection으로부터 웹사이트를 보호하기 위해서
입력받은 변수와 DB 필드의 데이터형을 일치 시켜야 하고, 사용중인 SQL 구문을 변경시킬 수 있는
특수문자가 포함되어 있는지 체크해야 합니다. 또한, 검색 부분과 같이 사용자로부터 생성된 SQL 구문을
받는 부분이 있다면 이를 제거해야 합니다.

board_view.asp(취약한 SQL injection예제)
--------------------------------------------------
Dim idx : idx=request("idx")
Dim sqlString

sqlString="select * from tbl where idx="&idx
--------------------------------------------------


4-1. 인젝션 문제되는 단어가 포함되면 무조건 튕겨내기

dim hpSQLstr,hpSQLval      ' 해피정닷컴 추가 2008-05-27
function sqlCheck(hpSQLstr)
  hpSQLval=UCASE(hpSQLstr)
  if instr(hpSQLval, ";") <> 0 Or _
    instr(hpSQLval, "'") <> 0 Or _
    instr(hpSQLval, "--") <> 0 Or _
    instr(hpSQLval, "/*") <> 0 Or _
    instr(hpSQLval, "*/") <> 0 Or _
    instr(hpSQLval, "XP_") <> 0 Or _
    instr(hpSQLval, "DECLARE") <> 0 Or _
    instr(hpSQLval, "SELECT") <> 0 Or _
    instr(hpSQLval, "UPDATE") <> 0 Or _
    instr(hpSQLval, "DELETE") <> 0 Or _
    instr(hpSQLval, "INSERT") <> 0 Or _
    instr(hpSQLval, "SHUTDOWN") <> 0 Or _
    instr(hpSQLval, "DROP") <> 0 then
'    response.write "오류발생"
    response.Write("<script type='text/javascript'>")
    response.Write("    alert('금지된 단어가 포함되어 있습니다.\n\n 내용을 다시 확인해주세요');")
    response.Write("    history.back();")
    response.Write("</script>")
    response.End
  Else
    sqlCheck=hpSQLstr
  end if
end function

' 사용법
idx = sqlCheck(request("idx"))


4-2. SQL Injection 특수문자 필터링(변경하기)

' 특수 문자 변경하기
Function sqlCheck(value)    
    value = replace(value,"&","&amp;")
    value = replace(value, "<","&lt;")
    value = replace(value, ">","&gt;")
    value = replace(value,"'","&#039")
    value = replace(value,chr(34),"&quot;")
    value = replace(value,chr(92),"\")
    value = trim(value)

    Dim str
    str = Trim(value)
    If str <> "" Then
        'str = Replace(str,"'","''")
        'str = Replace(str,";","")
        'str = Replace(str, "(", "&#40;")
        'str = Replace(str, ")", "&#41;")
        'str = Replace(str, "#", "&#35;")
        'str = Replace(str, "&", "&#38;")
        'str = Replace(str,">","&gt;")
        'str = Replace(str,"<","&lt;")
        str = Replace(str, "%", "")
        str = Replace(str, "--", "")
        str = Replace(str, "/*", "")
        str = Replace(str, "*/", "")   
        str = Replace(LCase(str), "cookie", "cook1e")
        str = Replace(LCase(str), "document", "d0cument")
        str = Replace(LCase(str), "script", "scr1pt")
        str = replace(LCase(str), "iframe", "ifr@me")
        str = Replace(LCase(str), "@variable", "")
        str = Replace(LCase(str), "@@variable", "")
        str = Replace(LCase(str), "print", "")
        str = Replace(LCase(str), "set", "")        
        'str = Replace(LCase(str), "or", "")
        'str = Replace(LCase(str), "union", "")
        'str = Replace(LCase(str), "and", "")
        str = Replace(LCase(str), "select", "")
        str = Replace(LCase(str), "insert", "")
        str = Replace(LCase(str), "update", "")
        str = Replace(LCase(str), "delete", "")
        str = Replace(LCase(str), "openrowset", "")
        str = Replace(LCase(str), "declare", "")
        str = Replace(LCase(str), "shutdown", "")
        'str = Replace(LCase(str), "drop", "")
        str = Replace(LCase(str), "xp_", "")
    End If
    
    value = str

    sqlCheck=value
End Function

' 사용법
idx = sqlCheck(request("idx"))


4-3. SQL Injection 특수문자 필터링(변경하기) 2


5. 주의사항

- 소스파일에 악성코드가 삽입될 수 있으나 대부분이 DB에 악성코드가 삽입되어 있습니다.
- 공격 때문에 기존의 데이터가 일부 삭제되거나 변경되었을 수 있습니다.
   백업파일을 이용하여 복원은 가능하겠으나 일부 데이터의 유실은 복원이 불가 할 수 있습니다.
- 근본원인은 개발된 사이트가 sql 구문에 대한 필터링이 없이 개발이 되어 있어서 그렇습니다.
   외주개발 업체 또는 내부개발팀을 통해 소스를 수정하시기 바랍니다.
- 소스 수정이 불가능할 경우 웹 방화벽을 이용할 수 있으나 100% 차단을 보장할 수 없습니다.



관련자료
나누미넷
http://swbae.egloos.com/1747128
http://8220.tistory.com/entry/펌-pstmtSQL-Injection
https://webcheck.krcert.or.kr/index.webcheck

댓글목록

등록된 댓글이 없습니다.


Total 2,640건 108 페이지
  • RSS
기술자료 목록
500
ClassicASP   13971  2008-06-11 09:54 ~ 2009-07-20 00:00  
499
ClassicASP   12535  2008-06-10 19:47 ~ 2009-10-26 00:00  
498
영카트   15632  2008-06-09 11:02  
497
HTML   13126  2008-06-08 07:25 ~ 2010-12-06 00:00  
496
영카트   13339  2008-06-07 18:08  
495
일반   11864  2008-06-05 05:06  
494
JavaScript   24951  2008-06-04 12:18  
493
ClassicASP   15368  2008-05-29 22:14  
492
WindowsServer   22164  2008-05-29 17:51 ~ 2015-02-23 00:00  
491
테크노트   14648  2008-05-27 10:19 ~ 2022-10-13 07:40  
490
ClassicASP   15483  2008-05-23 23:29  
489
ClassicASP   21906  2008-05-23 23:14 ~ 2016-01-23 00:00  
열람
MSSQL   24868  2008-05-22 05:48 ~ 2016-05-28 00:00  
487
ClassicASP   10060  2008-05-20 19:10  
486
Linux   9552  2008-05-20 08:10 ~ 2021-09-09 09:29  
485
메이크샵   14363  2008-05-03 11:28  
484
JavaScript   13726  2008-05-15 21:00  
483
도메인   12682  2008-05-15 14:14  
482
영카트   11705  2008-05-14 11:57  
481
그누보드   11354  2008-05-10 15:38  

검색

해피정닷컴 정보

회사소개 회사연혁 협력사 오시는길 서비스 이용약관 개인정보 처리방침

회사명: 해피정닷컴   대표: 정창용   전화: 070-7600-3500   팩스: 042-670-8272
주소: (34368) 대전시 대덕구 대화로 160 대전산업용재유통단지 1동 222호
개인정보보호책임자: 정창용   사업자번호: 119-05-36414
통신판매업신고: 제2024-대전대덕-0405호 [사업자등록확인]  
Copyright 2001~2024 해피정닷컴. All Rights Reserved.