md5加密相等绕过
<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "flag{*}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
?>
这个在Day1的时候有写过,QNKCDZO 是一个比较特殊的字符串因为在md5加密后会成为0exxxxx的形式。因此在符号比较中,只需传入一个md5加密后同样是0exxxxx的形式的字符串就可以了。这里我的Payload是?a=240610708
十六进制与数字比较
<?php
error_reporting(0);
function noother_says_correct($temp)
{
$flag = 'flag{test}';
$one = ord('1'); //ord — 返回字符的 ASCII 码值
$nine = ord('9'); //ord — 返回字符的 ASCII 码值
$number = '3735929054';
// Check all the input characters!
for ($i = 0; $i < strlen($number); $i++)
{
// Disallow all the digits!
$digit = ord($temp{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
// Aha, digit not allowed!
return "flase"; //吐槽这里应该是false
}
}
if($number == $temp)
return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
?>
一开始是想到了直接丢一个16进制数进去,后面转念一想0也算数字
后面仔细看代码才发现原来他只检测1~9,而且这个数字的16进制里面正好也没有1~9的字符(吐了)
Payload: ?password=0xdeadc0de
ereg正则%00截断
<?php
$flag = "xxx";
if (isset ($_GET['password']))
{
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
{
echo 'You password must be alphanumeric';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置
{
die('Flag: ' . $flag);
}
else
{
echo('*-* have not been found');
}
}
else
{
echo 'Invalid password';
}
}
?>
今天也学到了新的一招。。。NULL!=False
然后ereg()和strpos()两个函数都无法处理数组。。所以这里就直接传一个password数组进去就行了。。。
Payload1:?password[]=1
然后根据题目这个题目的做法应该是用%00截断比较符号的判断
Payload2:?password=1e9%00*=*
(前面一直不知道原来可以用科学计数法,在数字位数上卡题卡了好久hhhhhh
Comments | NOTHING