此篇其实与CTF入门_MD5相等有极大相似之处,但是又有些许不一样。
1. 获取源码
首先查看网页源码,发现注释处有猫腻。
<--index.phps-->
//于是进行访问下载
//phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码。
下载后得到源码:
<?php
error_reporting(0);
$flag = '********';
if (isset($_GET['name']) and isset($_GET['password'])){
if ($_GET['name'] == $_GET['password'])
print 'name and password must be diffirent';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die($flag);
else print 'invalid password';
}
?>
2. 源码分析
error_reporting(0);
关闭PHP的所有报错
if (isset( G E T [ ′ n a m e ′ ] ) a n d i s s e t ( _GET['name']) and isset( GET[′name′])andisset(_GET[‘password’]))
若name与password的Get传参都存在,则返回True,往下执行。
,否则返回false跳出判断
//isset — 检测变量是否已设置并且非 NULL
若一次传入多个参数,以逗号连接,遇到null的参数就会停止传参。
if ($_GET[‘name’] == $_GET[‘password’])
print ‘name and password must be diffirent’;
若name与password相等。则输出必须不同
(sha1( G E T [ ′ n a m e ′ ] ) = = = s h a 1 ( _GET['name']) === sha1( GET[′name′])===sha1(_GET[‘password’]))
die($flag);
此处若name与password的传参,sha1运算后相等则,输出flag
//此处注意与MD5弱类型绕过的不同点!===不能再进行弱类型绕过
//sha1无法对数组进行处理,false===false,推倒为True
0x00 扩展
1. Hash与MD5的关系
Hash与MD5实际上都是单向加密算法。
Hash算法包括了MD5,sha1,sha256等多种加密算法。此题中出现的是sha1算法。
特点
MD5 算法的哈希是32位16进制数 。
SHA-256是64位16进制数。
//对admin分别进行MD5、sha256运算
MD5:21232f297a57a5a743894a0e4a801fc3
SHA256:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
2.公开密钥加密(非对称加密)
安全性需基于数学原理。(单向函数——整数分解)
[RSA算法]
数字签名:发送者拿自己的私钥加密,接收者拿公钥解密,确保发送人。
加密通信:发送者拿接收者的公钥加密,接收者拿自己的私钥进行解密。(公钥被截取无碍,因为需要私钥才能进行解密)
3.sha1算法无法对数组进行处理
对于hash算法,可以加盐,避免被撞库,非加盐可通过彩虹表进行解密。