CTF中遇到的php


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 = "admin@tutorialspoint.com";

    $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,可以使用1e81e9滿足條件。

 

12.文件包含漏洞

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

同時我也借此機會學到了文件讀取的相關知識。

 

    include test.phpphp文件包含,在執行流中插入寫在其他文件中的有用的代碼。讀取的時候也是數據流形式,因此可以使用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變量的內容都會被設置成空字符串.這樣就使得兩個變量被覆蓋。

 

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

 

 


免責聲明!

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



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