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