ctf php弱类型、松散比较、哈希缺陷、MD5绕过、变量覆盖

17 篇文章 5 订阅

松散比较

  • 松散比较:==比较时先转数据类型再进行比较
  • 严格比较:=== 比较时先判断两种字符串类型是否相等,再进行比较
    例:
"admin"==0 #ture
"1admin"==1 #ture
"admin1"==1 #false
  • 如果该字符串没有包含’.’ ‘e’ 'E’并且数值在整形范围值内,该字符串被当作int来取值,其他所有情况下被当作float来取值,该字符串的开始部分的值决定了它的值,如果该字符串以合法的数值开始,则使用该字符否则为0(不是字符串的0)。

哈希比较缺陷

  • 如果hash值以0e开头,后面都是数字,再与数字比较时就会被解释为010^n(科学计数法)还是0就会被判断为相等,从而绕过登陆环节。
var_dump(md5(''250610708')==md5('QNKCDZO')) #输出为bool类型true
var_dump('0e12345'=='0e5767')#输出为bool类型true

布尔欺骗

  • 当存在json_decode和unserialize时,部分结构会被解释为bool类型,会造成欺骗

数字转换欺骗

var_dump(intval('2'))#输出为int(2)
var_dump(intval('3bc'))#输出为int(3)
var_dump(intval('abcd'))#输出为int(0)
#intval()用于获取变量的整数值
var_dump(0.9999999999999999999==1)#输出为true

boolean strcmp(str1,str2)

  • str1,str2是两个字符串,如果str1小于str2返回<0的数,如果str1大于str2,返回>0的数,两者相等的话返回0
  • 缺陷字符串与array()数组比较,返回0
var_dump(strcmp('passwd',a[]))#true

md5()函数

  • md5()函数描述的是string md5(string $str[,bool $raw_outpuy=fake])
  • md5()中需要的是一个string函数,但是当你传一个array()数组时,md5不会报错,只是无法求出array的md5值,这样会导致任意两个array的md5值都会相等
var_dump(md5([1,2,3])==md5([4,5,6]))#ture

switch()函数

  • switch()其中()内的值会被弱类型转换

is_numeric()函数

  • ()内的值会被弱类型转换
$id='0x3120616e6420313d31'//hex(1 and 1=1)
if(is_numeric($id))
{
	$sql='select * from admin and where id = $id;//会以十六进制形式执行
	echo $sql
}

in_array()函数

  • 与array_search()相同
  • in_array()函数的解析是bool in_array(mixed $needle,array $haystack [,bool $strict=false]
  • 如果是$strict参数没有提供,那么in_array就会使用松散比较来判断$needle是否存在$haystack中
  • 当strict的值为true时,in_array()会比较needle的类型haystack是否相同

empty(var)函数

  • 当var存在,并且时非空非零的值时返回false,否则返回true
  • isset()函数相同
//下列会被认为为空
" "#空字符串
0#整数零
0.0#浮点数零
"0"#字符串的零
NULL#空
FALSE#
array()#空数组
$var#未赋值的变量

变量覆盖

  1. $$变量覆盖
  2. extract()函数
    该函数使用数组键名作为变量名,使用数组的键值作为变量值
    针对数组的每一个元素,将在当前符号表中创建一个对应的变量
    extract(array,extract_rules,prefix)
    extract flags标记位,默认存在变量覆盖漏洞
<?php
show_source(__FILE__);
$key = "bad";
extract($_POST);
if($key === 'bad'){
    die('badbad!!!');
}
$act = @$_GET['act'];
$arg = @$_GET['arg'];
if(preg_match('/^[a-z0-9_]*$/isD',$act)) {
    echo 'check';
} else {
    $act($arg,'');
}

echo '666';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OceanSec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值