文章目录
  1. Web50 MD5 Games 1
  2. Web150 MD5 Games 2
  3. Web120 Hasher
  4. Web 150 Fractal

hack dat kiwi 2017 writeup

Web50 MD5 Games 1

web签到题,一道弱类型题目。题目代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
if (isset($_GET['src']))
highlight_file(__FILE__) and die();
if (isset($_GET['md5']))
{
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "Wonderbubulous! Flag is ".require __DIR__."/flag.php";
else
echo "Nah... '",htmlspecialchars($md5),"' not the same as ",md5($md5);
}


?>
<p>Find a string that has a MD5 digest equal to itself!</p>
<form>
<label>Answer: </label>
<input type='text' name='md5' />
<input type='submit' />
</form>

<a href='?src'>Source Code</a>

要求$md5==md5($md5),写个脚本跑一下,几分钟可以跑出来。

1
2
3
4
5
6
<?php
for ($i=0; $i < 2147483647; $i++) {
if (is_numeric(md5("0e".$i))&&substr(md5("0e".$i), 0,2)=="0e"){
print $i . "---";
}
}

Web150 MD5 Games 2

这道题到比赛结束还没有人做出来,后来官方放出writeup,感觉思路新颖非常值得学习。于是自己还没有跑出来结果,就放给自己学校的比赛了,被大家一顿吐槽。于是先收题,等自己跑出来确定能在比赛前做出来后再放题。wp比赛结束后补上

Web120 Hasher

题目给出源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 <?php
if (!shell_exec("which openssl"))
die("Challenge Error: need openssl installed\n");
if (isset($_GET['code']))
die(highlight_file(__FILE__));
function str_xor($str,$max_depth=0,$depth=0)
{
$mid=strlen($str)/2;
$left=substr($str,0,$mid);
$right=substr($str,$mid);
if ($depth<$max_depth)
{
$left=str_xor($left,$max_depth,$depth+1);
$right=str_xor($right,$max_depth,$depth+1);
}
$out="";
for ($i=0;$i<strlen($left);++$i)
$out.=$left[$i]^$right[$i];
return $out;
}


function hasher($string)
{
if (!ctype_alnum($string))
return null;
$t=trim(shell_exec("echo -n '{$string}' | openssl dgst -whirlpool | openssl dgst -rmd160"));
$t=str_replace("(stdin)= ","",$t); //some linux adds this
if (!$t)
return null;
return bin2hex(str_xor(hex2bin($t),1));
}

$user='admin';
extract($_POST);
if (isset($password))
{
if (hasher($user)==hasher($password) and $user!=$password)
echo "Welcome! Flag is: ".include("flag.php");
else
echo "Invalid password.<br/>";
}
?>

<form method='post'>
<label>Password:</label>
<input type='password' name='password' />
<input type='submit' />
</form>

<a href='./?code'>Source Code</a> 1

最后的要求是

1
2
if (hasher($user)==hasher($password) and $user!=$password)
echo "Welcome! Flag is: ".include("flag.php");

hasher函数用openssl加密一次,再用str_xor函数加密一次。因为是==还是可以用弱类型绕过,就心想着爆破了。自己电脑里装了个pentestbox,自带openssl扩展,没想到计算结果和linux下是不同的。win下跑了半个多小时得到的结果是错误的,放到linux下几分钟就跑出来了。

exp1.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
if (!shell_exec("which openssl"))
die("Challenge Error: need openssl installed\n");
if (isset($_GET['code']))
die(highlight_file(__FILE__));
function str_xor($str,$max_depth=0,$depth=0)
{
$mid=strlen($str)/2;
$left=substr($str,0,$mid);
$right=substr($str,$mid);
if ($depth<$max_depth)
{
$left=str_xor($left,$max_depth,$depth+1);
$right=str_xor($right,$max_depth,$depth+1);
}
$out="";
for ($i=0;$i<strlen($left);++$i)
$out.=$left[$i]^$right[$i];
return $out;
}


function hasher($string)
{
if (!ctype_alnum($string))
return null;
$t=trim(shell_exec("echo -n '{$string}' | openssl dgst -whirlpool | openssl dgst -rmd160"));
$t=str_replace("(stdin)= ","",$t); //some linux adds this
if (!$t)
return null;
return bin2hex(str_xor(hex2bin($t),1));
}

for ($i=0; $i < 10000000; $i++) {

if(is_numeric(hasher("0e".md5($i)))&&substr(hasher("0e".md5($i)), 0,2)=="0e"){
echo $i;
}

}

exp2.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
if (!shell_exec("which openssl"))
die("Challenge Error: need openssl installed\n");
if (isset($_GET['code']))
die(highlight_file(__FILE__));
function str_xor($str,$max_depth=0,$depth=0)
{
$mid=strlen($str)/2;
$left=substr($str,0,$mid);
$right=substr($str,$mid);
if ($depth<$max_depth)
{
$left=str_xor($left,$max_depth,$depth+1);
$right=str_xor($right,$max_depth,$depth+1);
}
$out="";
for ($i=0;$i<strlen($left);++$i)
$out.=$left[$i]^$right[$i];
return $out;
}


function hasher($string)
{
if (!ctype_alnum($string))
return null;
$t=trim(shell_exec("echo -n '{$string}' | openssl dgst -whirlpool | openssl dgst -rmd160"));
$t=str_replace("(stdin)= ","",$t); //some linux adds this
if (!$t)
return null;
return bin2hex(str_xor(hex2bin($t),1));
}

for ($i=0; $i < 10000000; $i++) {

if(is_numeric(hasher("0e".$i))&&substr(hasher("0e".$i), 0,2)=="0e"){
echo $i;
}

}

Web 150 Fractal

一道商店题目。有几个页面:主页,订阅,购买,什么什么的。商店卖很多东西,flag的价格是10万,自己的钱是0 。在订阅页面输入一个邮箱,就可以返回一个优惠券,优惠券可以打9折再减5美元。测试了一下,不同的优惠券,在不同的时间,均不能叠加,一次只能使用一个优惠券。另外题目的url是index.php?page=home,有page参数就很像一个本地文件包含。测试了所有的payload均失败,自动跳转回home,猜测是白名单控制的。在index.php中有导航栏和输入优惠券的地方。

本以为这道题是一个逻辑漏洞,结果是一个本地文件包含。题目的做法是index.php?page=index。这样就导致了包含,每一层index.php都会读取page参数并读取index.php,在本地测试最大的嵌套数量是100个,这道题目在自身递归包含100次之后在最内层的优惠券输入框中输入优惠券,就会递归向外传递,在最外层的窗口flag的价格变为0,购买即可。

昨晚和小伙伴一起写了个简单的demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
session_start();

if (!isset($_SESSION['youhuiquan'])){
$_SESSION['youhuiquan'] = 'youhuiquan';
}

if (!isset($money)){
$money = 100000;
}

if(isset($_SESSION['youhuiquan'])){
$money = 0.9 * $money - 5;
}

if ($money < 0){
die('flagIsHere');
}

if(isset($_GET['page'])){
include($_GET['page'].".php");
}

unset($_SESSION['youhuiquan']);

echo "money: " . $money;

保存为index.php。访问index.php?page=index

支持一下
扫一扫,支持forsigner