<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    PHP弱類型總結

    一顆小胡椒2021-12-25 06:32:02

    1. 什么是弱類型

    強類型語言是一種強制類型定義的語言,即一旦某一個變量被定義類型,如果不經強制轉換,那么它永遠就是該數據類型。代表有Java、.net、Python、C++等語言。

    弱類型語言是一種弱類型定義的語言,某一個變量被定義類型,該變量可以根據環境變化自動進行轉換,不需要經過現行強制轉換。代表有VB,PHP,JavaScript等語言。

    簡單舉一個例子:

    1  </p><p style="margin: 0px 0px 10px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;white-space: normal;">2   var A<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"></p><p style="margin: 0px 0px 10px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;white-space: normal;">3  var B<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"></p><p style="margin: 0px 0px 10px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;white-space: normal;">4  A=5<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"></p><p style="margin: 0px 0px 10px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;white-space: normal;">5  B="5"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"></p><p style="margin: 0px 0px 10px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;white-space: normal;">6  sumA=A+B<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"></p><p style="margin: 0px 0px 10px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;white-space: normal;">7  sumB=A-B<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"></p><p style="margin: 0px 0px 10px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;white-space: normal;">
    

    sumA=55,系統默認+字符連接符,將A轉化為字符串類型;而sumB=0;系統認為-是算數運算符,從而將B轉化為int類型,所以sum為5-5=0;

    2. PHP中“==”與“===”

    php當中有兩種比較符號==與===。

    1  
    2   $a==$b;
    3   $a===$b;
    4   ?>
    

    在進行===符號比較時,會先判斷兩種字符串類型是否相同,再比較值是否相同。

    在進行==符號比較時,會將字符串類型轉換成相同,再比較值是否相同。

    1  
    2  var_dump("admin"==0);//true
    3   var_dump("1admin"==1);//true
    4  var_dump("admin1"==1)//true
    5  var_dump("admin1"==0)//true
    6  var_dump("0e123456"=="0e456789");//true
    7  ?>
    

    在進行"admin"==0 比較的時候,會將admin轉化成數值,強制轉化,由于admin是字符串,轉化的結果是0自然和0相等。

    當一個字符串被當作數值來取值,其結果和類型如下:如果該字符串沒有包含'.','e','E'并且其數值在整型的范圍之內該字符串被當作int來取值,其他所有情況都被作為float來取值,該字符串的開始部分決定了它的值,如果該字符串以合法的數值開始,則使用該數值,否則其值為0。因此"1admin"==1的結果為true,"admin1"==1的結果為false。

    在進行"0e123456"=="0e456789"相互比較的時候,會將0e這類字符串識別為科學技術法的數字,0的無論多少次方都是零,所以相等。

    3. md5繞過(hash比較缺陷)

    以BugKu中的前女友題為例:

    1  
    2  if(isset($_GET['v1']&&isset($_GET['v2'])&&isset($_GET['v3'])){
    3  $v1=$_GET['v1'];
    4   $v2=$_GET['v2'];
    5   $v3=$_GET['v3'];
    6  if($v1!=$v2&&md5($v1)==md5($v2)){
    7     if(!strcmp($v3,$flag)){
    8       echo $flag;
    9      }
    10  }
    11 }
    12  ?>
    

    這道題的關鍵是第6行,$v1弱不等于$v2并且$v1的md5值弱等于$v2的md5值

    這里構造的思路也很簡單,就是想辦法使得md5($v1)與md5($v2)的值是以0e開頭的字符串,在進行==符號比較的時候,PHP會0e這類字符串識別為科學技術法的數字,0的無論多少次方都是零,因此可以達到md5繞過的效果。

    常見的字符串的md5值以0e開頭的有QNKCDZO、s878926199a、s155964671a、s214587387a、s214587387a。

    那么這題的WriteUp也就出來了

    http://114.67.246.176:11589/?v1=QNKCDZO&v2=s878926199a&v3[]=1

    4. switch繞過

    以BugKu中的前女友題為例:

    1  
    2  $a="3ctf";
    3  switch($a){
    4      case 1;
    5         echo"fail1";
    6         break;
    7      case 2; 
    8        echo"fail2";
    9        break;
    10    case 3; 
    11        echo'flag{xxxxxx}';//結果輸出success;
    12       break;
    13    case 4; 
    14       echo"fail4";
    15       break;
    16    default;
    17       echo"failall";
    18       break;
    19   }
    20  ?>
    

    同樣是弱類型的利用,當在switch中進行判斷時,將$a強制轉換成整型,也就是3,正好與case 3匹配上了,輸出flag{xxxxx}。

    5. Json繞過

    if (isset($_POST['message'])) {
      $message = json_decode($_POST['message']);
      $key = "*********";
      if ($message->key == $key) {
        echo "flag";
     } else {
        echo "fail";
     }
    } else {
      echo "~~~~";
    }
    ?>
    

    輸入一個json字符串,通過json_decode()函數將其轉換為數組,再判斷數組當中key對應的值是否弱等于$key,如果相等,則輸出flag的值。這里$key我們不知道,但是程序使用了==,我們就可以使用0="admin"這種形式進行繞過,因此最終的payload:message={"key":0}

    6. strcmp函數繞過

    strcmp(str1,str2)函數的作用是比較字符串。

    如果 str1 小于 str2 返回 < 0;如果 str1 大于 str2 返回 > 0;如果兩者相等,返回 0。

    1  
    2      $password="***************"
    3       if(isset($_POST['password'])){
    4          if(strcmp($_POST['password'],$password)==0){
    5           echo"Right!!!login succsess";n
    6           exit();
    7         }else{
    8           echo"Wrong password..";
    9        }
    10    ?>
    

    這里程序的邏輯是,通過strcmp()函數比較POST方法傳遞的password的值與$password,如果strcmp()函數的返回值弱等于0,那么登錄成功。

    這里構造的思路是false==0,當strcmp()函數當中的str1與str2不為字符串時,strcmp()函數的返回值為布爾類型的false,那么false==0的結果是true,就可以達到繞過的效果,因此這里的payload:password[]=xxx(任意)。

    7. “array_search"與is_array"繞過

    is_array()函數會判斷傳入的數組是否是一個數組。如果是,返回true,反之false。

    array_search()函數會在數組中搜索某個鍵值,并返回對應的鍵名。如果找到返回鍵名,反之false。這邊要注意的是array_search()函數搜索鍵值的時候是使用==進行比較。

    1   
    2   if(!is_array($_GET['test'])){
    3    exit();
    4   }
    5   $test=$_GET['test'];
    6   for($i=0;$i
    7      if($test[$i]==="admin"){
    8       echo"error";
    9       exit();
    10     }
    11      $test[$i]=intval($test[$i]);
    12    }
    13   if(array_saerch("admin",$test)===o){
    14    echo"flag";
    15   }else{
    16     echo"false";
    17   }
    18   ?>
    

    這里程序的邏輯是,首先判斷GET方法傳遞的test是否為數組,然后通過for循環遍歷數組當中每個值并判斷是否強等于字符串admin,并且將值轉換為整型。最后使用array_search函數在$test數組搜尋是否有鍵值弱等于字符串admin,如果有的話返回其鍵名,最后判斷鍵名強等于0才輸出flag。

    因此構造思路是"admin"==0,也就是說傳遞的數組第一個鍵值必須是0(無論字符串還是整型,因為存在intval函數強制轉換),那么payload:test[]=0就可以繞過。

    8. 總結

    PHP是最好的語言,而且使用很方便,但是特性是弱類型,以及內置函數對于傳入參數的松散處理會導致存在許多安全問題,所以要特別注意。

    paddingmargin
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    實戰繞過阿里云WAF
    2022-04-25 09:17:37
    原創文章滲透實現滲透技術原創聲明:轉載本文請標注出處和作者,望尊重作者勞動成果!感謝!前言:下面的漏洞挖掘案
    PHP弱類型總結
    2021-12-25 06:32:02
    轉自:中爾安全實驗室1.?代表有Java、.net、Python、C++等語言。弱類型語言是一種弱類型定義的語言,某一個變量被定義類型,該變量可以根據環境變化自動進行轉換,不需要經過現行強制轉換。
    lnk釣魚主要將圖標偽裝成正常圖標,但是目標會執行shell命令。然后新建快捷方式,將上述語句填入下一步,然后自己命名一下,點擊完成。
    1、文檔連接釣魚 1)LINK鏈接釣魚 2)LINK快捷方式釣魚 3)CHM文檔釣魚 CHM文檔bypass waf 4)HTA釣魚 5)宏釣魚 宏釣魚 bypass waf 6)OLE(Object Linking and Embedding,對象鏈接與嵌入) 7)嵌入JS元素 8)利用模板文件注入宏指令 9)CVE 2、偽造界面釣魚 1)PPT動
    釣魚演練需求背景目前肉眼可見的甲方兩大安全工作KPI,一類是政策合規數據合規,第二類是應對各種大型攻防演練檢測。所以可以用“SiteCopy” 我們在本地部署一臺VPS上,在“Pricking” hook登錄的賬密。跳轉的trick合理的提示+跳轉,Pricking是nginx代理原理,所以他會記錄我們的實際流量中的請求數據,我們為了偽造的閉環,在用戶點擊提交以后,也就是POST
    演練前準備工作?
    同時購買這兩種食品的消費者將會在墨西哥食品和亞洲食品集群之間形成一種嵌入。商店和客戶的行為定期訓練這類嵌入,以便在推薦和其他個性化應用程序中使用。
    0x01 苦逼的測試任務 某一天,我照常在學校的CTF群和學長吹水,突然管事的學長在群里發了一張圖,這個月輪到我們學校對省內的某旅游相關企業進行漏洞測試。上面的老師自然而然把這個任務分配給我們CTF戰隊,要求是找到漏洞,能Getshell的點證明能Getshell即可,不要深入利用。
    CDN繞過技術總匯
    2022-05-06 15:41:45
    在HVV培訓以及面試中,有人問了CDN該如何繞過找到目標真實IP,這向來是個老生常談的問題,而且網上大多都有,但是有些不夠全面,今天把繞過CDN全理一理。
    繞過 XSS 檢測機制
    2022-05-05 07:30:30
    跨站點腳本 (XSS) 是最常見的 Web 應用程序漏洞之一。它可以通過清理用戶輸入、基于上下文轉義輸出、正確使用文檔對象模型 (DOM) 接收器和源、執行正確的跨源資源共享 (CORS) 策略和其他安全實踐來完全防止。盡管這些預防性技術是公共知識,但 Web 應用程序防火墻 (WAF) 或自定義過濾器被廣泛用于添加另一層安全性,以保護 Web 應用程序免受人為錯誤或新發現的攻擊向量引入的缺陷
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类