하늘높이의 프로그래밍 이야기

SQL Injection 처리 이 글을 작성한 지 한 일주일 정도가 흘렀는데…

블로그에 이 키워드로 방문하시는 분이 꽤 많으신 듯…

 

해당 키워드를 다시 찾아보니…

구글에 찾아보니 검색된 사이트가 28300여 개로 늘었다. (허걱 4배나…)

 

구글 검색

 

음 “빵빵용용”님의 새 글(http://saybox.tistory.com/546 )을 읽어 보면 이 공격의 원인도 보이고 해결 방법도 보인다.

 

하지만…

Request 를 받는 모든 소스를 수정한다는 것은…만만한 작업은 아니더라...

지금 사이트도 Request를 검색해보니 4~500개

하지만 이 사이트는 1년에 글 한 개 올라오기 힘든 회사 소개 홈페이지 인데…

그것을 위해 게시판 소스를 다 뒤집자니 시간이 아깝고… 검색된 리퀘스트 문장은 4~500개에 가깝고…

 

그래서 어떻게 편하게 할까 고민해 봤다.

그리고 생각해 난 방법이

이렇게 커넥션 문장 아래에… GET과 POST를 모두 조사해서 DB 문장이 들어오면 에러메시지를 뿌리고 Response.end !!

(사이트 성격에 따라 이렇게 처리해도 무관한 사이트도 있을 것 같아서 올려 봅니다. 참고하세요.!~)

<% 
    Set pConn = Server.CreateObject("ADODB.Connection")

sConnStr = "Provider=SQLOLEDB.1;User ID=" & DB_user_id &

";password=" & DB_user_pass & ";Initial Catalog=" & DB_name &

";Data Source=" & DB_server_name

    pConn.Open sConnStr
    
    	Function DBStringCheck(strRequest,strCompare)
	    if instr(Lcase(strRequest),strCompare) > 0 then

response.Write("오류:입력되지 않아야 할 특수 문자[" &

strCompare &"] 입니다.<BR>관리자에게 문의 바랍니다.")

	    	response.end
	    end if
	End Function
	
	For Each item1 in Request.QueryString
		'//차단할 단어를 입력
		call DBStringCheck(Request.QueryString(item1),chr(39))
		call DBStringCheck(Request.QueryString(item1),"exec")
		call DBStringCheck(Request.QueryString(item1),"select")
		call DBStringCheck(Request.QueryString(item1),"xp_")
		call DBStringCheck(Request.QueryString(item1),"char")
		call DBStringCheck(Request.QueryString(item1),";")

	Next
	For Each item1 in Request.Form
		'//차단할 단어를 입력
		call DBStringCheck(Request.Form(item1),chr(39))
		call DBStringCheck(Request.Form(item1),"exec")
		call DBStringCheck(Request.Form(item1),"select")
		call DBStringCheck(Request.Form(item1),"xp_")
		call DBStringCheck(Request.Form(item1),"char")
          	call DBStringCheck(Request.Form(item1),";")

	Next	 
%>

꼭 바쁜 날 문제가 터지더라~
어쨌든 회사의 홈페이지에 DB를 조회하는 페이지들 스크립트 오류(?)를 내길래 확인해보니
<script src=http://s.ardoshanghai.com/s.js></script> 이런 짱깨의 필이 나는 주소가 잔뜩 들어있더라…...
그래서 구글에 검색해보니…. 헉 7720개….

http://www.google.co.kr/search?complete=1&hl=ko&newwindow=1&q=http%3A%2F%2Fs.ardoshanghai.com%2Fs.js&lr=&aq=f&oq=

(흑 홈페이지 내가 만든 것 아닌데 T.T)
그리하여 찾아보니 http://saybox.tistory.com/453 이렇게 좋은 글이 ^^

저 7720개의 사이트들도 빨리 고쳐져야 할텐데…..

<%

'//Writer: SkyLimit
'//Language: ASP

'파일 경로
TextFilePath = "c:\InetPub\test.ini"'//요부분만 수정하세요.

'//파일 시스템 개체 생성
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
 '//파일 존재 검사
 if fso.FileExists(TextFilePath) then

    '//파일 오픈
    Set f = fso.OpenTextFile(TextFilePath, 1,false,0) '(fname,mode 1:forReading,create,format 0:ASCII)
    Do Until f.AtEndOfLine '파일의 4096 라인까지 읽는다.
   buffer= buffer & f.read(4096)
       loop
    f.close
    Set f = Nothing

    '//문자열 비교
    strArray = Split(buffer,vbcr & vblf)
    For i = 0 To UBound(strArray) - 1
     if InStr(strArray(i),"AAA") > 0 Then
    response.write strArray(i)
     End If
    Next
 else
  '//파일 없음
  response.write TextFilePath & "이 지정된 경로에 없습니다."
 end If
 
Set FSO = Nothing
%>

'Web Tech > ASP.NET,ASP' 카테고리의 다른 글

IIS7 - HTTP 모듈과 HTTP 처리기 비교  (0) 2009.05.07
IIS7 - HTTP 모듈 이벤트 순서  (0) 2009.05.07
SQL Injection 처리 2  (2) 2008.11.13
SQL Injection 처리  (2) 2008.11.06

ASP Base64
<%
Option Explicit

Dim sBASE_64_CHARACTERS, sBASE_64_CHARACTERSansi
sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
sBASE_64_CHARACTERSansi = strUnicode2Ansi(sBASE_64_CHARACTERS)

Function strUnicodeLen(asContents)
 Dim asContents1 : asContents1 ="a" & asContents
 Dim Len1  : Len1=Len(asContents1)
 Dim K  : K=0
 Dim I, Asc1
 
 For I=1 To Len1
  Asc1 = asc(mid(asContents1,I,1))
  IF Asc1 < 0 Then Asc1 = 65536 + Asc1
  IF Asc1 > 255 Then
   K = K + 2
  ELSE
   K = K + 1
  End IF
 Next
 
 strUnicodeLen = K - 1
End Function

Function strUnicode2Ansi(asContents)
 Dim Len1   : Len1 = Len(asContents)
 Dim I, VarCHAR, VarASC, VarHEX, VarLOW, VarHIGH

 strUnicode2Ansi = ""
 
 For I = 1 to Len1
  VarCHAR = Mid(asContents,I,1)
  VarASC = Asc(VarCHAR)
  IF VarASC < 0 Then VarASC = VarASC + 65536
  IF VarASC > 255 Then
   VarHEX  = Hex(VarASC)
   VarLOW  = Left(VarHEX,2)
   VarHIGH  = Right(VarHEX,2)
   strUnicode2Ansi = strUnicode2Ansi & ChrB("&H" & VarLOW ) & ChrB("&H" & VarHIGH )
  Else
   strUnicode2Ansi = strUnicode2Ansi & ChrB(VarASC)
  End IF
 Next
End Function

 

Function strAnsi2Unicode(asContents)
 Dim Len1   : Len1  = LenB(asContents)
 Dim VarCHAR, VarASC, I

 strAnsi2Unicode = ""
 
 IF Len1=0 Then Exit Function
 
 For I=1 To Len1
  VarCHAR = MidB(asContents,I,1)
  VarASC = AscB(VarCHAR)
  IF VarASC > 127 Then
   strAnsi2Unicode = strAnsi2Unicode & Chr(AscW(MidB(asContents, I+1,1) & VarCHAR))
   I  = I + 1
  Else
   strAnsi2Unicode = strAnsi2Unicode & Chr(VarASC)
  End IF
 Next
 
End function

Function Base64encode(asContents)
 Dim lnPosition
 Dim lsResult
 Dim Char1
 Dim Char2
 Dim Char3
 Dim Char4
 Dim Byte1
 Dim Byte2
 Dim Byte3
 Dim SaveBits1
 Dim SaveBits2
 Dim lsGroupBinary
 Dim lsGroup64
 Dim M3, M4, Len1, Len2

 Len1   =LenB(asContents)
 
 IF Len1 < 1 Then
  Base64encode = ""
  Exit Function
 End IF

 M3=Len1 Mod 3
 
 IF M3 > 0 Then asContents = asContents & String(3 - M3, ChrB(0))

 IF m3 > 0 Then
  Len1 = Len1 + (3 - M3)
  Len2 = Len1 - 3
 Else
  Len2 = Len1
 End IF

 lsResult = ""

 For lnPosition = 1 To Len2 Step 3
  lsGroup64 = ""
  lsGroupBinary = MidB(asContents, lnPosition, 3)

  Byte1  = AscB(MidB(lsGroupBinary, 1, 1)) : SaveBits1 = Byte1 And 3
  Byte2  = AscB(MidB(lsGroupBinary, 2, 1)) : SaveBits2 = Byte2 And 15
  Byte3  = AscB(MidB(lsGroupBinary, 3, 1))

  Char1  = MidB(sBASE_64_CHARACTERSansi, ((Byte1 And 252) \ 4) + 1, 1)
  Char2  = MidB(sBASE_64_CHARACTERSansi, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
  Char3  = MidB(sBASE_64_CHARACTERSansi, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)
  Char4  = MidB(sBASE_64_CHARACTERSansi, (Byte3 And 63) + 1, 1)
  lsGroup64 = Char1 & Char2 & Char3 & Char4

  lsResult  = lsResult & lsGroup64
 Next

 IF M3 > 0 Then
  lsGroup64 = ""
  lsGroupBinary = MidB(asContents, Len2 + 1, 3)

  Byte1  = AscB(MidB(lsGroupBinary, 1, 1)) : SaveBits1 = Byte1 And 3
  Byte2  = AscB(MidB(lsGroupBinary, 2, 1)) : SaveBits2 = Byte2 And 15
  Byte3  = AscB(MidB(lsGroupBinary, 3, 1))

  Char1  = MidB(sBASE_64_CHARACTERSansi, ((Byte1 And 252) \ 4) + 1, 1)
  Char2  = MidB(sBASE_64_CHARACTERSansi, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
  Char3  = MidB(sBASE_64_CHARACTERSansi, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)

  IF M3=1 Then
   lsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61)
  Else
   lsGroup64 = Char1 & Char2 & Char3 & ChrB(61)
  End IF

  lsResult  = lsResult & lsGroup64
 End IF

 Base64encode = lsResult
End Function

Function Base64decode(asContents)
 Dim lsResult
 Dim lnPosition
 Dim lsGroup64, lsGroupBinary
 Dim Char1, Char2, Char3, Char4
 Dim Byte1, Byte2, Byte3
 Dim M4, Len1, Len2

 Len1 = LenB(asContents)
 M4 = Len1 Mod 4

 IF Len1 < 1 Or M4 > 0 Then
  Base64decode = ""
  Exit Function
 End IF

 IF MidB(asContents, Len1, 1) = ChrB(61) Then M4 = 3
 IF MidB(asContents, Len1-1, 1) = ChrB(61) Then M4 = 2

 IF M4 = 0 Then
  Len2 = Len1
 Else
  Len2 = Len1 - 4
 End IF

 For lnPosition = 1 To Len2 Step 4
  lsGroupBinary = ""
  lsGroup64 = MidB(asContents, lnPosition, 4)

  Char1  = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 1, 1)) - 1
  Char2  = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 2, 1)) - 1
  Char3  = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 3, 1)) - 1
  Char4  = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 4, 1)) - 1

  Byte1  = ChrB(((Char2 And 48) \ 16) Or (Char1 * 4) And &HFF)
  Byte2  = lsGroupBinary & ChrB(((Char3 And 60) \ 4) Or (Char2 * 16) And &HFF)
  Byte3  = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))
  lsGroupBinary = Byte1 & Byte2 & Byte3

  lsResult  = lsResult & lsGroupBinary
 Next

 IF M4 > 0 Then
  lsGroupBinary = ""
  lsGroup64 = MidB(asContents, Len2 + 1, M4) & ChrB(65)
  IF M4=2 Then
   lsGroup64 = lsGroup64 & chrB(65)
  End IF
  Char1 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 1, 1)) - 1
  Char2 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 2, 1)) - 1
  Char3 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 3, 1)) - 1
  Char4 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 4, 1)) - 1

  Byte1 = ChrB(((Char2 And 48) \ 16) Or (Char1 * 4) And &HFF)
  Byte2 = lsGroupBinary & ChrB(((Char3 And 60) \ 4) Or (Char2 * 16) And &HFF)
  Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))

  IF M4=2 Then
   lsGroupBinary = Byte1
  elseIF M4=3 Then
   lsGroupBinary = Byte1 & Byte2
  end IF

  lsResult   = lsResult & lsGroupBinary
 End IF

 Base64decode   = lsResult
End Function

 


Dim ORIGNvalue : ORIGNvalue = "mTVisman123456"
Dim EncodeA : EncodeA = StrReverse(strAnsi2Unicode(Base64encode(strUnicode2Ansi(ORIGNvalue))))
Dim DecodeA : DecodeA = strAnsi2Unicode(Base64decode(strUnicode2Ansi(StrReverse(EncodeA))))

response.write "[" & DecodeA & "] was encoded to [" & EncodeA & "]<BR>"
response.write "[" & EncodeA & "] was decoded to [" & DecodeA & "]<BR>"
%>



PHP Base64
<?
$Str = 'mTVisman123456';
$Test = base64_encode($Str);
$TestD = base64_decode($Test);
printf($Test.$TestD);
?>


JSP Base64
<%@ page import="java.net.*, java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.lang.*" %>
<%@ page import="java.lang.String" %>
<%@ page import="java.security.*" %>
<%@ page import="sun.misc.BASE64Encoder" %>
<%@ page import="sun.misc.BASE64Decoder" %>
<%
        BASE64Encoder encoder = new BASE64Encoder();
        BASE64Decoder decoder = new BASE64Decoder();

        String StrOUT, Reversing;
        byte[] b1, CookieString;


 
  String Test = "
=YTN0@j@x4WYtN*aWRVb";

  Reversing = new StringBuffer(Test).toString();
        CookieString = decoder.decodeBuffer(Reversing);

        StrOUT = new String(CookieString, "ISO-8859-1");

  out.println("[" + StrOUT + "] was decoded to [" + Test + "]<br>");
        out.println("[" + Test + "] was decoded to [" + StrOUT + "]");
%>


출저:http://cafe.naver.com/webexploit/3