目前还是太菜了,向师傅们好好学习
SSRF me
点开首页就是一长串代码, curl重定向保存到文件中,然后仔细分析了一下代码
程序主要涉及到三个参数,一个是param在get中,另外两个action和sign是通过cookie获得的
访问/geneSign
可以得到sign的值, action可以是scan
或read
,但是在访问/De1ctf
时,会检验sign是否正确,sign的生成算法:
1 | def getSign(action, param): |
这其中secret_key
是不知道的,并且gengeSign
限制了action只能是scan
,结合后来题目的提示是访问flag.txt
,但是最多将这个文件读入result.txt
,却不能读取出来。
这样想来是不是只能爆破secret_key
了?但是secret_key
又怎么会那么容易给你呢。。
这就涉及到我的知识盲区了,叫做哈希扩展攻击。。
先看实验吧一道例题
这题,注入不想注入,源码没扫出来,啥信息都没有?
还是要多关注抓包的信息,尤其是数据包中出现了一些你都没有看过的东西的时候就要仔细看一看了
hhh没想到吧
原来可以通过这种方式获取到源代码。。
1 | $flag = "XXXXXXXXXXXXXXXXXXXXXXX"; |
empty函数 非空返回false,别想多了
关键在这里:
if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
其中$secret
是不知道的,$username
和password
是可以控制的,并且$secret
的长度是15
哈希扩展攻击的原理之后再讨论,我们先分析这题咋搞
首先username必须是admin,password不能是admin那就随便输一个值比如cck
我们的目标很简单,就是绕过它
if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
所以目标就是让$COOKIE["getmein"]
和md5后的值相等,所以需要同时伪造两边的值天平才能平衡
而hashpump工具就是来干这个的:
第一个参数是md5($secret . urldecode("admin" . "admin"))
的值,第二个参数是填充的数据,第三个参数是填充数据加key的长度,第四个参数是添加的数据。
这样就能同时生成天平左边和右边的值了
当然还需要URL编码一下
理解了这题那么这道De1ctf的题目也就好说了
参考ctftime上的exp代码如下:
1 | import requests,hashpumpy,urllib |
当然我用的是python3,并且注意urllib.parse.quote(add_data)
方法
就成功了