前言
在freebuf看到一篇文章,内容是关于在文件名处如何进行sql注入的,由于这个场景没有遇到过,好奇心爆棚,短时间进行实战测试不可能,于是在ctf里找到了相似的利用场景。
正文
注册->登录账号后,来到一个文件上传页面。
随便上传一个文件,原文件名直接显示在页面中,而在实战中,文件名常常被改变。所以感觉这种利用在实战中看运气吧。回到题目中。
首先测试是否有时间盲注,如下:
发现对benchmark
和sleep
进行了防注入,而对select
和substring
可以通过双写绕过,好吧,对出题人表示理解。
后台处理应该是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
和当前数据库
小结
注入点比较独特,菜鸡见识少,记录下….