
二、脚本关
1.key又又找不到了
分值:200
提示:
小明这次哭了,key又找不到了!!! key啊,你究竟藏到了哪里,为什么我看到的页面上都没有啊!!!!!!
通关地址
解题步骤:
第一步:访问通过地址,发现了一个a标签超链接,查看html源码后发现跳转的目的是search_key.php。
第二步:点击超链接,研究回显的内容,以及网络监测。
第三步:通过BurpSuite拦截,我们发现search_key.php页面使用了windows.location="./no_key_is_here_forever.php"从而跳转页面。同时发现了真正的key值。
第四步:python脚本直接获取key值
# coding=utf-8
# 引入requests库
import requests
# 设置待访问的目标url地址。
url='http://lab1.xseclab.com/xss1_30ac8668cd453e7e387c76b132b140bb/search_key.php';
# 实例化一个名为http的requests库的session类的对象,用于保持持久会话。
http = requests.Session();
# 以get形式访问目标url,同时不允许重定向,默认也是不允许的。
response = http.get(url, allow_redirects = False);
# 设置请求返回的页面结果编码为utf-8
response.encoding = 'utf-8';
# 打印输出返回的页面结果
print(response.text);
# 打印输出状态码
print(response.status_code);
做题总结:
(1)js的window.location方法-属性描述:
assign() 导航到一个新页面
reload() 强制从服务器重新加载当前页面
replace() 使用新的url替换本页面
(2)以下两种方法的效果等同:都是跳转到一个指定的页面。
方法1:window.location.assign("https://clqwsn.blog.csdn.net/");
方法2:window.location = "https://clqwsn.blog.csdn.net/";
(3)session会话:
requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象去访问该网站的其他网页都会默认使用该session之前使用的cookie等参数。
因此requests.session()起到了维持会话的作用,通俗的说就是可以让我们在跨请求时保存某些参数。
(4)requests.get() 跟 request.session().get() 的异同点:
两个都是基于 sessions.Session 发送get请求的,区别仅在于前者请求完即刻断开连接(连接只用一次),后者需要手动断开连接(连接可以反复用)。
(5)两种get请求的语法如下所示:
#########################################
# 1.requests直接发起get请求。
response = requests.get(url)
response.encoding='utf-8'
print(response.text)
#################分界线###################
# 2.先创建一个session对象,后发起get请求。
http = requests.Session()
response = http.get(url)
response.encoding='utf-8'
print(response.text)
#################分界线###################
2.快速口算
分值:350
提示:
小明要参加一个高技能比赛,要求每个人都要能够快速口算四则运算,2秒钟之内就能够得到结果,但是小明就是一个小学生没有经过特殊的培训,那小明能否通过快速口算测验呢?
通关地址
解题步骤:
第一步:访问通过地址,发现是一道简单的计算题,但是需要2秒计算出来并且提交给表单。
第二步:我们使用python脚本,自动计算并且把计算结果提交给表单的v参数。
# coding=utf-8
# 引入requests库
import requests
# 引入re库
import re
# 设置待访问的目标URL
url = 'http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php';
# 实例化一个名为http的requests库的session类,该类中存储了get、post方法,可以发起Get、POST请求。本质作用是为了维持会话。
http = requests.Session();
# 向目标url发起Get请求,同时把结果返回给response
response = http.get(url);
# 返回页面结果设置编码为utf-8
response.encoding = 'utf-8';
# 打印输出返回的页面结果
print(response.text);
# 对计算题目进行截取,返回给num(正则匹配)
num = re.findall(re.compile(r'<br/>\s+(.*?)='),response.text)[0];
# 最后向目标url发起post请求,同时传递num计算后的值给参数v
response = http.post(url, data={'v': eval(num)});
# 返回页面结果设置编码为utf-8
response.encoding = 'utf-8';
# 打印输出返回的页面结果
print(response.text)
做题总结:
(1)正则匹配的语法:re.findall(pattern,str)
解释1: re.findall() 函数是返回某种形式(比如String)中所有与pattern匹配的全部字符串,返回形式为数组。
(总而言之:返回第二个参数中与第一个参数匹配的内容,并且以数组形式返回)。
解释2: re.compile() 方法用于在脚本执行过程中编译正则表达式,也可用于改变和重新编译正则表达式。
解释3: '.*?'是对它的前后部分作为开始结束部分进行截取,中间内容可以为空,也就是只有开始和结束部分。
解释4: 而'(.*?)'也是把其前后作为开始结束,但是只截取括号部分,也就是不包含开始结束部分,截取的是中间部分!!!
# 示例1:非贪婪1,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取,例如:
###########################################################################
str = 'aabbabaabbaa';
print(re.findall(r'a.*?b',str));
# ['aab', 'ab', 'aab']。
###########################################################################
# 示例2:非贪婪2,与上面一样,只是与上面的相比多了一个括号,只保留括号的内容:
###########################################################################
str = 'aabbabaabbaa';
print(re.findall(r'a(.*?)b',str));
# ['a', '', 'a']
###########################################################################
# <br/>用于匹配换行符
# "\s"匹配任何空白字符,其等价"[\r\n\x20\t\f\v]"。
# 字符"+"重复匹配前面的一个字符一次或多次。
# 综上,示例3:
###########################################################################
num=re.findall(re.compile(r'<br/>\s+(.*?)='),response.text)[0];
# python中的eval()函数是用来计算所有
# 数学的代数计算式
calc_result=eval(num);
print(num);
###########################################################################
# 综上,示例4:最后用session对象建立的持久会话以post形式提交我们计算的结果给参数v
###########################################################################
# data参数是传递的值,以字典的键值对形式传递给参数v
# 也可以有allow_redirects=False参数,是禁止重定向
response=http.post(url,data={'v': eval(num)});
print(response.text);
###########################################################################