刷题[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值后输出即可

posted @ 2021-01-15 16:23  kar3a  阅读(137)  评论(0编辑  收藏  举报