文件名处存在的sql注入

前言

在freebuf看到一篇文章,内容是关于在文件名处如何进行sql注入的,由于这个场景没有遇到过,好奇心爆棚,短时间进行实战测试不可能,于是在ctf里找到了相似的利用场景。

正文

注册->登录账号后,来到一个文件上传页面。

随便上传一个文件,原文件名直接显示在页面中,而在实战中,文件名常常被改变。所以感觉这种利用在实战中看运气吧。回到题目中。

首先测试是否有时间盲注,如下:

发现对benchmarksleep进行了防注入,而对selectsubstring可以通过双写绕过,好吧,对出题人表示理解。

后台处理应该是insert into将文件名插入表中。

于是在本地的测试能够利用的sql语句:

发现'TGAO'+(select database())插入在表中显示0

回顾一波知识…

发现只有字符串和数字字符串或数字相加才显示那个数字,其他的都显示为0。

于是可以构造如下语句

1
TGAO'+(selselectect conv(substr(hex(database()),1,12),16,10))+'.jpg

其中的hex将数据转换为16进制,由于在测试时发现,字符串与十六进制数相加,结果不是原十六进制,所以还需要利用conv转换为10进制,保证最后结果是想要的数据。

按照此方式,便可以注入出数据库、表、字段、数据。


另外,看了其他的wp,发现还有一个解法,当知道表结构时,注入更方便。

某大佬得知表结构是filename.jpg,uid,uid) ,便可以通过多记录同时插入:

1
TGAO','uid','uid'),((database()),'uid','uid')#.jpg

拼接后sql语句是:

insert into 表名 values('TGAO','uid','uid'),((database()),'uid','uid')

页面会回显TGAO当前数据库

小结

注入点比较独特,菜鸡见识少,记录下….