CTF-BugKu-WEB-21-

2020.09.18

完了完了,今天是否是作不完了……🥶php

经验教训

  1. re.search(pattern, string)能够找到字符串中匹配正则的某一段字符;
  2. eval()方法能够用来得出1+1+2这种字符串的结果;
  3. python中,post的内容是json,例如post = {'value': result}
  4. python中,添加post内容要用post()方法,而且添加data参数,例如s.post(url, data = post)
  5. r'(\d+[+\-*])+(\d+)'能够用来匹配123+456*789这种算式;

第二十一题 秋名山老司机

https://ctf.bugku.com/challenges#秋名山老司机
python

  1. 那么题眼就很清楚了,两秒内把算出来的结果post出去,这看起来只有脚本才能作到。
  2. 这里的脚本有几处问题我不太会,参考了大佬的,有几个问题就是
    • 怎么把须要算的数从响应中取出来?
    • 取出来以后怎么进行计算?取出来毕竟是字符串,应该没办法直接计算才是。
    • 下边大佬的脚本给了解决方案,就总结在经验教训中。
import requests
import re
url = 'http://120.24.86.145:8002/qiumingshan/'
s = requests.Session() # 很关键,由于session保证了长连接,才能保证咱们在2s内post出请求,要否则post只会开启一个新连接
source = s.get(url)
expression = re.search(r'(\d+[+\-*])+(\d+)', source.text).group() # re.search()能够找到字符串中匹配的某一段字符,这解决方案完美
result = eval(expression) # eval能直接把字符串转换为可执行的语句,完美
post = {'value': result} # 构造post内容,学到了post的内容是json
print(s.post(url, data = post).text) # 输出post后结果,学到了请求时添加post内容是用`data=?`
  1. 通过以上脚本咱们就有几率获得flag啦,Bugku{YOU_DID_IT_BY_SECOND},真的是有几率获得,多是py和php算的数不同……

第二十二题 速度要快

https://ctf.bugku.com/challenges#速度要快
web

  1. 打开连接,查看源码,意思就是要很快的post叫margin的数据,很快的post简单,可是margin是什么?
  2. 我刷新了一遍,在响应头中发现可疑信息,6LeR55qE6L+Y5LiN6ZSZ77yM57uZ5L2gZmxhZ+WQpzogTlRVek5qZzM=
  3. 转码得跑的还不错,给你flag吧: NTUzNjg3,可是填入并不对
  4. 这让我怀疑这个flag,赶忙还像是base64,因而又一次解码得553687,这个难不成是margin的值??脚本测试一下
  5. 脚本以下,可是没有成功,wtf??居然还嫌不够快……
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
#fileName  : decry.py
#createTime: 2020/09/18 23:34:52
#author    : 乔悟空
#purpose   : 此脚本用于快速响应目标url并post指定值
import requests

url = "http://123.206.87.240:8002/web6/"
session = requests.session()
res = session.get(url).text
print(res)
for i in range(20):
    res = session.post(url,data={'margin':553687}).text
    print(res)


6. 看来是思路不对,再去看看,发现端倪,md,我明白了,我发现哪一个flag是一直在变的,原来如此,也就是说margin是在变的,也对,怎么可能像以前想的这么简单呐……修改脚本express

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
#fileName  : decry.py
#createTime: 2020/09/18 23:34:52
#author    : 乔悟空
#purpose   : 此脚本用于快速响应目标url并post指定值
import requests
import base64

url = "http://123.206.87.240:8002/web6/"
session = requests.session() # 保持长连接
res = session.get(url).headers['flag'] # 取响应头中flag的动态变化值
print(res)
res = base64.b64decode(res).decode().split(': ')[1] # 第一次base64
print(res)
res = base64.b64decode(res).decode() # 第二次base64
print(res)
res = session.post(url,data={'margin':res}).text # 快速post margin
print(res)
  1. 运行脚本获得结果,奥力给🤓KEY{111dd62fcd377076be18a}