htaccess的使用方法,首先这个是用于文件上传时用的,当图片码上传成功,然后改文件后缀时行不通的时候,可以尝试的方法。
首先呢,这个是得先上传一个图片,然后再把图片码里面的内容删掉,换成htaccess的内容,文件名也要改成.htaccess。
例子:[MRCTF2020]你传你🐎呢
一句话木马上传成功之后,就把一句话木马删掉,换成htaccess里面的内容,然后上传,上传成功后访问原来上传图片的网址就行了。
访问原来上传图片的网站用蚁剑连就可以拿到flag了。
[GXYCTF2019]BabyUpload
新类型的htaccess的题目,过滤了png,只能用jpg,而且jpg的图片码还不行,必须得后缀为jpg,里面的内容为一句话木马,不能包含图片的内容。
然后其他过程和上面的htaccess的操作一样,先上传了一个后缀为jpg的一句话木马,然后在修改里面的内容和文件名,最后访问刚开始上传的jpg图片的上传地址就行,这道题和上面那道题很像,都是图片码用不了,只能直接上传后缀为jpg or png的一句话木马。
目录
2. .user.ini
应用场景
-
服务器脚本语言为PHP,并且使用CGI/FastCGI模式,php版本>5.3.0
-
上传目录下要有可执行的php文件
.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解析。
例子: [SUCTF 2019]CheckIn
先上传了个图片码(这道题把<?过滤了,得换另一种形式的一句话木马传上去)。
上传成功后,就把里面的内容删掉,换成.user.ini里的内容,因为这道题里面有个检测文件类型的函数,就不能干上传.user.ini,得伪造上传,就把.user.ini变成一个图片的格式来上传。
伪造上传成功,直接读
uploads/c47b21fcf8f0bc8b3920541abd8024fd
因为.user.ini的特殊性,后面不需要加文件的名字,这就是和.htaccess的差别
然后用蚁剑连接,就可以拿到flag了。
以上就是htaccess和user.ini的用法,在图片码不可用的时候就用这两种的其中一种,.htaccess优先,其次到user.ini