目录
Crypto
MD5
Url编码
看我回旋踢
web
[极客大挑战 2019]BuyFlag
[BJDCTF2020]Easy MD5
Crypto
MD5
1.下载文件
2.md5在线解密
3.外包flag
Url编码
使用url在线解码
看我回旋踢
下载,得到这串字符,搜一下synt编码
看到使用凯撒密码,位移为13,在线解码得到flag
凯撒密码是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
根据偏移量的不同,还存在若干特定的恺撒密码名称:
偏移量为10:Avocat(A→K)
偏移量为13:rot13
偏移量为-5:Cassis (K 6)
偏移量为-6:Cassette (K 7)
web
[极客大挑战 2019]BuyFlag
1.打开menu看看
2.打开payflag。买flag的条件是CUIT的学生,有正确的密码
3.查看源代码,得到提示:使用post传参password要弱等于404。
函数is_numeric()
判断其中的参数是数字还是其他,如果是数字则判断为真,否则为假
使用hackbar传参,password=404a
4.提示只有cuit的学生可以买flag。使用bp抓包
关于用户的提示只有在cookie:user=0
,那我们将其换为1
试试
看到提示的身份及密码正确,黑客,买flag
,那我们再根据提示,支付money
,使用post
传参password=404a&money=100000000
提示number lenth太长了
可以看到php的版本很低,有两种方法可以绕过。数组或者科学计数法
数组
strcmp函数
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
可知,传入的期望类型是字符串类型的数据,但是如果传入非字符串类型的数据的时候,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0。也就是说虽然报了错,但却判定其相等
科学计数法
1000000000=1e9
[BJDCTF2020]Easy MD5
1.打开环境,输入什么都没用回显
2.看了一下源代码,没发现什么
3.使用bp抓包。看到hint里给了一个sql语句,我们需要输入一个密码但是我们并不知道正确密码。这里需要利用md5绕过
md5()函数
我们只需要把语句拼接为select * from 'admin' where password=‘xxx’ or ‘1就可以绕过这个语句
那当md5($pass,true)为true时,返回的是16位原始二进制格式的字符串,所以我们只需知道哪些字符串返回的是16位原始二进制。那么谁的MD5值可以是这么个东西呢,查了一下有 ffifdyop。
绕过原理:
ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 ’ or ‘6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是 select * from ‘admin’ where password=’’ or ‘6xxxxx’,等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。
所以把这个值写进输入框中,回显:
5. 查看页面源代码
代码审计:get传参两个参数a和b,要求a不等于b并且a和b的MD5值要相同
可以MD5碰撞(MD5值以0e开头),也可以用php数组绕过
(1)PHP数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false使条件成立
/levels91.php?a[]=1&b[]=2 //a不等于b
(2)MD5碰撞
s878926199a //原始字符串
0e545993274517709034328855841020 //md5值
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
/levels91.php?a=s878926199a&b=s155964671a6.代码审计:post传参两个参数,要求param1强不等于param2并且param1和param2的MD5值要强相同
强类型比较,那就不能用md5碰撞了,只能用继续数组绕过,我们POST数据:
param1[]=1¶m2[]=2
得到flag