上周帮朋友修一个老后台,他随手输了个 ' OR '1'='1 进登录框,页面直接跳进了管理员首页——他愣了三秒,然后把鼠标移向了「退出」按钮,手有点抖。
靶场不是玩具,是你的第一道防火墙
很多人以为SQL注入只存在于CTF题和漏洞通告里。其实它就藏在你写的第5个登录接口、第3个商品搜索框、甚至导出Excel的URL参数里。靶场练习不是为了黑谁,而是让你亲手看见:一句话怎么绕过验证,一个单引号怎么拖出整张用户表。
推荐几个练得上手的靶场
SQLi-Labs(本地搭):PHP+MySQL,50多关,从基础联合查询、报错注入到盲注层层递进。第一关就是经典的 id=1 → id=1' → 页面报错,接着你就能看到MySQL版本、数据库名全在错误信息里蹦出来。
WebGoat 的 SQL Injection 模块:交互式引导,输错会告诉你差在哪,适合刚写完第一个JDBC连接的新手。
PortSwigger Academy 的 SQL injection lab:免费,界面干净,每关配真实HTTP请求截图,连Burp抓包位置都标好了。
别光看payload,试试改改代码
在本地起个简易PHP环境,写两行:
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($conn, $sql);访问 /test.php?id=1 没问题;换成 ?id=1 UNION SELECT 1,username,password FROM users,用户名密码就直接打在页面上了。再把那行改成预处理语句:
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();同样的payload,页面干干净净返回空——不是没漏洞,是你亲手把它焊死了。
靶场练到第三天,你会下意识检查每个$_GET、$_POST、甚至$_COOKIE里的值;练到第七天,看到同事代码里拼接SQL,手指会自己悬在键盘上想敲PDO。
真正的安全意识,从来不是背口诀,而是一次次看着数据被拖走时后颈发凉,再亲手把它锁回去。