[De1CTF 2019]SSRF Me
考点
原文:https://xz.aliyun.com/t/5927
hash长度拓展攻击
代码存在逻辑缺陷
Python local_fie
wp
题目描述
直接查看页面源代码可以看到正确格式的代码
提示给的是 flag 在 ./flag.txt 中,题目单词打错了
python 的 flask 框架,三个路由,index 用于获取源码,geneSign 用于生成 md5,De1ta 就是挑战
大概思路就是在 /De1ta 中 get param ,cookie action sign 去读取 flag.txt,其中,
param=flag.txt
,action
中要含有read
和scan
,且sign=md5(secert_key + param + action)
哈希拓展攻击
这是这道题最多的解法,介绍 : https://joychou.org/web/hash-length-extension-attack.html
secert_key
是一个长度为 16 的字符串,在/geneSign?param=flag.txt
中可以获取md5(secert_key + 'flag.txt' + 'scan')
的值,为8370bdba94bd5aaf7427b84b3f52d7cb
,而目标则是获取md5(secert_key + 'flag.txt' + 'readscan')
或者md5(secert_key + 'flag.txt' + 'scanread')
的值使用 hashpump 即可
exp :
字符串拼接
试着访问了一下
/geneSign?param=flag.txt
,给出了一个 md58370bdba94bd5aaf7427b84b3f52d7cb
,但是只有scan
的功能,想加入read
功能就要另想办法了看了一下逻辑,在 getSign 处很有意思,这个字符串拼接的就很有意思了
不妨假设
secert_key
是xxx
,那么在开始访问/geneSign?param=flag.txt
的时候,返回的 md5 就是md5('xxx' + 'flag.txt' + 'scan')
,在 python 里面上述表达式就相当于md5(xxxflag.txtscan)
,这就很有意思了。直接构造访问
/geneSign?param=flag.txtread
,拿到的 md5 就是md5('xxx' + 'flag.txtread' + 'scan')
,等价于md5('xxxflag.txtreadscan')
,这就达到了目标。
直接访问
/De1ta?param=flag.txt
构造 cookieaction=readscan;sign=7cde191de87fe3ddac26e19acae1525e
即可
local_file
天枢大佬们的做法 : https://xz.aliyun.com/t/5921#toc-16
放上他们的 exp
请求
/geneSign?param=local_file:///app/flag.txtread
获取 md5 值为60ff07b83381a35d13caaf2daf583c94
,即md5(secert_key + 'local_file:///app/flag.txtread' + 'scan')
然后再请求
/De1ta?param=local_file:///app/flag.txt
构造 cookieaction=readscan;sign=60ff07b83381a35d13caaf2daf583c94
以上就是他们 exp 做的事情,和上一个方法差不多
关于
local_file
:https://bugs.python.org/issue35907
这里是使用的 urllib.urlopen(param) 去包含的文件,所以可以直接加上文件路径
flag.txt
或./flag.txt
去访问,也可以使用类似的file:///app/flag.txt
去访问,但是file
关键字在黑名单里,可以使用local_file
代替如果使用 urllib2.urlopen(param) 去包含文件就必须加上
file
,否则会报ValueError: unknown url type: /path/to/file
的错误
https://bugs.python.org/issue35907
小结
一题多解,要学着抽象问题,就像数学一样,要明确得到答案的条件是什么,再去反推
最后更新于