刷题[Hash me please]
ringzer0ctf-Coding Challenges-Hash me please
这题本来不想写wp,有点水,但是想到正好要出校赛的题,加上20级在学python,算是给他们稍微认识一下web中python脚本的编写吧
打开页面,简单粗暴,有时间限制提交sha512加密后的内容
编写exp
import requests
import hashlib
import re
url = 'https://ringzer0ctf.com/challenges/13'
searchtext = ' ----- BEGIN MESSAGE -----<br />\r\n\t\t(\w+)'
flagtext = 'FLAG-\w+'
cookie = {
'PHPSESSID':'q828bk8rumfva9rb3quu4q6bq2',
'_ga':'GA1.2.840888693.1610154251',
'_gid':'GA1.2.645334795.1610669423'
}
r = requests.get(url=url, cookies=cookie)
text = re.search(searchtext, r.text)
hash_text = text.group(1)
print(hash_text)
hash = hashlib.sha512(hash_text.encode("utf-8")).hexdigest()
print(hash)
la_url = url+hash
r = requests.get(url=la_url,cookies=cookie)
print(r.text)
flag = re.search(flagtext,r.text)
flag = flag.group()
print(flag)
exp详解
python进行网络请求
我们通过python进行网络请求就需要requests模块,他能提供get/post等请求
r = requests.get(url=url, cookies=cookie)
即表示我们向url进行带cookie的get请求,但是无参数
r.text
即表示服务器返回的字符串
正则匹配加密字符串
观察源代码
发现我们需要加密的值在此之后
----- BEGIN MESSAGE -----<br /> //这里有换行符(\r\n)
//这里有两个制表符(\t\t)
所以我们需要正则匹配,提取BEGIN MESSAGE 后的内容
searchtext = ' ----- BEGIN MESSAGE -----<br />\r\n\t\t(\w+)'
为什么要(\w+),在后面中解释
首先我们需要了解python中的re模块及相关方法
re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用。注意:
- re模块是python独有的
- 正则表达式所有编程语言都可以使用
- re模块、正则表达式是对字符串进行操作
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
所以exp中的
text = re.search(searchtext, r.text)
即表示经过get请求返回的网页内容中寻找searchtext 中的内容
import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
通过上面的例子我们就可以知道
hash_text = text.group(1)
表示匹配\w+
的内容,即我们需要加密的字符串
hashlib加密模块
在python中,我们会经常用到hashlib模块,其支持md5(),sha1(), sha224(), sha256(), sha384(), sha512()等hash构造方法
hash = hashlib.sha512(hash_text.encode("utf-8")).hexdigest()
即表示以utf-8编码字符串,并将其sha512加密后返回十六进制数据字符串值
后续获得了加密后的值后,再次利用requests模块请求页面,匹配到flag值后输出即可