[NISACTF 2022]checkin
簡單的get傳參,好久沒做過這么簡單的題了
王德發?????!,看了源代碼以后,本來以為是js腳本的問題,但是禁用js腳本沒用,看了大佬的wp以后才發現,是有字符被隱藏了,具體推測是因為對高亮的使用,這里第二段注釋部分顏色不對。(url通過show_source函數在高亮源代碼時按照php.ini中的設置來渲染)
而且,鼠標掃前面,會有后面的代碼被同步
這里嘗試復制源代碼到winhex里面看看。
確實存在,將這些特殊符號用URL編碼以后再次進行傳參,這里用到的知識點就是特殊字符識別。
payload
ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6%55%67%65%69%77%6F%E2%81%A9%E2%81%A6%63%75%69%73%68%69%79%75%61%6E=%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%4E%31%53%41%43%54%46
得到了flag
[UUCTF 2022 新生賽]ez_rce
進來就是一個正則啊,看來這題就是各種過濾了·
????????這種題我覺得一般就是過濾了平時比較常用的OS命令,然后要用點稍微冷門的命令或者格式來進行繞過。然后這里有就是php的函數以及講解(PHP中的輸出:echo、print、printf、sprintf、print_r和var_dump-騰訊云開發者社區-騰訊云)
然后就是反引號的作用,之前也遇到過,但是沒有仔細的考慮過,這里做出介紹:
1.反引號常見在SQL語句中來包含關鍵字,比如
$sql = "select `user`,username from `Content`";
此SQL中有反引號,也沒有反引號
加上反引號就不會有因為字段是關鍵字而出錯的問題。
為了保險起見,我們建議在所有字段中都加上反引號,即上面的SQL建議寫成
$sql = "select `user`,`username` from `Content`";
2.反引號還有種功能是執行系統命令,比如:echo `dir d:\php`;注意,此句中的引號是反引號,而不是單引號。此句在足夠權限的系統環境中,將列舉D盤PHP目錄的一些文件信息。
3.注:反引號位于鍵盤左邊Esc下面,數字1按鈕前,Tab上。
4.例如:SELECT `setting` FROM `$tablename` WHERE $where LIMIT 1
????????然后呢,這里的命令執行沒有過濾 <> ? \/ 所以可以 ?>閉合(這個閉合針對括號也被過濾,但是這里的括號并沒有被過濾,所以還是可以用括號進行過濾)
??????? 構造第一步payload:
?code=printf(`l\s `);
這里用var_dump也可以
看一下根目錄,找到了和flag有關的文件
查看的話 ,一種是使用被過濾的字符,但是要用到/,還有一種,也可以用沒有被過濾的命令,比如rev和nl(這里的rev是逆序輸出,所以輸出的flag是反的,需要人為改正一下,或者跑個腳本,有興趣的可以試試,我看了一下,就沒有復制上)。這里因為第一種很簡單,所以采用第二種來示例:
得到了flag
[SWPUCTF 2022 新生賽]ez_ez_php(revenge)
進來以后,發現應該是和偽協議有關
嘗試讀取flag.php
應該是讀取到了,嘗試解碼看看
得到了一段php代碼,給了關鍵信息,大概意思應該是說,真正的flag在'/flag'下,不是flag.php下,
嘗試修改以后再次讀取
成功得到了flag
?[CISCN 2019華東南]Web11
看起來都是比其他題吊一點
看到了提示
根據下面的三張圖提示,可以看出是smart ssti
,在XFF
處構造payload
介紹一下smart
????????smart是php的模板引擎,模板引擎的作用就是分離前端頁面和數據的,題目中顯示API的URL由于環境的原因無法使用,但我們的IP依舊顯示在了頁面的右上角,且根據它的提示XFF我們很容易想到,在X-Forwarded-For里構造ssti.然后呢ssti,我也寫過相關的博客,詳細內容,可以在這里找關于ssti(簡介)-CSDN博客
?????????在利用SSTI注入時,在Smarty中一般用{php}{/php}標簽來進行包裹執行php語句,在查詢wp和一些資料后,得知{php}標簽被強烈建議不使用,只有在SmartyBC中可用;
????????然后{if}標簽和php中的if判斷類似,而且可以正常使用php中的函數和符號,不過在使用時,要配上{/if}
??????? 然后是php的沒必要去,模板引擎的作用就是分離前端頁面和數據的,題目中顯示API的URL由于環境的原因無法使用,但我們的IP依舊顯示在了頁面的右上角,且根據它的提示XFF我們很容易想到,在X-Forwarded-For里構造ssti:payload
??????? 抓包,改xff
?經典${7*7}回顯是$49
?進行下一步判斷7{*comment*}7
基本可以判斷是是Smarty類型,可以開始包裹php語句進行查詢了(除了加個{if}標簽,還是用的php語句)
找到了flag相關文件,查看
找到了flag
[LitCTF 2023]這是什么?SQL !注一下 !
這個圖我都不敢放加載完的
抓包一下,搞sqlmap,時間盲注,布爾盲注
爆庫
感覺應該和ctf有關,看看信息
光是用戶名的話,可能沒什么用,看看另外一個ctf的庫里面有什么
運氣很好,找到了flag相關信息,接著往下爆破
?爆字段
得到了flag
[HNCTF 2022 Week1]easy_html
提示了cookie里面有東西
?f12查看
?
%2f是url編碼,說明這里給了有關文件地址的提示 ,即f14g.php,訪問一下看看
讓輸入手機號,但是位數被限制了,限制到了十位
然后就彈了這個提示
f12改一下位數限制 ,再登陸
得到了flag
[NISACTF 2022]babyupload?
傳🐎啊,我最熟了,先上個圖片🐎看看·
傳不上,看看源碼
給了提示,意思是要叫我下個什么東西,看看
zip文件
解壓以后里面是個python文件
這里是全部代碼
from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuidapp = Flask(__name__)SCHEMA = """CREATE TABLE files (
id text primary key,
path text
);
"""def db():g_db = getattr(g, '_database', None)if g_db is None:g_db = g._database = sqlite3.connect("database.db")return g_db@app.before_first_request
def setup():os.remove("database.db")cur = db().cursor()cur.executescript(SCHEMA)@app.route('/')
def hello_world():return """<!DOCTYPE html>
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">Select image to upload:<input type="file" name="file"><input type="submit" value="Upload File" name="submit">
</form>
<!-- /source -->
</body>
</html>"""@app.route('/source')
def source():return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True)@app.route('/upload', methods=['POST'])
def upload():if 'file' not in request.files:return redirect('/')file = request.files['file']if "." in file.filename:return "Bad filename!", 403conn = db()cur = conn.cursor()uid = uuid.uuid4().hextry:cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))except sqlite3.IntegrityError:return "Duplicate file"conn.commit()file.save('uploads/' + file.filename)return redirect('/file/' + uid)@app.route('/file/<id>')
def file(id):conn = db()cur = conn.cursor()cur.execute("select path from files where id=?", (id,))res = cur.fetchone()if res is None:return "File not found", 404# print(res[0])with open(os.path.join("uploads/", res[0]), "r") as f:return f.read()if __name__ == '__main__':app.run(host='0.0.0.0', port=80)
?
我們直接看最關鍵的def upload
和def file
里的內容,意思是,上傳的文件不能有后綴名,且文件名前會拼接一個前綴upload/
,使得輸出的文件只能是在目錄upload/
下的,這里就涉及到os.path.join()
的絕對路徑拼接漏洞:
絕對路徑拼接漏洞
os.path.join(path,*paths)函數用于將多個文件路徑連接成一個組合的路徑。第一個函數通常包含了基礎路徑,而之后的每個參數被當作組件拼接到基礎路徑之后。
然而,這個函數有一個少有人知的特性,如果拼接的某個路徑以 / 開頭,那么包括基礎路徑在內的所有前綴路徑都將被刪除,該路徑將視為絕對路徑,若我們使得
res[0]='/flag'
,則可以讀取到根目錄下的flag文件,因此利用bp抓包,修改文件名為/flag
即可:?
所以若使得res[0]='/flag'
,則可以讀取到根目錄下的flag文件,因此利用bp抓包,修改文件名為/flag
即可:
得到路徑以后,訪問即可
得到了flag