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,"&","&")
value = replace(value, "<","<")
value = replace(value, ">",">")
value = replace(value,"'","'")
value = replace(value,chr(34),""")
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, "(", "(")
'str = Replace(str, ")", ")")
'str = Replace(str, "#", "#")
'str = Replace(str, "&", "&")
'str = Replace(str,">",">")
'str = Replace(str,"<","<")
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
현재 대부분의 웹 사이트들은 사용자로부터 입력받은 값을 이용해 데이터 베이스 접근을 위한 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,"&","&")
value = replace(value, "<","<")
value = replace(value, ">",">")
value = replace(value,"'","'")
value = replace(value,chr(34),""")
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, "(", "(")
'str = Replace(str, ")", ")")
'str = Replace(str, "#", "#")
'str = Replace(str, "&", "&")
'str = Replace(str,">",">")
'str = Replace(str,"<","<")
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
댓글목록
등록된 댓글이 없습니다.