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}
'''
【Bugku】秋名山老司机 详细题解 Writeup
最新推荐文章于 2023-11-16 23:00:24 发布