Web_php_include
源码如下:
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>
文件包含。
strstr(str1,str2) :函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
strstr可以用大小写绕过。
解法一:
cat这个文件,得到flag
方法二:
这里过滤了php://但还可以用别的,
返回文件路径,
$_SERVER[‘DOCUMENT_ROOT’]:这个值是网站的根目录设置成什么就是什么。
读出当前目录文件,再用file_get_contents就可以读到里面的内容了。
file_get_contents() 函数把整个文件读入一个字符串中。
i-got-id-200
打开题目浏览有三个链接,发现其中有一个可以进行上传。
而这里上传会将文件内容打印出来。
这里网页都是.pl文件,搜索发现是用perl编写的网页,
查了prel上传后台代码,
perl use strict; use warnings; use CGI;
my $cgi= CGI->new;
if ( $cgi->upload( 'file' ) ) { my $file= $cgi->param( 'file' );
while ( <$file> )
{ print "$_"; }}
param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的file变量中,我们传入一个argv文件那么Perl会将传入的参数作为文件名读出来。
利用:在上传的文件前加一个文件上传项argv。
ARGV是PERL默认用来接收参数的数组,不管脚本里有没有把它写出来,它始终是存在的。
猜测文件为flag,抓包构造,得到flag.
Website
发现一个登录界面,注册
点击getflag提示只有admin访问
只能尝试伪造admin了
抓包,发现
这里csrftoken为了防止跨站域请求伪造,有的网站请求中会加入这个验证,在登录及登录后续的操作都会让你携带csrftoken,问题在于csrftoken每次刷新界面都要发生变化,所以查到csrf生成的位置就是关键所在,有的网站会把csrftoken放在html代码中返回给前端,这种找起来会比较简单
这里csrftoken已经利用了,但username还是需要修改
分析几个常见后台发现有个test.php
和上面的username替换,发现admin的csrftoken
再去访问getflag