BUGKU_WEB_20201022

代码审计-弱类型整数大小比较绕过

$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;
if($temp>1336){
echo $flag;

此题考查了is_numeric()函数因为既要带有数字又要带有字母,并且要大于1336,所以构造payload:password=1337q 既满足了大于1336而且还带字母

flag{bugku_null_numeric}

代码审计-sha()函数比较绕过

<?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'])
echo '

Your password can not be your name!
';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '

Invalid password.
';
}
else
echo '

Login first!
';
?>

根据提示应该是让先登陆,用户名密码都是通过get型传输

if ($_GET['name'] == $_GET['password'])//判断两个字段是不是相等,==是判断字符。
else if (sha1($_GET['name']) === sha1($_GET['password']))//然后sha1可以通过数组来绕过

然后构造payload:?name[]=222&password[]=333

Flag: flag{bugku--daimasj-a2}

代码审计-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";}
?>

这里的原理就是md5(‘QNKCDZO’)之后是0E830400451993494058024219903391,然后我们主要找到相同的不是QNKCDZO的md5之后的结果是0E830400451993494058024219903391的就ok了。

flag{bugku-dmsj-am9ls}

代码审计-十六进制与数字比较

<?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);
?>

首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload:?password=0xdeadc0de

flag{Bugku-admin-ctfdaimash}

代码审计-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
';
}
}
?>

ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的
用正则匹配,如果有[1]+$则直接错误,我们可以用%00来截断,在%00之后的数值函数无法识别
同时满足 strlen($_GET['password']) < 8 && $_GET['password'] > 9999999
长度跟数值本来就矛盾,我们可以用1e8 即1x10的八次方或者用数组绕过payload:http://123.206.87.240:9009/5.php?password=1e8-

不成功,我们用双星闭合一下-,重新构造
http://123.206.87.240:9009/5.php?password=1e8-
http://123.206.87.240:9009/5.php?password[]=-%00


flag{bugku-dm-sj-a12JH8}


  1. a-zA-Z0-9 ↩︎

posted @ 2020-10-22 21:50  WANGXIN_YU  阅读(134)  评论(0)    收藏  举报