[BSidesCF 2019]SVGMagic(xxe)

SVG是一种用XML定义的语言,SVG图形是可交互的和动态的,可以在SVG文件中嵌入动画元素或通过脚本来定义动画。

也就是说SVG是个XML,我们就能想到xxe

详解:https://www.freebuf.com/vuls/175451.html

我们知道,XML被设计用于传输和存储数据,然后这个漏洞就是利用了,应用程序在解析XML输入时,没有禁止外部实体的加载。
就拿下面的这个来说

xxe

[极客大挑战 2020]Greatphp(php内置类)

我们审计代码

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
<?php
error_reporting(0);
class SYCLOVER {
public $syc;
public $lover;

public function __wakeup(){
if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){
if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){
eval($this->syc);
} else {
die("Try Hard !!");
}

}
}
}

if (isset($_GET['great'])){
unserialize($_GET['great']);
} else {
highlight_file(__FILE__);
}

?>

一般来说,我们要绕过if语句的md5和sh1是用数组绕过的,但由于还要eval传递的值,所以我们就不能用数组绕过

所以,我们考虑php中的内置类,也就是原生类

php特性

[CSAWQual 2019]Web_Unagi(xxe)

打开页面,我们在upload模块里发现一个here链接

我们点击,提示了xml格式,我们可以猜测,这道题是xxe漏洞

image-20240724200440973

我们构造xml

xxe

[MRCTF2020]Ezaudit

首先我们进行目录扫描,发现www.zip可以下载到源码

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
<?php 
header('Content-type:text/html; charset=utf-8');
error_reporting(0);
if(isset($_POST['login'])){
$username = $_POST['username'];
$password = $_POST['password'];
$Private_key = $_POST['Private_key'];
if (($username == '') || ($password == '') ||($Private_key == '')) {
// 若为空,视为未填写,提示错误,并3秒后返回登录界面
header('refresh:2; url=login.html');
echo "用户名、密码、密钥不能为空啦,crispr会让你在2秒后跳转到登录界面的!";
exit;
}
else if($Private_key != '*************' )
{
header('refresh:2; url=login.html');
echo "假密钥,咋会让你登录?crispr会让你在2秒后跳转到登录界面的!";
exit;
}

else{
if($Private_key === '************'){
$getuser = "SELECT flag FROM user WHERE username= 'crispr' AND password = '$password'".';';
$link=mysql_connect("localhost","root","root");
mysql_select_db("test",$link);
$result = mysql_query($getuser);
while($row=mysql_fetch_assoc($result)){
echo "<tr><td>".$row["username"]."</td><td>".$row["flag"]."</td><td>";
}
}
}

}
// genarate public_key
function public_key($length = 16) {
$strings1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$public_key = '';
for ( $i = 0; $i < $length; $i++ )
$public_key .= substr($strings1, mt_rand(0, strlen($strings1) - 1), 1);
return $public_key;
}

//genarate private_key
function private_key($length = 12) {
$strings2 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$private_key = '';
for ( $i = 0; $i < $length; $i++ )
$private_key .= substr($strings2, mt_rand(0, strlen($strings2) - 1), 1);
return $private_key;
}
$Public_key = public_key();
//$Public_key = KVQP0LdJKRaV3n9D how to get crispr's private_key???

通过审计代码,我们发现关键点一步是求出私钥,由于生成公钥使用的是mt_seed,即伪随机函数,我们只要通过公钥获取到种子值就能得到私钥

我们使用php_mt_seed这个脚本

我们先处理公钥数据成脚本需要的数据格式

题解

EasyBypass

我们进行代码审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

highlight_file(__FILE__);

$comm1 = $_GET['comm1'];
$comm2 = $_GET['comm2'];


if(preg_match("/\'|\`|\\|\*|\n|\t|\xA0|\r|\{|\}|\(|\)|<|\&[^\d]|@|\||tail|bin|less|more|string|nl|pwd|cat|sh|flag|find|ls|grep|echo|w/is", $comm1))
$comm1 = "";
if(preg_match("/\'|\"|;|,|\`|\*|\\|\n|\t|\r|\xA0|\{|\}|\(|\)|<|\&[^\d]|@|\||ls|\||tail|more|cat|string|bin|less||tac|sh|flag|find|grep|echo|w/is", $comm2))
$comm2 = "";

$flag = "#flag in /flag";

$comm1 = '"' . $comm1 . '"';
$comm2 = '"' . $comm2 . '"';

$cmd = "file $comm1 $comm2";
system($cmd);
?>

代码对comm1和comm2进行正则匹配,再执行命令

我们需要做的就是绕过正则匹配和执行想要的命令

题解

[极客大挑战 2020]Roamphp1-Welcome(405报错)

我们打开页面,发现提示该页面无法正常运作(我还以为我网络出问题了呢)

image-20240723175809368

经过查询,我们发现是405报错,405的报错原因是由于请求方法不对,我们对页面进行抓包

题解

[WMCTF2020]Make PHP Great Again(require_once特性)

打开页面,进行代码审计

1
2
3
4
5
6
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
require_once $_GET['file'];
}

我们要了解什么是require_once

require_once 表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

由于 require_once 包含的软链接层数较多时 once 的 hash 匹配会直接失效造成重复包含。

php特性

[b01lers2020]Life on Mars(sql注入)

我们打开页面,发现啥信息都没有,我们随便点击一个地名抓包看看

image-20240715203732986

我们访问/query?search=amazonis_planitia

image-20240715203901604

我们进行sql注入

sql注入

[SUCTF 2018]GetShell(无字母数字rce)

我们打开页面源码,发现源码里有个链接

image-20240715194012415

我们点击后跳转到了新的页面,并发现了一串代码

rce