跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

精选回复

发布于

1。射击场部署

123git clone https://github.com/sqlsec/upload-labs-docker.gitcd upload-labs-dockerdocker compose up -d 共13级,端口号为30001-30013。默认情况下,Docker 不遵循ufw 防火墙规则。如果不希望端口暴露于0.0.0.0,可以手动更改docker-compose.yml文件监听127.0.0.1上的各个端口,然后配合nginx反向代理到特定IP。或者使用ufw-docker项目解决docker端口不遵循ufw规则的问题:https://github.com/chaifeng/ufw-docker#%E8%A7%A3%E5%86%B3-ufw-%E5%92%8C-docker-%E7%9A%84%E9%97%AE%E9%A2%98

2。 WP

2.1。前端JS验证

alt text

2.1.1。禁用浏览器JS

查看前端网页源码可以发现,通过js进行文件验证,可以通过禁用浏览器js来绕过。

在开发者工具中使用快捷键ctrl+shift+p,输入javascript,在选项中选择禁用JavaScript:

alt text

然后您可以上传任何文件:

alt text

2.1.2。浏览器JS调试

一个很小众的方法,在检测函数中打断点,然后修改变量值来绕过验证。

首先,在定义允许用户上传的文件类型的白名单变量后面的行(第40 行)中添加一个断点:

alt text

然后选择要上传的php文件。当浏览器到达断点(第40行)时,它会自动暂停。此时,白名单变量的值为'.jpg'、'.png'、'.gif'、'.jpeg'。进入控制台,将whitelist的值重新赋值为'.php',然后按F8(或者点击继续按钮)继续执行,即可成功上传php文件:

alt text

2.1.3。 BP 更改文件格式

将shell.php文件后缀改为jpg(前端验证通过),然后使用BP抓包,将文件格式改回php:

alt text

发布后即可上传成功。

2.1.4。 BP 更改退货套餐

刷新页面(重新请求index.php),使用BP捕获请求包,右键选择拦截index.php请求的响应包:

alt text

然后释放请求包,并在返回的响应包中添加php文件格式:

alt text

查看网页源代码,可以发现php格式已经成功添加:

alt text

继续上传php文件就成功了。

注意:如果前端验证的js代码是从外部导入的(不是直接在index.php中定义),那么需要编辑BP的请求拦截规则,删除第一条规则中过滤的js扩展。这样才能拦截到js文件的请求。alt text

2.2。 .htaccess绕过

alt text

直接上传php文件会失败。检查网页的源代码。没有前端验证,说明是后端验证。然后将shell.php文件的后缀名改为jpg再使用bp抓包改回php格式就会导致上传失败。直接上传shell.jpg可以成功,但文件不会被解析。

分析后端源码,我们可以发现后端是采用黑名单模式进行验证的,即黑名单中的所有文件格式都会被禁止上传:

alt text

但仔细观察,可以发现黑名单中并没有.htaccess文件。htaccess 文件是Apache 服务器特有的配置文件。它默认启用并用于配置Apache 服务器。具体使用方法可以参考这篇文章:https://xz.aliyun.com/t/8267?time__1311=n4%2BxnD0Dc7exyDjxYqGNWP4IrVnuYA5GCzReD

其中,我们可以使用的.htaccess文件指令是AddHandler(也可以使用SetHandler指令,但是稍微长一些,具体用法可以参考刚才提到的文章)。您可以将特定的文件格式绑定到特定的MIME 类型。例如,将.jpg文件绑定到application/x-httpd-php,这样Apache服务器解析.jpg文件时,就会将其解析为php文件。

Apache全局默认文件扩展名与MIME类型的映射关系可以在/etc/mime.types文件中查看:

alt text

可以看到与PHP相关的文件格式有多种,其中有两种没有在黑名单中定义:

12#application/x-httpd-php-source phps#application/x-httpd-php3-preprocessed php3p,不过这两种格式,一种是php源代码文件,一种是php3预编译文件。它们都不会被解析成php脚本文件来执行,所以上传是没有用的。不过,你可以上传一个.htaccess文件,将黑名单中未定义的格式绑定到application/x-httpd-php,这样Apache服务器解析这些格式的文件时,就会被解析为php脚本:

.htaccess

12# 将.phps .php3p .png .jpg .gif 视为PHP 文件并解析AddType application/x-httpd-php .phps .php3p .png .jpg .gif。上传.htaccess文件后,上传shell.png文件即可成功执行:

alt text

注意:本题如果不分析源码,需要对各个文件格式一一进行测试:htaccess、php、php3、php4、phtml.htaccess文件即使上传成功也可能不生效,因为这个功能是可以禁用的。详情请参考:https://www.cnblogs.com/johnhery/p/9831635.html

2.3。 MIME 检查

alt text

无法上传php 文件。将php格式改为jpg格式后,可以上传,但是没有解析。查看后端源码发现只有MIME验证:

alt text

1234image/jpegimage/pngimage/gifimage/jpg 上传shell.php文件,bp抓包并将MIME类型从application/octet-stream更改为image/jpeg,即可上传成功:

alt text

或者上传shell.jpg文件,捕获bp数据包,将文件格式改回php,还是可以上传成功的。原因是浏览器默认会根据文件格式设置MIME类型。 jpg格式与满足后端要求的MIME类型(image/jpeg)相匹配,因此满足上传要求。将格式改为php的目的是为了让后端解析成php文件并执行php代码。

2.4。文件头+MIME检查

alt text

上传php文件失败,将文件格式改为jpg也失败。说明后端不验证mime类型或者除了mime类型之外还有其他验证。查看后端源码发现是mime验证+文件头验证:

alt text

允许的mime 类型和文件头如下:

12345678910MIME类型:image/jpegimage/jpgimage/pngimage/gif 文件头及对应文件格式:89504E47 -- .pngFFD8FFE0 -- .jpg47494638 -- .gif必须同时满足mime类型和文件头要求才能成功上传。上传shell.php文件,捕获bp数据包并将mime类型更改为image/jpeg,然后在十六进制编辑器中插入89504E47:

alt text

或者可以通过在请求体前面写GIF89a(GIF8也可以,对应47494638)来绕过:

alt text

发布后即可上传成功:

alt text

alt text

图马(复制pic.png/b + shell.php/a shell.png)也可以绕过,只需抓包并修改文件格式即可:

alt text

2.5。文件名关键字去除

alt text

上传shell.php文件可以成功,但是上传的文件被重命名为shell。结果无法解析:

alt text

猜测是后端删除了文件名中的关键字php(用空字符替换)并试图绕过字符串双写。

将shell.php 文件的名称更改为shell.pphphp。上传后,去掉文件名中的关键字php,剩下的shell.php被解析成php文件执行:

alt text

2.6。文件名关键字替换

alt text

上传shell.php文件可以成功,但是上传的文件被重命名为shell。结果就是无法解析。尝试过双写字符串绕过,上传的文件名改为shell.p hp。 (hp前面有一个空格),但还是无法解析:

alt text

说明后端并没有直接去掉php这个关键字,而是用空格替换了php。查看问题给出的源码可以知道,后端使用的字符串替换函数是str_replace()函数。与上一题的str_ireplace()函数相比,该函数严格区分大小写,因此php和php不会被视为同一个字符串,而且PHP也不在黑名单中,所以可以修改shell.php为shell.PHP来绕过:

alt text

注意:仅在Windows 系统上,大写PHP 格式将被视为与小写php 格式相同的MIME(application/x-httpd-php)进行解析和处理。在Linux系统上,大写的PHP格式会被当作普通的纯文本文件(text/plain)来处理。因此,如果出题环境是Linux系统,这个方法就行不通了。不过这道题特别强调了手动修改Windows的特性(不区分大小写),这样上传的PHP文件才能被解析并执行。如果无法执行,需要手动进入目标机器,下载vim,然后编辑/etc/apache2/sites-enabled/app.conf文件,在IfModule块中添加AddType application/x-httpd-php .PHP,然后重启apache服务(apache2ctl restart)才能生效。

2.7。 %00截断路径

alt text

上传shell.php 失败。重命名为shell.jpg可以上传成功,但是不会被解析。同时可以观察到,提交文件后,url地址会显示文件上传路径:

alt text

上传成功后的shell.jpg文件也会被重命名:

alt text

然后就可以通过修改上传路径来绕过它。上传shell.jpg文件,bp抓包并在请求路径后添加1.php%00,然后释放即可上传成功:

alt text

访问上传的文件会提示Not Found:

alt text

原因是1.php%00后面的%00被URL解码为空字符(标识字符串结束),导致路径后面应该拼接的xxx.jpg被截断,实际路径变成了upload/1.php。访问该路径可以成功解析:

alt text

注意:%00截断路径限制PHP版本为5.3.4以下,并且需要在php.ini中magic_quotes_gpc=Off,否则不会成功。更多分析,建议阅读这篇文章:http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88%AA%E6%96%AD%E5%88%86%E6%9E%90.html

2.8。截断包含空字符的路径

alt text

此级别与上一级别类似。上传的shell.jpg也被重命名,不会被解析,但是URL中不会显示上传路径,所以需要通过bp抓包进行分析。

上传shell.jpg文件,用bp抓包。可以看到请求表单中有一个名为save_path的字段,其值为./upload/:

alt text

该字段的值是文件上传路径,因此可以通过修改该字段的值来绕过。在./upload/后面添加%00,然后选择并右键单击它以对其进行URL编码,使其成为空字符:

alt text

这里之所以需要手动进行URL编码,是因为HTTP请求体中的数据与请求头中的URL查询参数不同,不会自动进行URL编码。

然后释放请求,在浏览器中访问1.php即可成功解析:

alt text

2.9。黑名单绕过

alt text

上传php文件会提示不支持该格式的后缀,其他不支持的后缀也会显示出来,包括asp aspx php jsp:

alt text

如果只显示这4种脚本格式,没有提及其他格式,则说明使用了黑名单过滤模式。只要脚本格式不在黑名单中,所有脚本格式都可以上传。

除了php之外,可以解析为php脚本的格式还包括:phtml、pht、php3、php4、php5

alt text

上传以上格式的文件都可以成功解析:

alt text

2.10。条件竞争漏洞

alt text

上传shell.php文件会提示只允许上传.jpg|.png|.gif类型文件,说明是白名单过滤模式。分析问题中给出的后端源码可以发现,后端首先将上传的文件保存到UPLOAD_PATH中,然后判断文件后缀是否在白名单中。如果在白名单中,该文件将被保留并重命名,否则该文件将被删除:

alt text

因为在删除文件之前,后端会先检查文件后缀是否在白名单中,而删除文件之前的检查需要时间(很短)。可以利用这个时间差,快速上传大量的webshell文件,并在删除文件之前快速访问该文件,以便执行该文件。 webshell的代码如下:

1?php phpinfo(); fputs(fopen('1.php','w'),'?php phpinfo(); eval($_REQUEST[1]);');只要访问该文件,就会显示phpinfo信息,并在当前目录生成一个名为1.php的文件,内容为?php phpinfo();评估($_REQUEST[1]);

为了快速上传并访问webshell,需要使用bp的Intruder模块。首先上传webshell并用bp抓包,右键发送给Intruder:

alt text

然后进入Intruder模块,清除payload,将payload类型设置为Null Payload,然后在payload配置中选择无限重复,最后点击开始攻击:

alt text

alt text

攻击过程中,webshell会不断上传。这时候如果进入目标机器(docker容器),执行while true;做LS;睡觉1;在/var/www/app/upload/目录中执行命令,您可能会看到shell.php 文件正在上传。停止此命令后,该文件将消失:

alt text

然后在浏览器中访问http://目标机IP:30010/upload/shell.php并使用bp抓包,右键发送到Intruder模块,清除payload,将payload类型设置为Null Payload,然后在payload配置中选择无限重复,最后点击开始攻击。

攻击一段时间后,在攻击面板中选择按长度降序排列,即可查看最大返回包渲染的页面。如果显示phpinfo信息,则说明成功请求shell.php文件,并成功生成1.php文件:

alt text

进入浏览器访问http://目标无人机IP:30010/upload/1.php,成功解析1.php文件:

alt text

请注意,我在上面的演示中使用的是新版本的burpsuite(蓝色标志)。老版本的burpsuite(黄色标志)的界面有些不同。具体使用请参考这篇文章:https://cloud.tencent.com/developer/article/1933685

2.11。特定块逃避二次渲染

alt text

上传php文件会提示该文件不是标准图片格式。将文件格式重命名为jpg也无法上传:

alt text

点击查看提示按钮后,地址栏中会出现文件本地包含:

alt text

然后就可以上传图片马,然后文件就包含了图片马,从而执行图片马中的php代码。

上传使用复制命令创建的图像mkbk.jpg:

alt text

然后文件中包含了图片,发现写入图片的phpinfo()函数并没有被执行:

alt text

下载上传的马图片,并在上传前与图片马比较文件属性。可以发现,上传的图马的尺寸比上传前的图马的尺寸要小,说明上传的图马经过了两次渲染,并且在二次渲染的过程中,附着在图片上的PHP代码被删除了,所以无法执行:

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。