SQL 주입 문제: 개념 적 원인 과 방어

1. SQL 주입 의 개념
 
 
        SQL 주입 * * * 은 특수 한 입력 을 구축 하여 매개 변수 로 웹 응용 프로그램 에 전송 하 는 것 을 말 합 니 다. 이런 입력 은 대부분 SQL 문법 중의 일부 조합 (우리 가 하 는 유 료 시스템 에서 사용 하 는 맞 춤 형 문장) 입 니 다. SQL 문 구 를 실행 하여 * * * 자 에 게 필요 한 조작 을 수행 합 니 다. 그 주요 원인 은 프로그램 이 사용자 가 입력 한 데 이 터 를 세밀 하 게 걸 러 내지 않 았 기 때 문 입 니 다.불법 데이터 가 시스템 에 침입 하 게 하 다.
 
 
2. SQL 은 두 가지 방식 으로 주입 합 니 다.
 
 
        플랫폼 층 주입 과 코드 층 주입, 전 자 는 안전 하지 않 은 데이터 베이스 설정 이나 데이터 베이스 플랫폼 의 구멍 으로 인해 발생 합 니 다.후 자 는 주로 프로그래머 가 입력 을 세밀 하 게 걸 러 내지 않 아 불법 데이터 조 회 를 실시 했다.이 를 바탕 으로 SQL 주입 의 발생 원인 은 다음 과 같은 몇 가지 측면 에 나타난다. ① 부당 한 유형 처리;② 안전 하지 않 은 데이터베이스 설정;③ 불합리한 조회 집합 처리;④ 부당 한 오류 처리;⑤ 전의 문자 처리 가 적합 하지 않 음;⑥ 여러 개의 제출 처리 가 부적 절하 다.
지금 코드 층 주입 을 보 여 드 리 겠 습 니 다.
 
        
 txtsql = "select * from user_info where userid='" & TxtUserName.Text & "' and pwd='" & TxtPassword.Text & "'"  
         Set mrc = ExecuteSQL(txtsql, msgtext)  
           
         If mrc.EOF = False Then  
            MsgBox "   sql  "  
         End If  
         OK = True  
         mrc.Close  
         Unload Me  
  

         txtsql = "select * from user_info where userid='" & TxtUserName.Text & "' and pwd='" & TxtPassword.Text & "'"
         Set mrc = ExecuteSQL(txtsql, msgtext)
         
         If mrc.EOF = False Then
            MsgBox "   sql  "
         End If
         OK = True
         mrc.Close
         Unload Me

 
 
 
         여러분, 이 코드 를 보 세 요. 사실은 아주 간단 합 니 다. 바로 제 가 계 정과 비밀번호 가 없 을 때 이 코드 로 데이터 베 이 스 를 엽 니 다. 그러면 'sql 에 주입 되 었 습 니 다' 라 고 팝 업 하면 제 가 코드 층 을 통 해 주입 한 것 을 의미 합 니 다.
 
 제 아 이 디 가 1 'or' 1 '=' 1 비밀번호 도 한눈 에 알 수 있 습 니 다. 결 과 는:
그러면 데이터 베 이 스 는 위험 합 니 다. 이 사용자 이름과 비밀 번 호 는 존재 하지 않 기 때 문 입 니 다.
         그럼 간단 한 백 스테이지 인증 이 구멍 을 뚫 은 것 이다.
         검증 이 빈틈 을 돌아 가 는 것 은 'or' = 'or' 백 엔 드 가 빈틈 을 돌아 가 는 것 이다. AND 와 OR 의 연산 규칙 을 이용 하여 백 엔 드 스 크 립 트 의 논리 적 오 류 를 초래한다.
 
         배경 검색 어 는 sql = 'select admin from userinfo where userid = '& txtuser. text &' & 'and pwd =' & '&' & '&' txtpassword. text & '', 그럼 나 는 1 'or' 1 '=' 1 (여기 1 은 다른 숫자) 로 사용자 이름 비밀 번 호 를 만 들 면 검색 은: select admin from userinfo where userid='1'or '1'='1' and pwd='1'or '1'='1'
         이렇게 되면 연산 규칙 에 따라 여기 모두 4 개의 조회 문구 가 있 습 니 다. 그러면 조회 결 과 는 가짜 or 진실 and 가짜 or 진실 입 니 다. 먼저 and 를 계산 하고 or 를 계산 합 니 다. 최종 결 과 는 진실 입 니 다. 그러면 백 스테이지 에 들 어 갈 수 있 습 니 다.
 
         이런 구멍 은 반드시 두 개의 치 명 적 인 조건 이 있어 야 한다.
 
         우 리 는 여기에서 착수 하여 방 호 를 진행 할 수 있다.
3. 방어 방법:
첫 번 째: 이 조 회 는 계 정과 비밀 번 호 는 sql 구문 에서 분리 되면 주입 되 지 않 습 니 다.
           sql="select * from admin where username='"&username&'&"passwd='"&passwd&'
           계 정 비밀 번 호 를 따로 조회 하면 계 정 번 호 를 먼저 찾 고 비밀 번 호 를 찾 으 면 어 쩔 수 없다.
 
           내 가 해결 한 코드 는 다음 과 같다.
        txtsql = "select * from user_Info where userid= '" & TxtUserName.Text & "'"  
        Set mrc = ExecuteSQL(txtsql, msgtext)  
           
  
        If mrc.EOF Then  
            MsgBox "      ,        !", vbOKOnly + vbExclamation, "  "  
            TxtUserName.SetFocus  
        Else  
            If Trim(mrc.Fields(1)) = Trim(TxtPassword.Text) Then  
                OK = True  
                mrc.Close  
                Me.Hide  
                UserName = Trim(TxtUserName.Text)  
  
            Else  
                MsgBox "    ,     !", vbOKOnly + vbExclamation, "  "  
                TxtPassword.SetFocus  
                TxtPassword.Text = ""  
            End If  
  

        txtsql = "select * from user_Info where userid= '" & TxtUserName.Text & "'"
        Set mrc = ExecuteSQL(txtsql, msgtext)
         

        If mrc.EOF Then
            MsgBox "      ,        !", vbOKOnly + vbExclamation, "  "
            TxtUserName.SetFocus
        Else
            If Trim(mrc.Fields(1)) = Trim(TxtPassword.Text) Then
                OK = True
                mrc.Close
                Me.Hide
                UserName = Trim(TxtUserName.Text)

            Else
                MsgBox "    ,     !", vbOKOnly + vbExclamation, "  "
                TxtPassword.SetFocus
                TxtPassword.Text = ""
            End If

 
 
 
두 번 째 방법: 만약 에 암호 화 되 었 다 면 MD5 에 의 해 암호 화 되 거나 다른 암호 화 방식 으로 암호 화 되면 비밀 번 호 는 완전 하지 않 을 것 이다. 그러면 이런 오 류 는 존재 하지 않 을 것 이다.
             사용자 가 제공 하 는 필드 가 강 한 유형 이 아니 거나 유형 강 제 를 실시 하지 않 으 면 이러한 형식의 * * * 가 발생 합 니 다.SQL 구문 에 숫자 필드 를 사용 할 때 프로그래머 가 사용자 입력 의 합 법성 (숫자 형 인지) 을 검사 하지 않 으 면 이러한 * * * 가 발생 합 니 다.예 를 들 면:
  statement := "SELECT * FROM user_info WHERE userid = " & id_text & ";"
        이 문구 에서 볼 수 있 듯 이 idtext 는 "userid" 필드 와 관련 된 숫자 입 니 다.그러나 터미널 사용자 가 문자열 을 선택 하면 전의 문자 에 대한 수 요 를 돌아 갑 니 다.예 를 들 어 idtext 설정: 1;DROP TABLE users 는 "users" 표를 데이터베이스 에서 삭제 하고 SQL 문 구 는 SELECT * FROM User 로 변 합 니 다.Info WHERE UserID= 1;DROP TABLE users;좋 습 니 다. 그러면 데이터 베 이 스 는 복구 할 수 없 는 삭 제 를 받 게 될 것 입 니 다.
 
세 번 째 방법: 그러면 우 리 는 인삼 을 전달 하 는 방법 을 통 해 이 sql 주입 을 해결 할 수 있 습 니 다.
             주석 방지 코드 를 직접 작성 하면 보통 함 수 를 정의 한 다음 에 필터 할 키 워드 를 기록 합 니 다. 예 를 들 어 select;“”;from;등, 이러한 키 워드 는 모두 검색 어 에서 가장 자주 사용 하 는 단어 로 일단 여과 되면 사용자 가 제출 한 데 이 터 를 구성 하여 데이터 베이스 작업 에 완전 하 게 참여 하지 않 을 것 이다.
 
 
 
Function SafeRequest(ParaName,ParaType)  
'---      ---   
'ParaName:    -      
'ParaType:    -   (1         ,0         )   
Dim ParaValue  
ParaValue=Request(ParaName)  
If ParaType=1 then  
If not isNumeric(ParaValue) then  
Response.write "  " & ParaName & "      !"  
Response.end  
End if  
Else  
ParaValue=replace(ParaValue,"'","''")  
End if  
SafeRequest=ParaValue  
End function  

Function SafeRequest(ParaName,ParaType)
'---      ---
'ParaName:    -   
'ParaType:    -   (1         ,0         )
Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write "  " & ParaName & "      !"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function

 
   
 
               물론 sql 주입 방법 은 매우 많 습 니 다. 제 가 쓴 것 은 모두 아주 적은 일부분 일 뿐 입 니 다. 여러분 들 이 의견 을 주 셔 서 저희 데이터 베 이 스 를 보호 하 는 것 이 시 급 합 니 다.
 
(PS: 원문:http://hackdig.sinaapp.com/wap/?id=6191)

좋은 웹페이지 즐겨찾기