最近几日代码审计题目小结

上个星期准备考试就没怎么做,现在补上。

话不多说,上题

1、sha()函数比较绕过

http://123.206.87.240:9009/7.php

<?php
$flag = "flag";
if (isset($_GET['name']) and isset($_GET['password']))
{
	var_dump($_GET['name']);
	echo "";
	var_dump($_GET['password']);
	var_dump(sha1($_GET['name']));
	var_dump(sha1($_GET['password']));

	if ($_GET['name'] == $_GET['password'])//name和password不能相同
		echo 'Your password can not be your name!';

	else if (sha1($_GET['name']) === sha1($_GET['password']))//name和password要相同
		die('Flag: '.$flag);
		
	else
		echo 'Invalid password.';
}

else
	echo 'Login first!';
?>

sha()函数不能判断数组,遇到数组返回false(0),0=0,就得到flag了。

md5加密相等绕过

http://123.206.87.240:9009/13.php

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a))
{
	if ($a != 'QNKCDZO' && $md51 == $md52) 
	//a不能和QNKCDZO一样,但是a的md5值和QNKCDZO一样
	{
		echo "flag{*}";
	} 
	else
	{
		echo "false!!!";
	}
}
else
{
	echo "please input a";
}
?>

md5函数的值如果是0eXXXXXXXXXXXXX,它的值用科学计数法被看作0(科学计数法),所以我只要输入一个0e开头的payload即可
1这里放一下0e开头的payload:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1(str)
sha1(‘aaroZmOk’)
sha1(‘aaK1STfY’)
sha1(‘aaO8zKZF’)
sha1(‘aa3OFF9m’)

十六进制与数字比较

http://123.206.87.240:9009/20.php

<?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";
	}
}
if($number == $temp)
	return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
?>

要求payload中不能有1-9的数字,但是值要等于3735929054,题目已经明示用16进制绕过,就用16进制转一下得到0xdeadc0de,刚好0<1,得到flag。

ereg正则%00截断

http://123.206.87.240:9009/5.php
<?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)//长度小于8且值大于9999999
	{
			if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置
		{
			die('Flag: ' . $flag);
		}
		else
		{
			echo('- have not been found');
		}
	}
	else
	{
		echo 'Invalid password';
	}
}
?>

现在有3个要求:
1、包含数字和字母;
2、长度小于8;
3、值大于9999999;
4、包含*-
2和3矛盾(大于9999999至少要8位数,但又要长度小于8),再看第一个条件,数字和字母!其实这是个提示,提示我用科学计数法Xe9就行(0<X<10),但是包含
-就有点难搞,看一下题目%00截断,大致懂了,%00在ereg函数中表示结束,当ereg检测到%00时,会判定为结束符,即使后面有内容也不管,所以在后面加上%00*-*
其实也可以用数组绕过,特别简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值