01 为什么你的API不安全?从OWASP Top 10说起
多个,全球因API安全漏洞造成的损失超过120亿美元。你的代码跑得再快,一个SQL注入就能让数据库裸奔。OWASP Top 10不是理论,是血淋淋的教训。
OWASP(开放Web应用程序安全项目)每3-多个更新一次Top 10漏洞列表。多个版本中,失效的访问控制跃居第一,加密失效位列第二,注入降至第三。但别被排名骗了——SQL注入依然是最容易利用的漏洞之一。
安全测试不是安全团队的专利。作为测试工程师,你每天写的API用例,稍加改造就能变成安全扫描器。REST Assured这个工具,不仅能测功能,还能测安全。
核心思路: 功能测试验证“能不能用”,安全测试验证“会不会被攻破”。两者共享同一个API测试框架。
> 测试不覆盖安全,等于给黑客留后门。
02 环境搭建:10分钟装好安全测试工具箱
别被“安全测试”吓到。你不需要买昂贵的商业扫描器,一个REST Assured + 几个开源库就够了。
较高 Maven依赖(直接复制)
```xml
```
较高 基础测试骨架
```java
import io.restassured.RestAssured;
import io.restassured.response.Response;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import static org.hamcrest.Matchers.*;
public class SecurityScanBaseTest {
@BeforeClass
public void setup() {
// 配置基础URL
RestAssured.baseURI = "http://localhost:8080/api";
// 设置超时(安全测试不能无限等待)
RestAssured.config = RestAssured.config()
.httpClient(httpClientConfig ->
httpClientConfig.setConnectionTimeout(5000));
}
// 基础功能测试(作为安全测试的基准)
@Test
public void testNormalLogin() {
String loginPayload = "{\"username\":\"admin\",\"password\":\"pass123\"}";
Response response = RestAssured.given()
.contentType("application/json")
.body(loginPayload)
.when()
.post("/login")
.then()
.statusCode(200)
.extract().response();
System.out.println("正常登录响应: " + response.asString());
}
}
```
> 工具不会帮你发现漏洞,但能帮你10倍速验证漏洞。
03 五大高危漏洞扫描实战:代码即武器
较高 SQL注入扫描(OWASP Top 10 #3)
SQL注入是最经典的攻击方式。攻击者在输入中插入SQL代码,让数据库执行恶意命令。
攻击原理: 如果后端拼接SQL语句时未做参数化处理,输入 `admin' OR '1'='1` 会变成:
```sql
SELECT * FROM users WHERE username = 'admin' OR '1'='1'
```
这个查询永远返回真,攻击者直接登录成功。
扫描代码:
```java
@Test
public void testSQLInjection() {
// 常见SQL注入Payload
String[] sqlPayloads = {
"' OR '1'='1",
"'; DROP TABLE users; --",
"' UNION SELECT * FROM admin --",
"admin'--",
"' OR 1=1 --"
};
for (String payload : sqlPayloads) {
String maliciousPayload = String.format(
"{\"username\":\"%s\",\"password\":\"%s\"}",
payload, "anything");
Response response = RestAssured.given()
.contentType("application/json")
.body(maliciousPayload)
.when()
.post("/login")
.then()
.extract().response();
// 安全系统应该返回403或500,而不是200
if (response.getStatusCode() == 200) {
System.out.println("⚠️ 高危:SQL注入成功!Payload: " + payload);
System.out.println("响应: " + response.asString());
} else {
System.out.println("✅ 安全:Payload被拦截: " + payload);
}
}
}
```
判断标准: 任何SQL注入Payload返回200,都是严重漏洞。安全系统必须拦截所有特殊字符。
较高 XSS跨站脚本扫描(OWASP Top 10 #7)
XSS攻击者将恶意脚本注入页面,窃取用户Cookie或重定向到钓鱼网站。
扫描代码:
```java
@Test
public void testXSSVulnerability() {
String[] xssPayloads = {
"",
"",
"javascript:alert('XSS')",
"\">",
"
};
// 测试用户输入字段(如评论、用户名、搜索)
for (String payload : xssPayloads) {
String requestBody = String.format(
"{\"comment\":\"%s\",\"userId\":1}",
payload);
Response response = RestAssured.given()
.contentType("application/json")
.body(requestBody)
.when()
.post("/comments")
.then()
.extract().response();
// 检查响应中是否包含未转义的脚本
String responseBody = response.asString();
if (responseBody.contains("

京公网安备
11010802035719号