溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

php中常見(jiàn)的sql攻擊正則表達(dá)式有哪些

發(fā)布時(shí)間:2021-06-29 11:48:04 來(lái)源:億速云 閱讀:121 作者:chen 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“php中常見(jiàn)的sql攻擊正則表達(dá)式有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“php中常見(jiàn)的sql攻擊正則表達(dá)式有哪些”吧!

本文實(shí)例講述了php中常見(jiàn)的sql攻擊正則表達(dá)式。分享給大家供大家參考。具體分析如下:

我們都已經(jīng)知道,在MYSQL 5+中 information_schema庫(kù)中存儲(chǔ)了所有的 庫(kù)名,表明以及字段名信息。故攻擊方式如下:

1. 判斷第一個(gè)表名的第一個(gè)字符是否是a-z中的字符,其中blind_sqli是假設(shè)已知的庫(kù)名。
注:正則表達(dá)式中 ^[a-z] 表示字符串中開(kāi)始字符是在 a-z范圍內(nèi)

復(fù)制代碼 代碼如下:

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-z]' LIMIT 0,1) /*

2. 判斷第一個(gè)字符是否是a-n中的字符

復(fù)制代碼 代碼如下:

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables  WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-n]' LIMIT 0,1)/*

3. 確定該字符為n

復(fù)制代碼 代碼如下:

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables  WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^n' LIMIT 0,1) /*

4. 表達(dá)式的更換如下

復(fù)制代碼 代碼如下:

expression like this:  '^n[a-z]' -> '^ne[a-z]' -> '^new[a-z]' -> '^news[a-z]' -> FALSE


這時(shí)說(shuō)明表名為news ,要驗(yàn)證是否是該表明 正則表達(dá)式為'^news$',但是沒(méi)這必要 直接判斷 table_name = 'news‘ 不就行了。

5.接下來(lái)猜解其它表了 只需要修改 limit 1,1 -> limit 2,1就可以對(duì)接下來(lái)的表進(jìn)行盲注了。

例如:

復(fù)制代碼 代碼如下:

$Exec_Commond  = "( \s|\S)*(exec(\s|\+)+(s|x)p\w+)(\s|\S)*";
$Simple_XSS = "( \s|\S)*((%3C)|<)((%2F)|/)*[a-z0-9%]+((%3E)|>)(\s|\S)*";
$Eval_XSS  = "( \s|\S)*((%65)|e)(\s)*((%76)|v)(\s)*((%61)|a)(\s)*((%6C)|l)(\s|\S)*";
$Image_XSS  = "( \s|\S)*((%3C)|<)((%69)|i|I|(%49))((%6D)|m|M|(%4D))((%67)|g|G|(%47))[^\n]+((%3E)|>)(\s|\S)*" ;
$Script_XSS = "( \s|\S)*((%73)|s)(\s)*((%63)|c)(\s)*((%72)|r)(\s)*((%69)|i)(\s)*((%70)|p)(\s)*((%74)|t)(\s|\S)*";
$SQL_Injection = "( \s|\S)*((%27)|(')|(%3D)|(=)|(/)|(%2F)|(")|((%22)|(-|%2D){2})|(%23)|(%3B)|(;))+(\s|\S)*";

sql攻擊代碼:

復(fù)制代碼 代碼如下:

<?php
function customError($errno, $errstr, $errfile, $errline)
{
    echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />";
    die();
}
set_error_handler("customError",E_ERROR);
$getfilter="'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
$postfilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
$cookiefilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq)
{   
    if(is_array($StrFiltValue))
    {
        $StrFiltValue=implode($StrFiltValue);
    }
    if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1&&!isset($_REQUEST['securityToken']))
    {
        slog("<br><br>操作IP: ".$_SERVER["REMOTE_ADDR"]."<br>操作時(shí)間: ".strftime("%Y-%m-%d %H:%M:%S")."<br>操作頁(yè)面:".$_SERVER["PHP_SELF"]."<br>提交方式: ".$_SERVER["REQUEST_METHOD"]."<br>提交參數(shù): ".$StrFiltKey."<br>提交數(shù)據(jù): ".$StrFiltValue);
        print "result notice:Illegal operation!";
        exit();
    }
}
foreach($_GET as $key=>$value)
{
    StopAttack($key,$value,$getfilter);
}
foreach($_POST as $key=>$value)
{
    StopAttack($key,$value,$postfilter);
}
foreach($_COOKIE as $key=>$value)
{
    StopAttack($key,$value,$cookiefilter);
}
  
function slog($logs)
{
    $toppath="log.htm";
    $Ts=fopen($toppath,"a+");
    fputs($Ts,$logs."rn");
    fclose($Ts);
}
?>


sql分析:

如果使用這個(gè)函數(shù)的話,這個(gè)函數(shù)會(huì)繞開(kāi)PHP的標(biāo)準(zhǔn)出錯(cuò)處理,所以說(shuō)得自己定義報(bào)錯(cuò)處理程序(die())。
其次,如果代碼執(zhí)行前就發(fā)生了錯(cuò)誤,那個(gè)時(shí)候用戶(hù)自定義的程序還沒(méi)有執(zhí)行,所以就不會(huì)用到用戶(hù)自己寫(xiě)的報(bào)錯(cuò)處理程序?!?/p>

那么,PHP里有一套錯(cuò)誤處理機(jī)制,可以使用set_error_handler()接管PHP錯(cuò)誤處理,也可以使用trigger_error()函數(shù)主動(dòng)拋出一個(gè)錯(cuò)誤。

set_error_handler()函數(shù)設(shè)置用戶(hù)自定義的錯(cuò)誤處理函數(shù)。函數(shù)用于創(chuàng)建運(yùn)行期間的用戶(hù)自己的錯(cuò)誤處理方法。它需要先創(chuàng)建一個(gè)錯(cuò)誤處理函數(shù),然后設(shè)置錯(cuò)誤級(jí)別?!  ?br/>關(guān)于的用法:

復(fù)制代碼 代碼如下:

function customError($errno, $errstr, $errfile, $errline)
{
  echo "<b>錯(cuò)誤代碼:</b> [${errno}] ${errstr}\r\n";
  echo " 錯(cuò)誤所在的代碼行: {$errline} 文件{$errfile}\r\n";
   echo " PHP版本 ",PHP_VERSION, "(" , PHP_OS, ")\r\n";
  // die();
}
set_error_handler("customError",E_ALL| E_STRICT);

總結(jié)

PHP遇到錯(cuò)誤時(shí),就會(huì)給出出錯(cuò)腳本的位置、行數(shù)和原因,有很多人說(shuō),這并沒(méi)有什么大不了。但泄露了實(shí)際路徑的后果是不堪設(shè)想的,對(duì)于某些入侵者,這個(gè)信息可是非常重要,而事實(shí)上現(xiàn)在有很多的服務(wù)器都存在這個(gè)問(wèn)題。 有些網(wǎng)管干脆把PHP配置文件中的 display_errors 設(shè)置為 Off 來(lái)解決,但本人認(rèn)為這個(gè)方法過(guò)于消極。有些時(shí)候,我們的確需要PHP返回錯(cuò)誤的信息以便調(diào)試。而且在出錯(cuò)時(shí)也可能需要給用戶(hù)一個(gè)交待,甚至導(dǎo)航到另一頁(yè)面。但是有了set_error_handler()之后,這些矛盾也都可以解決掉了。但是發(fā)現(xiàn)很少用這個(gè)函數(shù)。

到此,相信大家對(duì)“php中常見(jiàn)的sql攻擊正則表達(dá)式有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI