上个星期准备考试就没怎么做,现在补上。
话不多说,上题
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*-*
其实也可以用数组绕过,特别简单。