이 문서의 예에서는 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()는 사용자 정의된 실행 방식을 사용합니다.个错误处理函数,然后设置错误级别。
关于의 용도:
复제대码
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 프로그래밍 설계에 도움이 되기를 바랍니다.