【Bugku】秋名山老司机 详细题解 Writeup

import requests
import re
url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.Session()
req = s.get(url)
expression = re.search(r'(\d+[+\-*])+(\d+)', req.text).group()
# expression = req.text[req.text.find('<div>')+5:req.text.find('=?')]

result = eval(expression)
data = {'value': result}
#print(s.post(url).encoding)
#ISO-8859-1

#print(s.post(url, data=post).text)
#åŽŸæ¥ä½ ä¹Ÿæ˜¯è€å¸æœº Bugku{YOU_DID_IT_BY_SECOND}
#text中存的是Beautifulsoup根据猜测的编码方式将content内容编码成字符串text是。没有前面的b,对于纯ascii码,这两个可以说一模一样,对于其他的文字,需要正确编码才能正常显示

print(s.post(url, data=data).content.decode('utf-8'))
#中文转码
#原来你也是老司机 Bugku{YOU_DID_IT_BY_SECOND}
#content是字节码,直接输出会发现前面存在b'这样的标志,显示乱码,这时需要用.content.decode('utf-8'),中文常用utf-8和GBK,GB2312,.content进行手动编码
#resp.text返回的是Unicode型的数据。
#resp.content返回的是bytes型也就是二进制的数据。


'''

1081018835-1070311562*568188127-642812755+508283747-177925746*1428769176-1723352262*710685256-143853778*1404955122
计算响应内容中的表达式并用 POST 请求返回结果,实质还是快速反弹包含正确信息的 POST 请求,详情可参考详解 CTF Web 中的快速反弹 POST 请求
1、有关 requests 的部分此处不细讲,唯一要注意必须利用会话对象 Session(),否则提交结果的时候,页面又重新生成一个新的表达式,结果自然错误。
2、第 6 行是利用正则表达式截取响应内容中的算术表达式。首先引入 re 模块,其次用 search() 匹配算术表达式,匹配成功后用 group() 返回算术表达式的字符串。
3、第 7 行在获得算术表达式的字符串后,直接利用 Python 的內建方法 eval() 来计算出结果,简单、暴力、快捷。




import requests
url = "http://123.206.87.240:8002/qiumingshan/"
s = requests.Session()
req = s.get(url)
expression = req.text[req.text.find('<div>')+5:req.text.find('=?')]
result = eval(expression)
post = {'value': result}
print(s.post(url, data=post).text)

a = '''
<head>
<title>下面的表达式的值是秋名山的车速</title>
<meta charset="UTF-8">
</head>
<p>亲请在2så†
计算老司机的车速是多少</p>
<div>512141817+1892942738*546487160*2117517648*2119867596+787513764*573152593+1531645841-2069881943+1091647023+1264534072=?;</div>
<style>
div,p{
text-align: center;
margin: 0 auto;
}
</style>
'''
expression = a[a.find('<div>')+5:a.find('=?')]
# a[A:B]截取字符串,序列从A到B,<是0,+5是到5,直到=?的序列号




import requests
import re
s = requests.Session()
req = s.get("http://123.206.87.240:8002/qiumingshan/")
expression = re.search(r'^<div>(.+)=\?;</div>$', a, re.M | re.S) #re.M|re.S匹配多行或匹配一行
# (.+) 匹配所有 包括中文 换行后的也在 原样展示 (.+?) 匹配后的是竖着 一个一个展示
# re.M	多行匹配,影响 ^ 和 $
# re.S	使 . 匹配包括换行在内的所有字符

# <re.Match object; span=(155, 285), match='<div>512141817+1892942738*546487160*2117517648*21>

data = {
    "value": eval(expression.group(1)) #这里是value是从网页提示中得到的
}
flag = s.post("http://123.206.87.240:8002/qiumingshan/", data)
print(flag.text)



#!coding:utf-8
import requests,re

s = requests.session()
url = 'http://123.206.87.240:8002/qiumingshan/'
request = s.get(url)
spon = request.text
vul = re.findall('>(\d+.+)\=',spon)
result = {'value':str(eval(vul[0]))}
data = s.post(url,data=result)
flag = data.text
print(flag)








import requests
import re
 
mysession = requests.Session()
myrequests1 = mysession.get("http://123.206.87.240:8002/qiumingshan/")
mystr = re.findall(r'<div>.*</div>', myrequests1.text)  # 第一个参数是正则,第二个参数是要截取的字符串
str_calculate = mystr[0].strip('=?;</div>')
result = {                            # 这个result也可以是字符串
    "value": eval(str_calculate)
}
#print(result)
myrequests2 = mysession.post("http://123.206.87.240:8002/qiumingshan/", data=result)
print(myrequests2.text)






#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup
 
url = "http://123.206.87.240:8002/qiumingshan/"
s = requests.session()
r = s.get(url)
# 将编码设置为 utf8
r.encoding = 'utf-8'
# bs解析网页内容
soup = BeautifulSoup(r.text, 'html.parser')
#提取div里的内容
num = soup.div.text 
# 赋值 post 参数
final = {'value': eval(num.replace('=?;', ''))}
print(final)
r = s.post(url, data=final)
r.encoding = 'utf-8'
print(r.text)


'''









import requests
import re
url = 'http://123.206.87.240:8002/qiumingshan/'
r = requests.session()
requestpage = r.get(url)
ans = re.findall('<div>(.*?)=?;</div>', requestpage.text) #获取表达式
ans = "".join(ans) #列表转为字符串
ans = ans[:-2] #去掉最后的=?
post = eval(ans) #计算表达式的值
data = {'value': post} #构造post的data部分
flag = r.post(url, data=data)
print(flag.text)



'''

所得知识点:
1、python的requests库
在这道题中我们用了requests中的session()函数、get()函数、post()函数、下面一一说明:
session对象可以使我们跨请求保持某些参数,也可以在同一个session实例发出的所有请求之间保持cookies
——创建一个session对象可以拥有以上的作用(但并没有实例化);
然后get()函数,用来进行模拟发送,获得相应url站点的信息,可分为有参和无参两种情况:

无参:
如以上代码,括号内是一个url,表示获取这个url内的信息。

有参:
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://123.206.87.240:8002/qiumingshan/
post 类似

2、re库
re库的主要用途就是进行字符串匹配(看着就会有很多我记不住的各种函数嘤嘤嘤)wuling这个博客很详细
说到字符串匹配,正则表达式完全是绕不过的啊2333,在re库中,几乎所有的函数参数都有正则表达式,re库中正则表达式有两种表示方式:
①raw string类型
表示为:r'text',例如:r'[1-9]\d{5}',raw string是指不包含转义符的字符串;
如果正则表达式里含有转义字符之类的敏感字符,最好用这种方法。
②string类型
例如:'[1-9]\\d{5}';'\\d{3}-\\d{8}|\\d{4}-\\d{7}'

3、用到的python的其他函数
join()函数,用法:例如ex.join(str)
参数说明
ex:分隔符。可以为空(如本题)
str:要连接的元素序列、字符串、元组、字典
上面的语法即:以ex作为分隔符,将str所有的元素合并成一个新的字符串
返回值:返回一个以分隔符ex连接各个元素后生成的字符串







<?php
session_start();

$table = array('+', '-', '*');

function initial($table)
{
    // 设置值
    $formula = (string) mt_rand();

    for ($i = 0; $i < 10; $i++) {
        $formula .= $table[mt_rand(0, 2)] . (string) mt_rand();
    }

    $value = eval('return ' . $formula . ';');
    $_SESSION['value'] = $value;
    $_SESSION['formula'] = $formula;
    $_SESSION['time'] = date_timestamp_get(date_create());
    echo '<p style="text-align:center">亲请在2s内计算老司机的车速是多少</p>' . PHP_EOL;
    echo '<div>' . $formula . '=?;</div>' . PHP_EOL;
}

if (!isset($_SESSION['value'])) {
    initial($table);
} else {
    $diff = date_timestamp_get(date_create()) - $_SESSION['time'];

    if ($diff <= 2) {
        if (isset($_POST['value'])) {
            if ($_POST['value'] === (string) $_SESSION['value']) {
                echo 'You get the flag';
            }
        } else {
            echo 'Give me value post about ' . $_SESSION['formula'] . '=?';
        }
    } else {
        initial($table);
    }
}
?>







#! /usr/bin/python3
# -*- coding: utf-8 -*-

import requests
import re

# 打印信息
def print_response(res):
    for v in res.headers:
        print(v+': '+res.headers[v])

    print()
    print(res.content.decode())

url = 'http://123.206.87.240:8002/qiumingshan/'

s = requests.Session()

response = s.get(url)
print("The first response:")
print_response(response)

# 匹配formula(公式)
result = (re.search('(?<=<div>).+(?==)',response.content.decode()).group())

# 解析公式
result = eval(result)
print(result)

html = s.post(url,{'value':str(result)})

print("The second response:")
print_response(html)





###
The first response:
Server: nginx
Date: Wed, 25 Nov 2020 12:12:36 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=60
Set-Cookie: PHPSESSID=c076a1rj4gs4p75vs0hvslqf5ehccj99; path=/; HttpOnly, Timeout=alive; expires=Wed, 25-Nov-2020 12:12:38 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip

<head>
<title>下面的表达式的值是秋名山的车速</title>
<meta charset="UTF-8">
</head>
<p>亲请在2s内计算老司机的车速是多少</p>
<div>1310615970-1188642998*717630350+1859300341+539949424-1157666960*1524438752-1832476037*279122508-1343317687-288438169=?;</div>
<style>
div,p{
text-align: center;
margin: 0 auto;
}
</style>
-3129283971633054137
The second response:
Server: nginx
Date: Wed, 25 Nov 2020 12:12:36 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=60
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip

原来你也是老司机 Bugku{YOU_DID_IT_BY_SECOND}

'''



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值