사이트 내 전체검색
PHP
[MS-SQL] SQL 인젝션 악성코드 해결방법 (2008/08/26 수정)
로빈아빠
https://cmd.kr/php/712 URL이 복사되었습니다.

본문

안녕하세요. 나누미넷입니다.
최근들어 SQL Injection(인젝션)으로 인해 DB 서버의 데이터 유출 및 웹페이지를 변조시켜 악성코드 배포지로 사용하는등의 웹서버 악용이 전세계적으로 이슈가 되고 대량으로 발생하고 있습니다.

현재 SQL Injection으로 취약한 모든 시스템에 악성코드가 삽입되고 있으며 대부분이 DB에 삽입이되어 사용자가 탐지하기에도 상당한 어려움이 있습니다. 현재 약 50여만대 이상의 웹서버가 피해를 입은 것으로 확인되며 정확한 피해규모를 가늠하기도 어려운 상황입니다.

이에 따라고객님들의 홈페이지 소스보안과 점검을 당부합니다.


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. 공격에 사용되는 도메인

- nmidahena.com
- aspder.com
- nihaorr1.com
- yl18.net
- rnmb.net
- t.uc8010.com
- www.ririwow.cn


4. 점검방법
www.google.co.kr 에서 자신이 운영중인 도메인을 검색하여 피해유무 파악

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

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

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

 

5. 대처방법

아래의 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
--------------------------------------------------

board_view.asp(안전한 SQL injection예제)
--------------------------------------------------
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

Dim idx : idx=sqlCheck(request("idx"))
Dim sqlString

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


6. 주의사항

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


7. 기타

추가적인 사항들은 아래의 주소를 참고하시고 취약점이 확인될 경우 반드시 소스를 수정 해 주시기 바랍니다.
http://swbae.egloos.com/1747128
http://8220.tistory.com/entry/펌-pstmtSQL-Injection
https://webcheck.krcert.or.kr/index.webcheck

 

자료출처 :  나누미넷

댓글목록

등록된 댓글이 없습니다.

PHP
871 (5/18P)

Search

Copyright © Cmd 명령어 3.148.117.237