Bugku—web题解
前言:最近做了一些Bugku入門(mén)的web題目,感覺(jué)web題挺有趣的,并非是得出flag,而是可以通過(guò)一個(gè)題目學(xué)習(xí)到很多知識(shí)。
域名解析
題目說(shuō)把 flag.baidu.com 解析到123.206.87.240 就能拿到flag,如果了解域名解析的原理和系統(tǒng)文件host的作用,那這道題就很簡(jiǎn)單了。
通俗的話說(shuō):域名是為了我們方便記憶,但計(jì)算機(jī)識(shí)別的是IP地址,所以要將域名解析為IP地址才能訪問(wèn)到自己想要訪問(wèn)的網(wǎng)站。而host文件中放的是一些網(wǎng)站的DNS(域名系統(tǒng))緩存,通過(guò)本地解析會(huì)提高訪問(wèn)速度,如果沒(méi)有host系統(tǒng)文件,我們發(fā)送請(qǐng)求,服務(wù)器端DNS接收解析再返回給客戶(hù)端,這會(huì)慢很多,當(dāng)然也可以用host文件來(lái)屏蔽一些垃圾網(wǎng)站,只要將它解析到一個(gè)不存在的IP即可屏蔽。
原理大致就是這樣。
用管理員權(quán)限添加上題目所說(shuō)的域名和IP,再次訪問(wèn)域名,即可得出flag
你必須讓他停下
打開(kāi)之后一直再刷新,查看源代碼發(fā)現(xiàn)是用JSsetTimeout('myrefresh()',500)設(shè)置刷新,每500毫秒刷新一次頁(yè)面,有兩種方法可以做這到題。
一、在瀏覽器中禁用JS,然后手動(dòng)刷新,查看源代碼就可找到flag
二、用burp suite抓包
多點(diǎn)擊幾次go,就可得出flag
變量1
flag In the variable ! <?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET['args'])){$args = $_GET['args'];if(!preg_match("/^\w+$/",$args)){die("args error!");}eval("var_dump($$args);"); } ?>一道關(guān)于正則表達(dá)式的web題,/表示的是正則表達(dá)式的開(kāi)始和結(jié)束,^或\A 匹配字符串開(kāi)始位置,\w匹配任意數(shù)字或字母或下劃線(a-z,A-Z,0-9,_),+匹配1次或多次其前面的字符(相當(dāng)于可以輸入多個(gè)字符、數(shù)字、或下劃線),$或者\(yùn)Z匹配字符串的結(jié)束位置。
提示說(shuō)flag In the variable ,直接用全局?jǐn)?shù)組變量$GLOBALS可以得出所以變量的值,其中有一個(gè)變量是$$args那就構(gòu)造語(yǔ)句,讓變量成$GLOBALS即可。
http://123.206.87.240:8004/index1.php?args=GLOBALS即可得出flag
頭等艙
這個(gè)沒(méi)啥好做的,抓一下包就可得出flag
本地包含
給了一段PHP代碼,首先先來(lái)搞清一些函數(shù):
show_source() 函數(shù)
方法一、eval函數(shù)
前面學(xué)習(xí)過(guò)了命令注入其中eval函數(shù)是危險(xiǎn)函數(shù),可以將字符串當(dāng)作PHP進(jìn)行解析,可以利用這個(gè)漏洞構(gòu)造payload:
?hello=);show_source("flag.php");var_dump();閉合前面的var_dump(,var_dump(閉合后面的);,構(gòu)造這樣的語(yǔ)句便可以執(zhí)行我們想要的語(yǔ)句了。
但是flag不對(duì),查了一下,發(fā)現(xiàn)很多人都遇到這個(gè)問(wèn)題,這里應(yīng)該是網(wǎng)站的問(wèn)題,就不管了,過(guò)程最重要!
方法二:
利用file()或get_file_contents函數(shù)
file_get_contents() 函數(shù)把整個(gè)文件讀入一個(gè)字符串中 file() 函數(shù)把整個(gè)文件讀入一個(gè)數(shù)組中。payload:
?hello=file('flag.php')
payload:
方法三:
這道題的題目便是本地本地包含,就用本地包含的方法來(lái)做一下:
include()函數(shù)和php://filter結(jié)合使用 php://filter可以用與讀取文件源代碼,結(jié)果是源代碼base64編碼后的結(jié)果 php://filter/convert.base64-encode/resource=文件路徑payload:
正常的話,base64解碼即可,但這個(gè)題有點(diǎn)問(wèn)題。
web5
查看源碼,發(fā)現(xiàn)是jother編碼
jother編碼詳解
粘貼到控制臺(tái)回車(chē)即可解碼,注意flag轉(zhuǎn)化成大寫(xiě),題目中有提示:
網(wǎng)站被黑
源碼什么也沒(méi)有,其他也沒(méi)有觀察出什么就用御劍掃描一下
有隱藏目錄shell.php
需要輸入密碼才能進(jìn)入,也沒(méi)有任何提示,一般就是弱口令爆破了
加載字典
進(jìn)行爆破,便可得出flag。
輸入密碼查看flag
觀察到爆破而且密碼是五位數(shù)字,那就用burp來(lái)爆破
設(shè)置payload:
爆破出來(lái)了,提交即可得出flag
點(diǎn)擊一百萬(wàn)次
提示是JS,查看一下源代碼,發(fā)現(xiàn)
雖然不太懂JS代碼,但是還是可以理解這個(gè)代碼大意,變量clicks通過(guò)點(diǎn)擊來(lái)自增。但是這里變量也可以通過(guò)POST進(jìn)行傳遞,那就直接給變量傳一個(gè)10000000.
備份是個(gè)好習(xí)慣
發(fā)現(xiàn)是MD5加密后的值,而且兩段相同,解密一下
空密碼,看來(lái)解題思路應(yīng)該錯(cuò)了,重新查看題目發(fā)現(xiàn)這道題與備份有關(guān),常見(jiàn)的PHP備份后綴名有.php.bak等
輸入http://123.206.87.240:8002/web16/index.php.bak發(fā)現(xiàn)
當(dāng)然了,這次是運(yùn)氣好,是index.php,如果遇到其他名字的話就用御劍來(lái)把隱藏的目錄都給掃出來(lái)即可。
就一個(gè)目錄,那備份肯定就是index.php.bak,接下來(lái)就來(lái)查看下載的文件
strstr函數(shù)將URL?后的值(包括?)一起賦給變量str
$str = substr($str,1);去除?
$str = str_replace('key','',$str);如果變量str中存在key,則替換掉
最核心的代碼就是這一段代碼
if(md5($key1) == md5($key2) && $key1 !== $key2){echo $flag."取得flag"; }兩個(gè)變量的MD5值需相同,但是變量不能夠相同,才可以得出flag,這點(diǎn)涉及到了MD5的繞過(guò)
md5加密之后以0e開(kāi)頭的,值都為0,那是因?yàn)?e在比較的時(shí)候會(huì)將其視作為科學(xué)計(jì)數(shù)法,所以無(wú)論0e后面是什么,0的多少次方還是0。
常見(jiàn)的0e開(kāi)頭:
QNKCDZO 0e830400451993494058024219903391s878926199a 0e545993274517709034328855841020s155964671a 0e342768416822451524974117254469s214587387a 0e848240448830537924465865611904s214587387a 0e848240448830537924465865611904s878926199a 0e545993274517709034328855841020s1091221200a 0e940624217856561557816327384675既然知道了如何繞過(guò),那就來(lái)構(gòu)造語(yǔ)句,但是要注意前面將key這個(gè)關(guān)鍵字給過(guò)濾掉了,所以采用錯(cuò)位的方法構(gòu)造payload:
?kekeyy1=QNKCDZO&kekeyy2=s214587387a得出flag
除此之外,看了大師傅們的博客,發(fā)現(xiàn)繞過(guò)MD5的方法還可以利用數(shù)組
md5()函數(shù)無(wú)法處理數(shù)組,如果傳入的為數(shù)組,會(huì)返回NULL,所以?xún)蓚€(gè)數(shù)組經(jīng)過(guò)加密后得到的都是NULL,也就是相等的。
所以構(gòu)造payload:
http://123.206.87.240:8002/web16/?kekeyy1[]=aa&kekeyy2[]=bb //值可以隨便填寫(xiě)得出flag
成績(jī)單
明顯的回顯注入,判斷閉合符號(hào)是單引號(hào),省略符號(hào)是#,這道題也沒(méi)有過(guò)濾關(guān)鍵字什么的,按照通用的語(yǔ)句來(lái)做即可,這里就不闡述了。
速度要快
查看源碼發(fā)現(xiàn)
需要一個(gè)帶margin屬性的post請(qǐng)求,除此之外應(yīng)該還有其他線索,用burp進(jìn)行抓包,發(fā)現(xiàn)請(qǐng)求頭中隱藏有flag,base64解碼提交確不正確,搞了好久才發(fā)現(xiàn)原來(lái)每go一次,flag便變化一次
看了大師傅的write up,需要py腳本來(lái)解決,自己還寫(xiě)不出來(lái)就參考大師傅的腳本
python str與bytes之間的轉(zhuǎn)換
大師傅博客
cookies欺騙
一開(kāi)始做這道題很懵,后來(lái)發(fā)現(xiàn)url上a2V5cy50eHQ=是base64編碼,解碼查看
解碼得到keys.txt,說(shuō)明當(dāng)前訪問(wèn)的是keys.txt文件,那按照這樣的格式把index.php也轉(zhuǎn)換成base64編碼格式查看源碼。
發(fā)現(xiàn)改變line的值會(huì)出現(xiàn)一段PHP語(yǔ)句,寫(xiě)一個(gè)簡(jiǎn)單的腳本把所有的代碼跑出來(lái)
結(jié)果:
<?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]; } ?>審計(jì)代碼,發(fā)現(xiàn)有一段代碼特殊
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){ $file_list[2]='keys.php'; }再結(jié)合題目,cookies欺騙,抓包修改參數(shù)即可訪問(wèn)keys.php,不過(guò)這里keys.php需要轉(zhuǎn)化成base64的格式。
前女友(SKCTF)
這個(gè)鏈接是可以點(diǎn)開(kāi)的,一開(kāi)始沒(méi)注意到,在抓包過(guò)程中才發(fā)現(xiàn)
一段PHP代碼,考察MD5漏洞的,但是和之前的題中有一點(diǎn)不同,這道題還考察了strcmp函數(shù)的漏洞
strcmp(str1,str2)比較兩個(gè)字符串,如果相等就返回0。
在php 5.2版本之前,利用strcmp函數(shù)將數(shù)組與字符串進(jìn)行比較會(huì)返回-1,但是從5.3開(kāi)始,會(huì)返回0
所以利用這個(gè)漏洞構(gòu)造payload:
?v1=s214587387a&v2=s878926199a&v3[]=1或都用數(shù)組來(lái)繞過(guò),payload:
?v1[]=1&v2[]=2&v3[]=1得出flag
你從哪里來(lái)
根據(jù)提示,可以知道這道題應(yīng)該是構(gòu)造referer——偽造來(lái)源瀏覽器,抓包進(jìn)行偽造
程序員本地網(wǎng)站
根據(jù)提示,這道題考察的是xff——偽造IP地址來(lái)源,抓包修改成本地IP地址即可
md5 collision(NUPT_CTF)
簡(jiǎn)單的MD5碰撞,由==的用法,0 == 字符串是成立的,從而可以繞過(guò)MD5檢查。之前了解過(guò)MD5算法的漏洞,會(huì)將0e開(kāi)頭的當(dāng)作0,所以只要找到常見(jiàn)的一個(gè)以oe開(kāi)頭加密過(guò)的MD5值即可
舉個(gè)例子:
<?php $str = "Hello"; echo md5($str); if (md5($str) == "8b1a9953c4611296a827abf8c47804d7") //0 == 字符串 { echo "<br>Hello world!"; exit; } ?>理解了這些,就構(gòu)造payload:
?a=s155964671anever give up
這道題一開(kāi)始困住很長(zhǎng)時(shí)間,看了源代碼提示后進(jìn)入這個(gè)頁(yè)面
便毫無(wú)思路了,后來(lái)才發(fā)現(xiàn)在源代碼中查看1p.html才有相應(yīng)的提示。。。
發(fā)現(xiàn)一串base64編碼,進(jìn)行解碼
明顯是URL編碼,繼續(xù)解碼
有require() 函數(shù)引入f4l2a3g.txt文件,直接查看即可得出flag
web4
看源代碼發(fā)現(xiàn)
URL編碼的,解碼
unescape() 函數(shù)可對(duì)通過(guò) escape() 編碼的字符串進(jìn)行解碼。
接下來(lái)根據(jù)eval(unescape(p1) + unescape('54aa2' + p2));順序進(jìn)行拼接即可
67d709b2b54aa2aa648cf6e87a7114f1得出flag
管理員系統(tǒng)
題目是管理員系統(tǒng),猜測(cè)用戶(hù)名應(yīng)該是admin,查看源代碼發(fā)現(xiàn)
解碼后得到test123,應(yīng)該是密碼,但是輸入之后發(fā)現(xiàn)
所以抓包XFF偽造IP地址即可得出flag
login1(SKCTF)
提示是SQL約束攻擊,了解一下SQL約束攻擊
基于約束的SQL攻擊
具體的就不詳細(xì)解釋了,大師傅已經(jīng)在博客中說(shuō)的很清楚了。
注冊(cè)一個(gè)普通賬號(hào),會(huì)提示不是管理員還想登進(jìn)去,那就注冊(cè)一個(gè)admin賬號(hào),但是已經(jīng)存在了,這時(shí)就用道了SQL約束攻擊
構(gòu)造用戶(hù)名
后面多加空格,密碼按照要求即可
注冊(cè)成功后,輸入admin和注冊(cè)時(shí)的密碼即可
原理的話就是大師傅的這一段話,如果不太了解可以仔細(xì)看大師傅的博客
求getshell
根據(jù)提示,只能上傳圖片,抓包
將后綴名改為php發(fā)現(xiàn)上傳不成功,之后嘗試各種方法如:后綴名加::$DATA繞過(guò),嘗試了phtml,php3,php4, php5, pht發(fā)現(xiàn)還是不行,最后看了大師傅們的博客
這個(gè)地方需要大小寫(xiě)搭配上php5`才能繞過(guò),是真的想不到,之前也沒(méi)遇到過(guò)。
發(fā)包即可得出flag
總結(jié)
以上是生活随笔為你收集整理的Bugku—web题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: XCTF(攻防世界)—进阶web题Wri
- 下一篇: XCTF(攻防世界)—进阶web题Wri