渗透测试CISP-PTE-系列学习笔记
第一章 渗透测试CISP-PTE:Web安全简介
第二章 渗透测试CISP-PTE:信息收集
第三章 渗透测试CISP-PTE:漏洞扫描
第四章 渗透测试CISP-PTE:HTTP请求流程
第五章 渗透测试CISP-PTE:SQL注入
第六章 渗透测试CISP-PTE:暴力破解
第七章 渗透测试CISP-PTE:XSS
第八章 渗透测试CISP-PTE:CSRF
第九章 渗透测试CISP-PTE:文件上传
前言
文件上传漏洞是一种常见的安全漏洞,指的是攻击者可以通过上传恶意文件来执行任意代码或获取系统权限。这种漏洞通常出现在Web应用程序中,攻击者利用漏洞可以上传包含恶意代码的文件,然后通过访问该文件来执行攻击。
一、文件上传漏洞成因
- 服务器配置不当(例如服务器PUT方法使用没有做好用户权限验证)
- 开源编辑器(CMS比如织梦)本身存在文件上传漏洞
- 本地文件上传限制绕过
- 过滤不严或被绕过
- 文件名解析漏洞导致文件执行
解析漏洞:指web服务器对http请求处理不当导致将非可执行的脚本\文件等当做可执行的脚本\文件等执行。该漏洞一般配合服务器的文件上传功能使用,以获取服务器的权限。 - 文件路径截断
针对以上漏洞均可以采用如下防护:将上传的文件限制到某一路径下,并再文件上传目录禁止脚本解析权限
二、绕过上传漏洞
1.客户端验证
JavaScript验证的绕过方法
- 浏览器禁用JS–about:config
- 使用浏览器插件(如FireBUG)删除检测文件后缀的JS代码,然后文件上传即可绕过
- 先把需要上传的文件的后缀改为允许上传的,绕过JS检查,再抓包,把后缀名还原即可上传成功。
2.服务端验证
2.1.HTTP请求头-Content-Type字段过滤
先上传一个符合条件的文件,BurpSuite监听,获取符合条件的Content-Type字段,然后将需要上传的文件上传,并用BurpSuite监听到对应的请求,将Content-Type字段更改给符合条件的值再重放即可
2.2.文件后缀过滤
- 可执行的文件脚本的后缀:
Php,php2,php3,php5,pht,phtml,asp,aspx,ascx,ashx,cer,jsp,jspx
- Apache是允许解析的文件后缀配置,例如在httpd.conf中,如果配置有如下代码,则能够解析php和phtml文件。
AddType application/x-httpd-php .php .phtml
2.2.1.如果服务器利用黑名单模式来过滤上传文件后缀
- 字符替换’’
如果针对指定字符替换为’',可使用双写来绕过 - 过滤大小写不敏感(.htaccess未过滤)
将文件后缀变成和黑名单不一致的即可 - 过滤大小写敏感(.htaccess未过滤)
可以采用任意一个不在黑名单范围内的后缀来实现绕过,先将需要上传的文件后缀修改为任意不在黑名单范围内的后缀,例如.app,并上传到服务器。
然后临时配置Apache服务器可解析的文件后缀,构造配置文件.htaccess(该文件可临时生效),内容如下:
<FilesMatch "app">
SetHandler application/x-httpd-php
</FilesMath>
- 未去除末尾空格/末尾点
利用Burpsuite将http请求中的文件后缀末尾增加空格/点(windows无法在后缀末尾增加空格和点) - 未去除字符串::$DATA(文件本身的类型)
绕过方式同空格和点 - 过滤多种字符时,注意其过滤顺序
字符拼接过滤
2.2.2.如果服务器利用白名单模式来过滤上传文件后缀
-
GET参数(URL)截断
php代码中若可绕过的输入点为GET参数,则在GET参数中构造想要的文件名并以%00/ 结束(%00在URL中时代表十六进制0x00,字符串的结束符00)
-
POST参数截断
php代码中若可绕过的输入点为Post参数(正文),则在Post参数中构造想要的文件名并以一个任意字符结束(由于Post参数无法直接输入字符串结束符00,需要在Burpsuite中更改文件名后的任意字符的十六进制为00)
-
用户指定文件重命名后的名称(将用户指定的文件名进行数组处理)
用户指定重命名文件名称的参数时save_name,将传入的save_name按照数组来处理 -
校验传入的type类型
-
取最后的一个元素校验文件后缀
-
取第一个元素和最后一个元素来重命名
构造可以绕过校验过滤
- 构造传入的content_type为image/jpeg
- 构造save_name数组包含2个元素,最后的一个元素为jpg:save_name[2]=‘jpg’
- 第一个元素为save_name[0]=‘rec.php’;第2个元素为save_name[1]=‘’
2.2.3.条件竞争-针对上传的文件存在判断顺序逻辑漏洞时(文件上传成功和后面的处理存在一定的时间差)
-
先存储到可访问路径下在判断是否文件后缀是否符合上传条件
通过上传一个可生成木马的木马,该木马被执行后会生成一个新的木马文件,且服务器不会对新生成的木马进行判断过滤
可生成木马的木马gen.php内容如下:
<?php
fwrite(fopen("shell.php","w"),'<?php @eval($_POST["com"]); ?>');
?>
//fopen(文件名,打开方式),返回一个文件对象
//fwrite(文件对象/指针,文件内容),向文件对象写入文件内容
注意:php语言中双引号和单引号的区别-双引号中的参数/函数会直接引用对应的值或返回值
$name='test'
echo 'hello $name' //输出内容hello $name echo "hello $name" //输出内容hello test
echo 'hello ${system("dir")}' //输出内容hello ${system("dir")}
echo "hello ${system('dir')}" //输出内容hello +system函数的返回值
然后通过Burpsuite的攻击器循环上传gen.php,并利用判断逻辑顺序问题循环get gen.php从而生成shell.php,攻击器中无payload参数需要替换,payload type选择Null payload,次数设置为5000,线程设置为5多线程
- 先判断是否文件后缀是否符合上传条件,然后把符合后缀的文件存储到可访问路径下,然后再重命名
将可生成木马的木马文件gen.php的文件名后添加符合上传条件且不会被Apache解析的后缀(例如gen.php.7z),通过Burpsuite的攻击器循环上传gen.php.7z,并利用判断逻辑顺序问题循环gen.php.7z从而生成shell.php,攻击器中无payload参数需要替换,payload type选择Null payload,次数设置为5000,线程设置为5多线程
注意:在Apache的解析顺序中,是从右向左开始解析文件后缀的,如果最右侧的扩展名不可识别,就继续往左判断,直到遇到可以解析的文件后缀为止。所以如果上传的文件名类似 1.php.xxxx,因为后缀XXXX不被识别,所以向左解析后缀php
三、文件上传漏洞利用
1.php漏洞利用webshell脚本构造
<?php
@eval($_POST['com']);
?>
其中:
@ 含义出现错误不输出
eval把参数当成php代码执行
$_POST/$_GET代表服务端收到的请求列表,可以为多个,获取key为com的value
2.脚本利用
2.1.手工利用:
发送针对上传成功的webshell脚本的Post请求,请求payload为:com=system("dir");
等执行命令
2.2.webshell工具利用-AntSword-蚁剑
打开AntSword工具,在数据管理模块的空白位置右键“添加数据”,填写对应webshell脚本的访问链接,链接密码为com,如下图所示。
填写成功后,在该条数据位置右键,即可利用webshell脚本进行各种操作如下图所示:
2.3.webshell工具利用-中国菜刀
中国菜刀的使用方法基本和AntSword一样,如下图所示
四、题库
关闭C:\phpstudy_pro\COM\phpstudy_pro.exe 软件:软件界面的功能关闭和软件退出
进入C:\upload-labs-env目录,先双击modify_path.bat,然后双击phpStudy.exe
点击启动,如下图所示,浏览器登录127.0.0.1
五、PHP语言函数
explode(分割符,待分割字符)
explode('.', 'rec.php') //返回值为['rec', 'php']
reset($file)//取$file数组中的第一个元素
current() - 返回数组中的当前元素的值。
end() - 将内部指针指向数组中的最后一个元素,并输出。
next() - 将内部指针指向数组中的下一个元素,并输出。
prev() - 将内部指针指向数组中的上一个元素,并输出。
each() - 返回当前元素的键名和键值,并将内部指针向前移动。
strrchr()-查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符,如果未找到返回 false
strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
总结
以上就是今天要讲的内容,本文仅仅简单介绍了文件上传漏洞成因、漏洞验证以及对应的典型漏洞利用案例等。后续将从文件包含、命令执行等环节进行详细介绍。