>백엔드 개발 >PHP 튜토리얼 >php_php 기술의 일반적인 SQL 공격 정규식 요약

php_php 기술의 일반적인 SQL 공격 정규식 요약

WBOY
WBOY원래의
2016-05-16 20:32:34932검색

이 문서의 예에서는 PHP의 일반적인 SQL 공격 정규 표현식을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

우리 모두는 MYSQL 5에서 information_schema 라이브러리가 모든 라이브러리 이름, 표시 및 필드 이름 정보를 저장한다는 것을 이미 알고 있습니다. 따라서 공격 방법은 다음과 같습니다.

1. 첫 번째 테이블 이름의 첫 번째 문자가 a-z의 문자인지 확인합니다. 여기서 blind_sqli는 알려진 라이브러리 이름으로 가정됩니다.
참고: 정규 표현식의 ^[a-z]는 문자열의 시작 문자가 a-z

범위에 있음을 의미합니다.

코드 복사 코드는 다음과 같습니다.
index.php?id=1 및 1=(SELECT 1 FROM information_schema .tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-z]' LIMIT 0,1) /*

2. 첫 번째 문자가 a-n에 속하는 문자인지 확인합니다

코드 복사 코드는 다음과 같습니다.
index.php?id=1 및 1=(SELECT 1 FROM information_schema .tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-n]' LIMIT 0,1)/*

3. 캐릭터가 n인지 확인하세요

코드 복사 코드는 다음과 같습니다.
index.php?id=1 및 1=(SELECT 1 FROM information_schema .tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^n' LIMIT 0,1) /*

4. 표현은 다음과 같이 대체됩니다

코드 복사 코드는 다음과 같습니다.
'^n[a-z]' - > ' ^ne[a-z]' -> '^news[a-z]' -> 이때, 테이블 이름이 news인지 확인하기 위해 정규식은 '^news$'로 되어 있지만, 그냥 table_name = 'news'라고 판단할 필요는 없습니다.

5. 다음으로, 다음 테이블에 대해 블라인드 주입을 수행하려면 한계 1,1 -> 한계 2,1만 수정하면 됩니다.

예:


코드 복사 코드는 다음과 같습니다.$Exec_Commond = "( s|S)*(exec(s| ) (s |x)pw )(s|S)*";
$Simple_XSS = "( s|S)*((
)|>)(s|S)*";
$Eval_XSS = "( s|S)*((e)|e)(s)*((v)|v)(s)*((a)|a)(s)*((l)|l) (s|S)*"; $Script_XSS = "( s|S)*((s)|s)(s)*((c)|c)(s)*((r)|r)(s)*((i)|i) (들)*((p)|p)(들)*((t)|t)(s|S)*";     주사위();
}
set_error_handler("customError",E_ERROR);
$getfilter="'|(및|또는)b. ?(>|<|=|in|like)|/*. ?*/| $postfilter="b(및|또는)b.{1,6}?(=|>|<|binb|blikeb)|/*. ?*/| $cookiefilter="b(및|또는)b.{1,6}?(=|>|<|binb|blikeb)|/*. ?*/| 함수 StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq)
{   
    if(is_array($StrFiltValue))
    {
        $StrFiltValue=내파($StrFiltValue);
    }
    if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1&&!isset($_REQUEST['securityToken']))
    {
        slog("

작업 IP: ".$_SERVER["REMOTE_ADDR"]."
작업 작업: ".strftime("%Y-%m-%d %H:%M :%S")."
작업 작업면:".$_SERVER["PHP_SELF"]."
방법: ".$_SERVER["REQUEST_METHOD"]."
提交参数: ".$StrFiltKey."
提交数据: ".$StrFiltValue);
        "결과 알림:잘못된 작업입니다!"를 인쇄합니다.
        출구();
    }
}
foreach($_GET as $key=>$value)
{
    StopAttack($key,$value,$getfilter);
}
foreach($_POST, $key=>$value)
{
    StopAttack($key,$value,$postfilter);
}
foreach($_COOKIE($key=>$value)
{
    StopAttack($key,$value,$cookiefilter);
}
  
함수 slog($logs)
{
    $toppath="log.htm";
    $Ts=fopen($toppath,"a ");
    fputs($Ts,$logs."rn");
    fclose($Ts);
}
?>

sql分析: set_error_handler()는 사용자 정의된 실행 방식을 사용합니다.个错误处理函数,然后设置错误级别。    关于의 용도:



复제대码

代码如下:customError($errno, $errstr, $errfile, $errline) {   echo "错误代码: [${errno}] ${errstr}rn";
  echo " 错误所在的代码行: {$errline} 文件{$errfile}rn";
   echo " PHP版本 ",PHP_VERSION, "(" , PHP_OS, ")rn";
  // 죽는다();
}
set_error_handler("customError",E_ALL| E_STRICT);

요약

PHP는 오류가 발생하면 오류 스크립트의 위치, 줄 번호 및 이유를 제공합니다. 많은 사람들은 이것이 큰 문제가 아니라고 말합니다. 그러나 실제 경로 유출로 인한 결과는 상상할 수 없는 경우도 있습니다. 실제로 많은 서버에서 이러한 문제가 발생합니다. 일부 네트워크 관리자는 단순히 PHP 구성 파일의 display_errors를 Off로 설정하여 문제를 해결하는 경우도 있지만 이 방법은 너무 부정적이라고 생각합니다. 때로는 디버깅을 위해 오류 정보를 반환하기 위해 PHP가 정말로 필요할 때가 있습니다. 그리고 문제가 발생하면 사용자에게 설명을 제공하거나 다른 페이지로 이동해야 할 수도 있습니다. 그러나 set_error_handler()를 사용하면 이러한 모순을 해결할 수 있습니다. 하지만 이 기능은 거의 사용되지 않는 것으로 나타났습니다.

이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.