20200406学习笔记

今天又睡了老久。。晚上整理一下

其实今天整理这个一方面是不会,另一方面是看到心仪大学夏令营面试有问过这个问题(生日攻击),或许可能不会再问了,但知道总比不知道强!
一下内容除webshell和php外皆为生日攻击衍生出来的问题(对我来说没掌握的)
今日内容:MD5碰撞√,生日攻击√,哈希√,彩虹表√,盐√,webshell本质,php某方法√,幻数√,内存存储方式√
参考:
https://www.zhihu.com/question/20820286
https://zhuanlan.zhihu.com/p/37165658
https://blog.csdn.net/M_mamba/article/details/103405022
https://zhuanlan.zhihu.com/p/43994479
https://www.jianshu.com/p/732d9d960411
https://blog.csdn.net/blade2001/article/details/6341078

hash

哈希算法也成为散列算法,可以通过哈希算法单向求得某值。理想情况下,可以正向快速求得该值,并且不能通过该值还原出原数据;原数据即使变化很小,得到的数据变化也比较大。
哈希算法可用来验证传输过程中数据是否被篡改。
hash算法不理想的情况:存在冲突。即多个原始数据对应一个目标值:h(a)=h(b)=k。在数学上函数必然可逆,且hash函数值域有限,比如128bitMD5的值域为2128=1632(第一次我竟然算错了2333 ,2exp28和32exp16怎么也对不上。我太菜了)
哈希算法常见的有:MD5 SHA-1(Secure Hash Algorithm,SHA) SHA-2* SHA512。目前MD5,SHA-1已经不安全。
这样可能会导致一些问题,比如在分发session的时候如果用hash计算,如果两用户session值相同的话,会导致越权操作。
MD5的长度为128bit,sha1长度为160bit,sha256为256bit,sha512为512bit。

hash冲突处理方法

MD5算出来啥就是啥,不知道是不是冲突,此处讨论的冲突是存放的时候的冲突处理!

开放定址法

线性探测法
线性补偿探测法
线性随机法

拉链法

多次hash

设立公共溢出区

幻数与内存存储方式

其实内存存储方式是大一学的。。还是比较感谢王老师。。虽然老念ppt,但是问问题还是很热心的帮我解决。谢谢谢谢
幻数就是常用的数。MD5的四个幻数ABCD分别是(hex):
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。
大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。
比如用大端字节序存0x01234567的话就是 01 23 45 67
小端的话就是 67 45 23 01

生日攻击&&彩虹表&&salt

生日问题:一个班级需要有多少人,才能保证每个同学的生日都不一样?
答案很出人意料。如果至少两个同学生日相同的概率不超过5%,那么这个班只能有7个人。事实上,一个23人的班级有50%的概率,至少两个同学生日相同;50人班级有97%的概率,70人的班级则是99.9%的概率。
由该问题引出的是取值空间与计算哈希值次数和碰撞概率的关系。数学推导我这就不写了。我数学比较菜,当时看了一会才看懂咋回事。。对不起孙老师
取值空间为365,70个人中至少两人生日重复的概率为99%。365就是取值空间,70就是哈希计算次数。
由生日攻击与哈希碰撞导出的问题是破解哈希值以及如何防御哈希破解。

哈希值破解

由于哈希函数是单向的,所以破解方式照理来说应该是暴力破解或者手动算字典的哈希值,建立一个一一对应的关系然后查表。
对应方法:1.暴力破解2.字典3.彩虹表
这里重点说一下彩虹表,彩虹表并不是单纯的原文-密文一一对应的形式。
彩虹表前身–散列链
设加密函数为H(X),则散列链存在一个约简函数R(X),其定义域和值域与H(X)相反。
对于散列链和彩虹表详细的计算过程我还没看太明白,请教完老师再来写。
现在已知的是彩虹表是一种中和的方式来破解哈希值。
当k越大时,破解时间就越长,但彩虹表所占用的空间就越小;
相反,k越小时,彩虹表本身就越大,相应的破解时间就越短。

加salt抵抗彩虹表

salt可以是一串随机数。
假设原文是abc,
不加salt加密后的数据为 DEF,加salt加密后的数据为GKD
彩虹表还原出DEF的概率相对加salt后的概率相对大一些。因为对GKD还原后的数据大概率就不是原数据abc了。
应用场景:
用户注册时:hash(password+salt)->DB,salt->DB
用户登录时 if(hash_in_db==hash(input_username+salt))
return true;

php file_get_contents()

file_get_contents()方法把整个文件读入到字符串中。

webshell

webshell是什么,shell是什么?
shell是用户与操作系统交互的工具、平台。webshell就是基于web的shell,可以用于网站管理等功能。
常见的webshell就是命令执行,比如php的 将这句话写入以PHP为后端的网站后,通过对该文件传参数www.tst.com/1.php?cmd=whoami
相当于在shell中执行whoami。当然,也可以用一些webshell管理工具方便操作,比如菜刀,蚁剑。
asp一句话: <%eval request(“x”)%> <%execute request(“MH”)%>
jsp一句话:<% Runtime.getRuntime().exec(request.getParameter(“shell”)); %>