CTF中遇到的php

來源:互聯網
上載者:User

標籤:重複   val   die   index.php   source   url   情況   檔案中   有一個   

1.if(eregi("hackerDJ",$_GET[id])) {   //eregi字串對比

  echo("<p>not allowed!</p>");

  exit();

 

2.isset 判斷變數是否定義過

 

3.比較符

$a==$b   鬆散比較

===      完全等於

=        大於等於

!=       如果類型轉換後$a不等於$b,Ture

!==      不完全等於,如果$a不等於$b或者它們類型不同,Ture

 

當php進行一些數學計算的時候,當有一個對比參數是整數的時候,會把另外一個參數強制轉換為整數。

1 var_dump(0 == ‘0‘); // true

2 var_dump(0 == ‘abcdefg‘); // true

3 var_dump(0 === ‘abcdefg‘); // false

4 var_dump(1 == ‘1abcdef‘); // true

* bool類型的true跟任一字元串可以弱類型相等

 

在某些情況下,PHP會把類數值資料(如含有數位字串等)轉換成數值處理,== 運算子就是其中之一。在使用 == 運算子對兩個字串進行鬆散比較時,PHP會把類數值的字串轉換為數值進行比較,如果參數是字串,則返回字串中第一個不是數位字元之前的數字串所代表的整數值。比如: ‘3‘ == ‘3ascasd‘結果為true。

4.eval可以直接執行php代碼

5.intval   將變數轉成整數類型

6.ereg()函數用指定的模式搜尋一個字串中指定的字串,如果匹配成功返回true,否則,則返回false。搜尋字母的字元是大小寫敏感的。

int ereg(string pattern, string originalstring, [array regs]);

例,$email_id = "[email protected]";

    $retval = ereg("(\.)(com$)", $email_id);

 

ereg()限制password的格式,只能是數字或者字母。但ereg()函數存在NULL截斷漏洞,可以使用%00繞過驗證。

 

這裡ereg有兩個漏洞:

 

    ①%00截斷及遇到%00則預設為字串的結束

    ②當ntf為數組時它的傳回值不是FALSE

 

7.strpos — 尋找字串首次出現的位置:

例,$mystring = ‘abc‘;

    $findme   = ‘a‘;

    $pos = strpos($mystring, $findme);

 

8.$_GET可以接受數組但MD5

md5()不能處理數組結構的資料

利用此漏洞構造index.php?a[]=1&b[]=2

構造?a[]=1&b[]=2這樣md5函數無法處理數組返回false完成匹配得到flag

例,

if (isset($_GET[‘a‘]) and isset($_GET[‘b‘])) {

if ($_GET[‘a‘] != $_GET[‘b‘])

if (md5($_GET[‘a‘]) === md5($_GET[‘b‘]))

die(‘Flag: ‘.$flag);

else

print ‘Wrong.‘;

}

9.<?php

if($_POST[user] && $_POST[pass]) {

    mysql_connect(SAE_MYSQL_HOST_M . ‘:‘ . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);

  mysql_select_db(SAE_MYSQL_DB);

  $user = trim($_POST[user]);

  $pass = md5(trim($_POST[pass]));

  $sql="select user from ctf where (user=‘".$user."‘) and (pw=‘".$pass."‘)";

    echo ‘</br>‘.$sql;

  $query = mysql_fetch_array(mysql_query($sql));

  if($query[user]=="admin") {

      echo "<p>Logged in! flag:******************** </p>";

  }

  if($query[user] != "admin") {

    echo("<p>You are not admin!</p>");

  }

}

echo $query[user];

?>

 

看見括弧了沒,我一直沒看見··········

最簡單的注入 和password無關

user=admin ‘)# //注意括弧要閉合不然報錯 我就是被坑的。

 

10.PHP對於這個@符號,之前很少在意,只知道它是錯誤屏蔽的符號

 

11.一般形式:strcmp(字串1,字串2)

說明:

當s1<s2時,返回為負數 注意不是-1   true

當s1==s2時,傳回值= 0              false

當s1>s2時,返回正數 注意不是1      true

 

 

11.strlen    判斷字串長度

例,else if (strlen($_GET[‘password‘]) < 8 && $_GET[‘password‘] > 9999999)

科學記號標記法,由於要使密碼長度小於8或值大於9999999,可以使用1e8或1e9滿足條件。

 

12.檔案包含漏洞

php://filter 是一種元封裝器, 設計用於資料流開啟時的篩選過濾應用。

同時我也藉此機會學到了檔案讀取的相關知識。

 

    include “test.php”php檔案包含,在執行流中插入寫在其他檔案中的有用的代碼。讀取的時候也是資料流形式,因此可以使用php://filter進行過濾,傳回值為0,1。

    readfile(“test.php”)是將檔案以資料流的形式讀取過來,並不會執行,但會在前台瀏覽器上進行解析。傳回值是位元組數多少。

 

    file_get_contents(“test.php”)傳回值為常值內容

 

    此題運用的就是關於資料流過濾的檔案包含,我們一般在進行檔案包含的時候都這麼寫include “test.php”獲得的就是test.php直接解析出來。但如果運用readfile(“test.php”) 就不進行解析,導致無法在瀏覽器前台進行顯示。那麼問題來了看題

 

簡單的重複一下他的意思

註解:

1.php://filter/可用於處理開啟的資料流,起到過濾作用。如果源檔案為.php則很有可能在前台顯示不出來。

2.此時我們採用的方法是,先讓檔案轉化為base64格式(convert.base64-encode)然後再輸出,這樣不論是什麼格式的檔案都可以在前台輸出。

3.再次解碼就可得到原始碼,怎麼樣是不是很神奇啊!

例http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

 

13.extract 變數覆蓋

總的來說是extract() 函數從數組中將變數匯入到當前的符號表,典型的變數覆蓋。

 

例,

<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>

  <?php

  extract($_POST);

  if ($pass == $thepassword_123) { ?>

      <div class="alert alert-success">

          <code><?php echo $theflag; ?></code>

      </div>

    <?php } ?>

 <?php } ?>

 if ($pass == $thepassword_123) { ?>

 只需要覆蓋$pass、$thepassword_123這兩個變數使他們相等即可。

 

14.php上傳截斷

 

15.set_time_limit(0);

括弧裡邊的數字是執行時間,如果為零說明永久執行直到程式結束,如果為大於零的數字,則不管程式是否執行完成,到了設定的秒數,程式結束。

 

16.PHP變數覆蓋

extract() 函數從數組中將變數匯入到當前的符號表。

該函數使用數組鍵名作為變數名,使用數組索引值作為變數值。針對數組中的每個元素,將在當前符號表中建立對應的一個變數。

 

<?php
 if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
    extract($_POST);
    if ($pass == $thepassword_123) {
        echo $theflag;
    }
?>

在第三行, 運用了extract()函數, 將POST方式獲得的變數匯入到當前的符號表中. 

然後判斷$pass 與$thepassword_123兩個變數的內容是否相等.

但是, 由於extract()函數的不足之處, 導致這段代碼存在一個變數覆蓋漏洞. 

只要我們這樣構造url

/?pass =&thepassword_123=

那麼, 我們可以發現, $pass 變數和$thepassword_123變數的內容都會被設定成Null 字元串.這樣就使得兩個變數被覆蓋。

 

17.PHP超全域變數

$GLOBALS — 引用全域範圍中可用的全部變數

$GLOBALS 這種全域變數用於在 PHP 指令碼中的任意位置訪問全域變數(從函數或方法中均可)。

PHP 在名為 $GLOBALS[index] 的數組中儲存了所有全域變數。變數的名字就是數組的鍵。

例,

<?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET[‘args‘])){
    $args = $_GET[‘args‘];
    if(!preg_match("/^\w+$/",$args)){
        die("args error!");
    }
    eval("var_dump($$args);");//這裡涉及超全域變數的使用
}
?>

構造特殊url:http://120.24.86.145:8004/index1.php?args=GLOBALS

 

 

CTF中遇到的php

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.