MD5碰撞

例如:

1
2
$password=md5($_POST['password']);
substr($password,0,6)==="c4d038";

对于这样的问题,传入的password值为多少才能使代码成立呢
这种就可以考虑写一个简单的Python脚本来实现md5弱碰撞(因为md5不可反向解码,实际是需要一个个试出来答案的),可以先从数字试起

1
2
3
4
5
6
7
8
9
import hashlib

def crack(pre):
for i in range(0, 999999):
if (hashlib.md5(str(i).encode("UTF-8")).hexdigest())[0:6] == str(pre):
print(i)
break

crack("c4d038")

运行后发现得出结果为114514

php的一些初级绕过

md5弱类型绕过

1
$a != $b && md5($a) == md5($b)

例如对于这样的a和b,我们可以选择传入数组绕过,但如果不允许传数组,可以选择找出两个数再md5加密后都为0e开头的即可(这样会被识别为科学记数法进而都得0)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675

所以构造a=QNKCDZO&b=s878926199a即可绕过

is_numeric()和intval()绕过

1
!is_numeric($_GET['key5']) && $_GET['key5'] > 2023

例如这样的key5,我们可以选择传数组利用php中数组类型比整形大的特点绕过

1
!is_numeric($c) && $c != 1024 && intval($c) == 1024

但对于这样的题里面的c就不能传数组,因为要求intval($c)等于一个整数,那么我们可以选择构造c=1024.5a这样的payload(利用此函数舍弃小数点部分的特性)

也可以选择传入一个0x开头的字符串,因为php中intval()函数中如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex)

正则绕过

1
!preg_match("/flag|system|pass|cat|ls/i",$code)

对于这样简单的黑名单过滤,可以选择参数逃逸绕过,构造这样的payload:

1
code=var_dump(file_get_contents($_POST['a']));&a=/flag

其中的var_dump()是为了让网页回显

此外还可以使用变量拼接的方法

strcmp()绕过

此函数无法比较数组可以考虑传数组绕过

Liunx常用命令

操作命令

1.
ls命令是列出目录内容的意思(List Directtory Contents)。运行它就是列出文件夹的内容,可能是文件也可能是文件夹。

ls -l命令以详情模式(long listing fashion)列出文件夹的内容。

ls /命令列出目录下的所有文件

ls -a命令会列出文件夹里的所有内容,包括以”.”开头的隐藏文件。

注意:在Linux中,文件以“.”开头就是隐藏文件,并且每个文件,文件夹,设备或者命令都是以文件对待。
2.
pwd 显示工作路径
3.
cd /home 进入 ‘/ home’ 目录’
cd … 返回上一级目录
cd …/… 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录

文件显示命令

1.
less:显示文件内容带分页;
2.
grep:在文件中查询内容,grep –n “查找内容” 文件名;

| [管道命令]:在linux和unix系统中 | 就是管道命令,把上一个命令的结果交给 | 的后面的命令进行处理。

例:grep –n “查找内容” 文件名 | more
3.
cat:把文件串连接后输出到屏幕或加 > fileName 到另一个档案。
4.
head:格式:head [-n|c num]fileName,说明:显示文件头部内容。没有参数时,显示最前10行。
5.
tail:格式:tail [-n|c num]fileName,说明:显示文件尾部内容。没有参数时,显示最后10行。
6.
cut:格式:cut -cnum1-num2 filename,说明:显示每行从开头算起第 num1 到 num2 的字符。

Liunx基础

二级目录

/bin

放置的是在单人维护模式下还能够被操作的指令,在/bin目录的指令可以被root与一般账号所使用
/boot

这个目录主要放置开机会用到的文件,包括linux核心文件以及开机选单与开机所需配置文件等。
/dev

在Linux系统上,任何装置与设备的接口设备都是以文件的形态存在于这个目录当中的。
/etc

系统的主要配置文件几乎都是放置在这个目录下,列如账号密码文件,各种服务的启始党等。
/home

这是系统默认的用户家目录
/lib

库文件目录
/media

/media目录底下放置的是可移除的装置,包括软盘光盘等
/opt

给第三方协力软件放置的目录。
/root

系统管理员的家目录
/sbin

为开机过程所需要的,里面包括了开机,修复,还原系统所需要的指令。
/srv

srv可以视为service的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。

三级目录

/usr/lib
包含各应用软件的函式库、目标文件(object file),以及不被一般使用者惯用的执行档或脚本(script)。

/usr/local
系统管理员在本机自行安装自己下载的软件(ldistribution默认提供者),建议安装到此目录,这样会比较便于管理。

/var/lib
程序本身执行的过程中,需要使用到的数据文件放置的目录

/var/log(重要)
登录文件放置的目录,里面比较重要的文件如/var/log/messages,/var/log/wtmp(记录登入者的信息)等。

/etc/init.d/
所有服务的预设启动 script 都是放在这里的

/etc/passwd

php反序列化

这个博客写的还不错https://blog.csdn.net/Hardworking666/article/details/122373938
再推荐一下这个视频里类和对象讲的很清楚(当复习一遍了)https://www.bilibili.com/video/BV1TH4y1U7tJ?p=5&vd_source=aa13d69224a955c223f4998b491b80fb