I春秋——web Write up(三)
前言:繼續總結,學習更多關于web知識和練習編寫腳本的能力。
GetFlag
一個登陸框加上驗證碼,不過有一點不同的是substr(md5(captcha), 0, 6)=e7e24a,截取MD5加密后驗證碼的前6位,而且需要等于后面的值(后面的值是變化的)
那就屬于MD5碰撞了,就模仿大師傅寫一個python腳本跑一下
import requests //requests庫是一個常用的用于http請求的模塊 import base64 import sys //該模塊提供對解釋器使用或維護的一些變量的訪問,以及與解釋器強烈交互的函數 import hashlib //主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法def getMd5(index):for i in range(100000,100000000):x = imd5 = hashlib.md5(str(x).encode("utf8")).hexdigest()if md5[0:6] == index:return x; print(getMd5("e7e24a"))得出驗證碼
觀察源碼,沒有發現什么線索,嘗試一下SQL注入
把文件下載下來
其中兩個txt文件沒有什么用處,有用的就是那一個php文件
這句話提示flag在web根目錄,抓包看看
發現并沒有什么線索,點擊超鏈接再抓包試試,發現GET處是文件id查詢的形式,所以這里應該就可以從這里查看到根目錄文件
改成flag.php沒用,但改成./flag.php有反應
以為這樣就可以得出flag,結果是我想多了,不管試多少個./././都無用,所以不能用目錄縮寫來跳過,只能輸入正確的根目錄
利用CONNECT請求方式,查看是什么服務器
Linux服務器,那就用常用的web根目錄試下
輸入/var/www/html/flag.php什么也沒有顯示
試下/var/www/html/Challenges/flag.php發現有源碼出現(注釋是自己添加的)
這段代碼涉及了try...catch拋出異常,先執行try里面的語句,如果語句中有異常則執行catch語句,不過這段代碼較為容易,我們只需滿足$spaceone === 'flag'即可,所以通過POST方式構造
即可得出flag
fuzzing
什么也沒有,抓包看看有什么線索吧
發現一句提示提示:IP,大型內部網絡,百度查詢大型內部網絡,A類IP地址都是用于大型網絡,在百度百科上查到使用范圍
偽造IP地址,修改X-Forwarded-For的值,修改過后,發現
打開看看有什么
show your key一開始到這里沒思路了,看了大師傅的博客才知道這里key是參數。。。,以為是像之前一樣的id爆破,結果不是。
那就改變請求方式,以POST方式請求
發現一句話
這句話講的很清楚了,key后面的三位是從a-z或0-9選的,最后拼成MD5值為1b4167610ba3f2ac426a68488dbd89be
那就寫腳本來爆破吧
import hashlibmd5 = '1b4167610ba3f2ac426a68488dbd89be' s = 'abcdefghijklmnopqrstuvwxyz0123456789'for i in s:for j in s:for k in s:key = "ichunqiu"+i+j+kif(hashlib.md5(key.encode("utf8")).hexdigest() == md5):print(key)得出key的值ichunqiu105
再次請求,發現一個xx00xxoo.php文件
訪問后得到一段文字
source code is in the x0.txt.Can you guess the key
the authcode(flag) is 06e16LKT9I7Lnahh402yiyttEdV1Bq9mMnFay+x7DDf+HUMY3/s7Ktyx5GUjCc/6zWsujs9wUp6ZPbt//yGWv7IlMaf/lAo
提示說源碼在x0.txt中,那就來查看一下
剛得到一臉懵,不會這么長的代碼吧,仔細觀察便發現代碼中并未包含有flag,而且這段代碼就是一個解密函數,再加上提示的
我們直接調用函數解密輸出即可f得出flag
這個題目。。。一開始還以為是模糊測試,結果不是。。。
Hash
進行抓包,看看有什么線索
發現一段話
you are 123;if you are not 123,you can get the flag
<!–hash=md5(hash=md5(hash=md5(sign.$key);the length of $sign is 8
hash的值是由8位的sign和key組成的,提示說只要不是123,就可以得到flag,那我們將key改為124,提交但是hash值不正確
所以我們需要先求出來sign的值,然后再和我們所設的124連在一起求MD5即可
在線MD5解一開始的hash值
還真查到了,一直以為需要寫腳本給跑出來,那sign的值便是kkkkkk01,結合124,在線MD5加密,提交即可
又得到一個線索,訪問一下,發現源碼
那接下來就來審計代碼
一個Demo類,有三個魔法函數,簡單介紹一下
__construct 在每次創建新對象時先調用此方法 __destruct 對象的所有引用都被刪除或者當對象被顯式銷毀時執行 __wakeup unserialize() 會檢查是否存在一個 __wakeup() 方法。如果存在,則會先調用 __wakeup 方法下面if語句判斷是否存在GET方式進入的var,如果滿足匹配的正則表達式,則回顯STOP,否則則進行反序列化,在反序列化之前,先調用__wakeup魔法函數,如果指向的file不是Gu3ss_m3_h2h2.php,則會強制指向Gu3ss_m3_h2h2.php
審計完代碼,思路也就很清晰了,提示說秘密在f15g_1s_here.php,根據這串代碼,我們需要將f15g_1s_here.php先序列化,最后讓源碼解開,其中還必須繞過正則表達式和__wakeup的檢查,才可以成功
模仿大師傅的腳本
<?php class Demo {private $file = 'Gu3ss_m3_h2h2.php';public function __construct($file) {$this->file = $file;}function __destruct() {echo @highlight_file($this->file, true);}function __wakeup() {if ($this->file != 'Gu3ss_m3_h2h2.php') {//the secret is in the f15g_1s_here.php$this->file = 'Gu3ss_m3_h2h2.php';}}}$a = new Demo('f15g_1s_here.php');$s = serialize($a);echo $s;echo '<br>';$s = str_replace('O:4', 'O:+4',$s);//繞過正則$s = str_replace(':1:', ':2:' ,$s);//繞過wakeup函數echo base64_encode($s);//最后base64編碼?>簡單解釋一下$s = str_replace('O:4', 'O:+4',$s);能繞過正則表達式
因為在源碼中[oc]會任意匹配其中的一個字符,正則表達式中有模式修正符i,i 不區分(ignore)大小寫;例如: /abc/i 可以匹配 abc、aBC、Abc ',所以可以匹配到O,\d用來匹配數字,而我們構造O:+4則可以繞過這一匹配,從而讓匹配不成功,繞過正則
之所以$s = str_replace(':1:', ':2:' ,$s);能繞過wakeup函數,是因為當成員屬性數目大于實際數目時可繞過該函數
得出結果
直接在URL將base64編碼的值傳進去,又會發現一段源碼
有eval函數,但同時也有addslashes轉義函數,addslashes轉義函數會
轉義'和",所以只能用反引號 ` ,構造payload:
查看flag即可
解釋一下${}、反引號,這里涉及到命令代換
shell執行命令并將命令替換部分替換為執行該命令后的結果(先執行該命令,然后用結果代換到命令行中)
反引號和${}者兩種命令的功能是相同的,在執行一條命令時,會將``或者${}中的語句當做命令執行以便,再把結果加入到原命令中重新執行
具體可以看大師傅的博客
命令代換
好了,這次就先總結到這里,又學到不少知識,下次繼續總結!
總結
以上是生活随笔為你收集整理的I春秋——web Write up(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: I春秋——web Write up(二)
- 下一篇: Jarvis OJ web(一)