2.hacking-lab脚本关[详细writeup]

本文详细介绍了XSS挑战赛中的两个脚本关卡——“key又又找不到了”和“快速口算”的解题过程及技巧。针对“key又又找不到了”,通过分析页面跳转逻辑和使用Python脚本获取隐藏的key值;对于“快速口算”,利用Python脚本自动计算并提交答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

二、脚本关

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);
	###########################################################################
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qwsn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值