hgame(php)

杭电vidar的hgame,其中几道php的题,写一下学到的。

php trick

十多个php的绕过,题目挂了,用了一个师傅博客里的图片(之前忘写了,懒~)

(1)


==和!=之间不会去判断数据类型,1和2又都被强制转换为了字符型,所以不能用数组,可用0e开头的MD5值绕过

(2)


===则会判断数据类型,两个必须完全相等才返回true,所以用数组绕过,不同值的数组都返回0(详细见https://blog.csdn.net/qq_19980431/article/details/83018232)

(3)

php里的特性+和.会被解析为_,所以H_game写为H+game,或者是$_SERVER[‘QUERY_STRING’] 是不会自动URLDecode 的,所以我们只需要传个URL编码过的参数名即可绕过这里

(4)

数组绕过

(5)


这里被难住了,必须是http开头,开头的提示为admin.php,本来想着可以file协议忽略前面的地址直接读取文件内容,但是http的限制没法绕过

parse_url 里的 PHP_URL_HOST 参数获取的是 最后一个@ 符号后面的域名,而 curl 使用的是第一个 @ 符号后面的域名,又有only localhost的提示,这样我们就可以用 http://@127.0.0.1:80@www.baidu.com/admin.php 来绕过,从而读取admin.php

(6)


这里又卡住了,之前做bugku的时候对file_getcontent理解不到位,file_getcontent内容可以执行为协议,所以直接filename=php://filter/read=convert.base64-encode/resource=flag.php就可以绕过php_exits.

(7)


最终payload为:str1=s878926199a&str2=s155964671a&str3[]=22&str4[]=1&H+game[]=9e10000000000%00&url=http://@127.0.0.1:80@www.baidu.com/admin.php?filename=php://filter/read=convert.base64-encode/resource=flag.php

php is the best language


我们需要POST的参数,door,key,gate。但这里secret是未知的,所以我们需要对door进行处理使secert的值为空,对于hash_mac函数
hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = FALSE ] ) : string
参数
algo:
要使用的哈希算法名称,例如:”md5”,”sha256”,”haval160,4” 等。
data:
要进行哈希运算的消息。
key:
使用 HMAC 生成信息摘要时所使用的密钥
raw_output:设置为 TRUE 输出原始二进制数据, 设置为 FALSE 输出小写 16 进制字符串。

当data的数据为数组时,返回空,所以传入data[]=0,secret的值就变成了null,然后gate的值是对key进行shal256加密,密钥为空。key的值可以确定,这里又是MD5碰撞的问题,在网上找到了一篇博客,下附地址:
https://www.k2zone.cn/?p=2019
双MD5,得到key可取key=7r4lGXCH2Ksu2JNT3BYM
之后可求gate
php> var_dump(hash_hmac(‘sha256’, ‘7r4lGXCH2Ksu2JNT3BYM’, NULL)) string(64) “81f581b7553943f5041f054ca92e5e7e490e2c40296a93d94d214f1 36aa84fe6”

最终payloadgate=81f581b7553943f5041f054ca92e5e7e490e2c40296a93d94d2 14f136aa84fe6&key=7r4lGXCH2Ksu2JNT3BYM&door[]=1

0%