[HFCTF 2021 Final]hatenum
我们下载文件,查看关键源码
1 |
|
我们发现它过滤了一大堆东西
1 | '/\d{9}|0x[0-9a-f]{9}/i' |
1 | '/union|select|or|and|\'|"|sleep|benchmark|regexp|repeat|get_lock|count|=|>|<| |\*|,|;|\r|\n|\t|substr|right|left|mid/i' |
基本上常用的都给过滤掉了
我们尝试登录,登录的话,登录成功、登录失败和发生错误是三个不同的回显,那我们就可以通过触发错误进行盲注,这里不能使用整数溢出操作,因为这里限制了字符的位数,所以整数溢出做不到
这里有两个做法
第一种是选择exp函数,上限是exp(709),再加数次就会出现浮点数溢出报错
还有一种是对0去反,也就是~0,这种操作可以直接得到最大整数
具体看这篇博客
我们来讲第一种,首先要了解
exp函数用法
1、MySQL中的exp()函数用于将E提升为指定数字X的幂,这里E(2.718281 …)是自然对数的底数,exp()函数在sql注入里面exp函数一般被用做报错注入(mysql<5.5.53)里面输出报错信息
2、这里注入利用的是Double溢出,exp(x) 含义为e的x次方,当x>709时就超过了double的取值范围造成报错输出
3、我们可以用 ~ 运算符按位取反的方式得到一个最大值,该运算符也可以处理一个字符串,经过其处理的字符串会变成大一个很大整数足以超过 Double 数组范围,从而报错输出
关键字绕过
我们来进行绕过关键字
盲注通常会用到以下几个关键字:
字符串截取类(substr)、条件判断类(if)、语句分割类(空格、/**/)、逻辑运算类(and、or)
字符串截取类
禁用:substr、left、right、mid
绕过: like、rlike、instr
其中like与rlike的区别是 rlike支持正则表达式,而like只支持如%,_等有限的通配符,like可以近似于”=”
语句分割
禁用: 空格、r(%0d)、n(%0a)、t(%09)、/**/
语句之间分割常常使用空格
绕过: %a0( )、%0b(垂直制表符)、%0c(换页符)
逻辑运算
禁用: and、or、=、>、<、regexp
绕过: &&、||、 like、greatest、least
条件判断
禁用: 因为禁用了,,所以if 语句没法使用
exp()函数除了能用在报错注入以外,利用exp在参数大于709时会报错的特性可以用来构造条件判断语句
1 | ||exp(710-(... rlike ...)) |
即如果 (... rlike ...)
中的语句执行匹配后的结果为True
,经过减号转换后为 exp(710-1)
后不会溢出;若为false
,转换为 exp(710-0)
后则会溢出并报错
解题
有了前面的绕过后,我们就能开始解题了,我们可以判断code的长度,进而猜解code字段的具体值
由于'
被过滤,所以rlike后面不能出现字符串,需要 将正则表达式 ^xxx
转换成十六进制
同时num_waf
有个判断十六进制位数不能超过9位,既字符串不能超过4位(一个字母对应2个十六进制数)
,所以在包含正则^
以外的字符串超过3
位时需要不断做替换,用3位字符串去匹配下一位
1 | import requests as r |
参考