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