Read Something Useful 题解

首先观察界面


发现是通过点击获取不同的表情包,没有任何头绪,于是按F12进入开发者模式

发现
<!-- try to read index.php first! -->以及

1
2
3
4
 $file = $_GET['file'];
if(strpos($file, "emoji") !== false){
include($file.'.php');
}

根据提示要读取index.php,而在此处发现文件上传漏洞,可以在此处读取index.php

根据代码,要进入index.php首先要保证传入的value内容中有emoji,但是又要保证读入的内容为index.php,通过查阅资料发现可以通过伪协议来实现文件读取的功能。

通过伪协议构造payload构造write=emoji来达到不影响读取同时又有emoji的效果。

得到代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="R1esbyfe">
<meta name="keywords" content="Challenge12">
</head>
<body>
<div style="text-align: center">
<!-- try to read index.php first! -->
<h4>Try to click the button to enjoy my emoji!!!</h4>
<form action="index.php" method="get">
<input type="hidden" name="file" id="file" value="emoji">
<button type="submit">Click me</button>
<!-- You may find it is a little difficult to read other files, right :( -->
<!-- in index.php:

$file = $_GET['file'];
if(strpos($file, "emoji") !== false){
include($file.'.php');
}
-->
</form>
</div>
</body>
</html>

<?php
include('blacklist.php');

//try to read findme.php to find my secrets :D

$file = $_GET['file'];

if(isset($file)){
foreach ($blacklist as $blacklistedWord) {
if (preg_match('/(?i)' . $blacklistedWord . '/', $file)) {
echo "<center>nonono</center>";
return;
}
}

if(strpos($file, "emoji") !== false){
include($file.'.php');
}else{
echo "<center>No,You need to find another way to find my secret :(</center>";
return;
}
}
?>

发现try to read findme.php to find my secrets :D
用相同的办法获取代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$flag = $_ENV['FLAG'];

$lucky = $_GET['luckynumber'];
$context = $_POST['context'];

if(isset($lucky)&&isset($context)){
if(is_numeric($lucky)){
die("Not a number");
}elseif($lucky == 777){
if(file_get_contents($context,'r') === "humanoid"){
echo "Congratulations, the flag is: ".$flag;
}else{
die("Try again");
}
}
}else{
return;
}

观察代码,发现要发送get请求传入lucky,发送post请求传入context,
首先二者要同时进行,并且$lucky不能为数字并且是777,$context要有humanoid,才可以查看flag

我们发送get请求需要用%00绕过,使他不被判定为数字。

发送post请求要求文件获取内容为humanoid
我们利用伪协议构造数据流,得到flag