CTF 类型比较
第一种情况,md5弱类型比较
if(md5($_GET['a'])==md5($_GET['b']))
{
var_dump($flag);
}
因为是if的判断条件是两个数弱类型相等,就可以利用hash比较缺陷去绕过
比如
var_dump("0e12345"=="0e66666");//true
var_dump(md5('240610708')==md5('QNKCDZ0'));//true
也就是只要两个数的md5加密后的值以0e开头就可以绕过,因为php在进行弱类型比较(即==)时,会现转换字符串的类型,在进行比较,而在比较是因为两个数都是以0e开头会被认为是科学计数法,0e后面加任何数在科学计数法中都是0,所以两数相等,在进行严格比较(===)时才会先判断字符串类型是否相等,在比较。
想这样特殊的md5值还有
php >QLTHNDT:0e405967825401955372549139051580 >QNKCDZO:0e830400451993494058024219903391 >PJNPDWY:0e291529052894702774557631701704 >NWWKITQ:0e763082070976038347657360817689 >NOOPCJF:0e818888003657176127862245791911 >MMHUWUV:0e701732711630150438129209816536 >MAUXXQC:0e478478466848439040434801845361 >
第二种情况,md5强类型比较
if(md5((string)$_GET['a'])===md5((string)$_GET['b']))
{
var_dump($flag);
}
此时两个md5后的值采用严格比较,没有规定字符串如果这个时候传入的是数组不是字符串,可以利用md5()函数的缺陷进行绕过
var_dump(md5([1,2,3])==md5([4,5,6]));//true
var_dump(md5($_GET['a'])==md5($_GET['b']));
?a[]=1&b[]=1//true
md5()函数的描述是string md5(string str[,boolstr[,bool raw_output=false])
md5中需要的是一个string参数,但是当你传入一个array(数组)是,md5()是不会报错的,只是无法求出array的md5的值,这样就会导致任意的2个array的md5的值都会相等
第一种情况也可以使用弱类型绕过
第三种情况,md5碰撞
if($_GET['a']!==$_GET['b'] && md5($_GET['a'])===md5($_GET['b']))
{
echo 'ok';
}
真实md5碰撞,因为此时不能输入数组了,只能输入字符串
a=Mh\ rw{roVJ=x>{ (KnKU_BuIgmU]`_&b=Mh\ rw{roVJ=x>{(KnKU_BuIgm]`_
第四种情况,sql语句
query="SELECT∗FROMflagWHEREpassword=′".md5(query = "SELECT * FROM flag WHERE password = '" . md5(_GET["hash4"],true) . "'";
这需要一个极其特殊的md5的值 ffifdyop
这个字符串进行md5后恰好结果是’or’6�]��!r,��b,他的前四位为’or’正好满足sql注入查询的条件,因此可以完美绕过
md5值暴破
爆破脚本和使用方式
submd5.py
# -*- coding: utf-8 -*-
import multiprocessing
import hashlib
import random
import string
import sys
CHARS = string.letters string.digits
def cmp_md5(substr, stop_event, str_len, start=0, size=20):
global CHARS
while not stop_event.is_set():
rnds = ''.join(random.choice(CHARS) for _ in range(size))
md5 = hashlib.md5(rnds)
if md5.hexdigest()[start: start str_len] == substr:
print rnds
stop_event.set()
if __name__ == '__main__':
substr = sys.argv[1].strip()
start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0
str_len = len(substr)
cpus = multiprocessing.cpu_count()
stop_event = multiprocessing.Event()
processes = [multiprocessing.Process(target=cmp_md5, args=(substr,
stop_event, str_len, start_pos))
for i in range(cpus)]
for p in processes:
p.start()
for p in processes:
p.join()
使用方式:
爆破md5的值是以3e5f开头的字符串的值
md4
if ($_GET["hash1"] != hash("md4", $_GET["hash1"]))
{
die('level 1 failed');
}
1
2
3
4
0e251288019
0e898201062
md2
<?php
for($i=0;$i<99999;$i ){
$x1=hash("md2", '0e'.$i.'024452');
if(substr($x1,0,2)==='0e' and is_numeric($x1)){
break;
}
}
for($j=0;$j<999999;$j ){
$x2=hash('md2',hash("md2", '0e'.$j.'48399'));
if(substr($x2,0,2)==='0e' and is_numeric($x2)){
break;
}
}
print('b=0e'.$i.'024452&c=0e'.$j.'48399');
?>
b=0e652024452&c=0e603448399
sha1
if(sha1($v1)==sha1($v2) && $v1!=$v2){
aaroZmOk
aaK1STfY
aaO8zKZF
aa3OFF9m
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanekai
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13