目录
前端过滤
uploads-lab-1:
后端验证
upload-labs-2:mime验证
upload-labs-3:黑名单绕过
upload-labs-4:黑名单绕过-.htaccess(这里得用旧版的phpstudy,新版的不行)
upload-labs-5:后缀名绕过
upload-labs-6:大小写绕过
upload-labs-7:后缀名加空格绕过
upload-labs-8:后缀名加点绕过
upload-labs-9:文件流或者空格点
upload-labs-10:双写绕过或者点空格点绕过
upload-labs-11:双写绕过
upload-labs-12:截断符%00绕过
upload-labs-13:文件包含、文件头检验
upload-labs-14
upload-labs-15:exif_imagetype()判断图像的类型
连接
知识点:
一句话木马
-----------------------
webshell利用工具:
-----------------------
蚁剑:
https://github.com/AntSwordProject/AntSword-Loader
https://github.com/AntSwordProject/antSword
冰蝎:
https://github.com/rebeyond/Behinder
哥斯拉:
https://github.com/BeichenDream/Godzilla
文件上传靶场:
https://github.com/c0ny1/upload-labs
绕过前端验证
①关闭js
②通过bp抓包修改文件的后缀名
可以看到页面有一个弹窗,弹窗就联想到是前端的js代码的alert,判断他是js进行验证。
关闭js之后,文件上传成功
打开之后就可以看到我们的phpinfo()
知识点:
1.通过php对文件进行验证
2.Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型。
3.上传.htaccess文件,可以帮我们实现:网页重定向,定义404错误,改变文件扩展名,运行/阻止特定用户访问某目录或者文件,配置默认文档。运行一个的时候,他会先去检测一下有没有.htaccess这个文件。如果有的话,就会先去访问这个.htacess文件,然后查看.htacess标签中是否存在我们要访问的文件。比如说在.htacess文件的标签中有04.jpg文件,他就会把文件的mime类型先转化为指定类型,然后再去执行。
4.文件流是指在计算机中读取或者写入文件的过程,data是默认方式
.htaccess内容为:
SetHandler application/x-httpd-php
application/x-httpd-php:php的mime类型
防御:
①二次渲染。对图片进行加工处理,比如对你上传的图片在进行一次截图
②重命名。对上传的文件图片重命名,方法之你访问你上传的图片
绕过:
①抓包修改文件的mime类型
②使用 php3,php4,php5,phtml,phps 等拓展名绕过,他们都是可以被当成普通的php函数进行识别的。
③修改文件的后缀名。在windows系统中,要是后缀名后面加上了一个点或者空格的话,就是会默认帮你删除掉的,这事windows中特有的。在文件上传的时候,可以在后面加上 点和空格 来实行绕过
④Windows文件流特性绕过,文件名后缀名改成09.php::$DATA。 php::$DATA
⑤大小写绕过
⑥双写绕过(后缀名直接被删除掉 )
⑦截断符%00的运用。上传路径名%00截断绕过。上传的文件名写成1.jpg, save_path改成../upload/1.php%00,最后保存下来的文件就是1.php。
这里和第一关不一样的提示,不是弹窗,有可能是后端验证
将Content-Type的内容改为:image/png,文件上床成功
编辑并且上床.htaccess文件
SetHandler application/x-httpd-php
然后再上传1.jpg文件就可以了。可以看到后后缀名为jpg的文件解析成立php
在文件后缀名后面加上 点空格点,就可以了。
①文件流绕过(就是后缀名绕过)
phpinfo.php::$data
②用点空格点绕过
①双写绕过
②点空格点绕过
直接上传普通的php文件发现可以上传,点开图片链接,发现php被删除掉了。看到被删除,第一反应双写绕过
直接在upload的path中写上php后缀的文件名加上截断符,上传的路径会拼接成/upload/1.php%00/1.jpg。但是此时由于截断符的存在,他会把后面的数据都截断掉,所以就会只剩下1.php。识别文件名的时候就是识别出文件名为1.php,然后包的请求体的内容自然也就会写在了1.php中。
①就是把截断符改成hex编码进行绕过,再1.php后面加上hex00
注意:
使用POST传地址,POST不会对里面的数据自动解码,需要使用hex(十六进制编码)加上00截断。因此在本关不可以使用%00,需要使用00。
②上传图片马
图片马的生成
copy normal.jpg /b + shell.php /a webshell.jpg
文件包含访问路径
http://127.0.0.1:82/include.php/?file=upload/2020230726052227.jpg
③修改文件头
http://127.0.0.1:82/include.php/?file=upload/5720230726053046.gif
本关使用了getimagesize()函数,尝试读取上传文件(图片)的大小,如果该函数能够成功读取上传文件的大小,就说明该文件是一个图片;如果不能成功读取,那么就说明该文件不是一张图片,是一个恶意文件。
有bug正常的图片也不行
①图片马
②gif文件头
①eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号
②·system() 输出并返回最后一行shell结果。可以将字符串执行成cmd的命令
③@:抑制报错,如果报错不会回显到前端
关于shell和webshell
shell实际上指的是一个接受由键盘输入的命令并将其传递给操作系统来执行的程序
Webshell:Webshell是黑客经常使用的一种恶意脚本,其目的是获得对服务器的执行操作权限,比如执行系统命令、窃取用户数据、删除web页面、修改主页等,其危害不言而喻。黑客通常利用常见的漏洞,如SQL注入、远程文件包含(RFI)、FTP,甚至使用跨站点脚本攻击(XSS)等方式作为社会工程攻击的一部分,最终达到控制网站服务器的目的。
①用get post request都可以,看后端用哪种方式来接收。有一些网站get是不行的
②post里面用来接收前端传递过来的参数,eval把传递过来的参数变成cmd命令执行