寒假CTF学习打卡笔记~Day3

发布于 2020-01-13  646 次阅读


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


等风来,不如追风去。