sql注入语句大全
很多人第一次接触 SQL 注入,入语是入语从一条 `' OR '1'='1` 开始的。这条语句看起来像乱码,入语但它能让一个登录框直接放行。入语原理不复杂:后端把用户输入拼进 SQL 查询里,入语输入里的入语引号提前闭合了原语句,剩下的入语部分被数据库当成合法指令执行。攻击者要做的入语,就是入语猜出拼接方式,然后构造能跑通的入语片段。
最经典的入语场景是登录绕过。假设后端执行的入语是 SELECT * FROM users WHERE username='$user' AND password='$pass'。用户名填 admin' --,入语密码随便写。入语拼接后变成 SELECT * FROM users WHERE username='admin' --' AND password='xxx'。入语数据库看到 -- 就把后面全注释掉了,密码验证直接消失。如果用户名不存在,用 ' OR 1=1 -- 也能让条件恒真,返回第一条用户记录。
联合查询是另一条路。它要求攻击者先确定原查询返回几列。用 ORDER BY 递增数字试探,页面正常就说明列数够,报错就说明超了。比如 ' ORDER BY 3 -- 正常、' ORDER BY 4 -- 报错,那原查询就是 3 列。接着用 UNION SELECT 1,2,3 -- 找页面回显位,把 1 换成 database()、user()、version(),库名、当前用户、版本就出来了。再往下查表名:UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database() --。列名同理,最后直接拖数据。
报错注入适合页面不回显但会打印数据库错误的情况。MySQL 里常用 extractvalue(1,concat(0x7e,(SELECT database()),0x7e)),把要查的内容拼进 XPath 参数,数据库报错时就把结果带出来了。还有 updatexml,用法类似。这种手法在错误信息被屏蔽的站点上会失效,但很多老系统仍然会把原始错误直接吐到页面上。
盲注更磨人。页面既不回显也不报错,只能靠“真/假”或时间差推断。布尔盲注用 AND substring((SELECT database()),1,1)='a' 逐字符猜,页面正常说明猜对,异常说明猜错。时间盲注用 AND IF(条件, SLEEP(5), 0),条件成立就延迟 5 秒。手工跑盲注效率极低,实际测试里基本靠 sqlmap 这类工具自动化,但理解原理才能判断工具输出是否可信。
堆叠查询在部分数据库和驱动下可用,比如 '; DROP TABLE users --。MySQL 的 PHP 驱动默认不支持多语句,但 SQL Server 往往可以。写文件、读文件也属于延伸利用:MySQL 的 INTO OUTFILE 可以往 Web 目录写 webshell,前提是数据库账户有 FILE 权限且目录可写。这些操作破坏性大,真实渗透中要谨慎,未经授权就是犯罪。
防御层面,参数化查询是根治手段。把用户输入当参数传,而不是拼进 SQL 字符串,数据库就不会把输入内容解析成指令。预编译语句在 Java 的 PreparedStatement、Python 的 cursor.execute 占位符、PHP 的 PDO 里都是标准做法。其次是最小权限:Web 应用连数据库的账户不该有 DROP、FILE 这类权限。再配合输入校验和 WAF,能挡住大部分自动化扫描,但别把 WAF 当唯一防线,绕过手法一直在更新。
最后提醒一句:上面这些语句只适合在授权测试、CTF 或自己的实验环境里用。对别人的系统随手试一条 ' OR 1=1 --,可能就踩到法律红线了。
(责任编辑:知识)














