2023-04-09 19:01:30
字符型注入类型4是针对Web应用程序中字符型输入参数的SQL注入攻击形式,攻击者通过构造特殊输入破坏SQL语句原有结构,进而实现非授权数据访问或操作。 以下从原理、实验操作、防御措施三个维度展开说明:
一、字符型注入类型4的原理SQL注入基础SQL注入的核心是攻击者利用Web应用对用户输入过滤不严的漏洞,在预设SQL语句中插入恶意代码。例如,若应用直接拼接用户输入到查询语句中,攻击者可通过输入' OR '1'='1篡改原语句逻辑。
字符型注入特征字符型注入需闭合原有SQL语句中的引号。例如,若原查询为SELECT * FROM users WHERE username = '[用户输入]',攻击者输入admin' --可闭合引号并注释后续语句,使查询变为SELECT * FROM users WHERE username = 'admin' --',从而绕过密码验证。
类型4的特殊性类型4通常指攻击者通过观察引号闭合后的错误信息(如数据库报错)判断注入点,并利用information_schema数据库中的元数据表(如tables、columns)逐级获取数据库结构信息。例如,通过输入admin' AND 1=2 UNION SELECT table_name FROM information_schema.tables WHERE table_schema=database()--可枚举当前数据库的所有表名。

实验目标
理解SQL注入的攻击链(注入点探测→语句构造→信息提取)。
掌握字符型注入中引号闭合、注释符使用(如--、#)等技巧。
通过information_schema数据库获取目标数据库的表名、字段名等敏感信息。
关键步骤
注入点探测:在输入框中输入单引号('),若页面返回数据库错误(如You have an error in your SQL syntax),则证明存在字符型注入漏洞。
数据库名获取:构造输入' UNION SELECT database()--,通过页面回显或报错信息获取当前数据库名称。
表名枚举:利用information_schema.tables表查询表名,输入示例:
' UNION SELECT table_name FROM information_schema.tables WHERE table_schema='目标数据库名'--字段名与数据提取:进一步查询information_schema.columns表获取字段名,再通过联合查询(UNION SELECT)提取具体数据,例如:
' UNION SELECT column_name FROM information_schema.columns WHERE table_name='目标表名'--' UNION SELECT 字段1,字段2 FROM 目标表名--注意事项
需根据数据库类型调整语法(如MySQL使用--注释,Oracle使用--或/* */)。
若页面无直接回显,需通过盲注技术(如布尔盲注、时间盲注)逐步推断数据。
输入校验与过滤
使用正则表达式限制输入格式(如仅允许数字、字母)。
对特殊字符(如'、"、--)进行转义或替换为空。
限制输入长度,减少攻击者构造复杂语句的空间。
关键字过滤与编码
过滤SQL关键字(如SELECT、UNION、INFORMATION_SCHEMA),但需注意绕过风险(如大小写混合、双写关键字)。
对输出到页面的数据进行HTML实体编码,防止XSS与SQL注入复合攻击。
预编译与参数化查询
使用预编译语句(如JDBC的PreparedStatement、PHP的PDO),将用户输入作为参数传递,避免SQL语句拼接。
示例(Java):
String query = "SELECT * FROM users WHERE username = ?";PreparedStatement stmt = connection.prepareStatement(query);stmt.setString(1, userInput); // 用户输入自动转义最小权限原则与函数禁用
数据库用户仅授予必要权限(如禁止DROP、FILE等高危操作)。
禁用危险函数(如MySQL的LOAD_FILE()、INTO OUTFILE)。
总结:字符型注入类型4通过闭合引号与注释符篡改SQL逻辑,攻击者需结合数据库元数据表逐步提取信息。防御需从输入校验、预编译、权限控制等多层入手,构建纵深防御体系。