- 一. key又又找不到了
- 二. 快速口算
- 三. 这个题目是空的
- 四. 怎么就是不弹出key呢?
- 五. 逗比验证码第一期
- 六. 逗比验证码第二期
- 七. 逗比的验证码第三期(SESSION)
- 八. 微笑一下就能过关了
- 九.逗比的手机验证码
- 十. 基情燃烧的岁月
- 十一. 验证码识别
- 十二. XSS基础关
- 十三. XSS基础2:简单绕过
- 十四. XSS基础3:检测与构造
- 十五. Principle很重要的XSS
还是hackinglab 参考
一. key又又找不到了
点击链接, 跳转后抓包. 查看response包, 发现:
<script>window.location="./no_key_is_here_forever.php"; </script>
key is : yougotit_script_now
二. 快速口算
#!/usr/bin/env python3
# Author: renzongxian
import requests
import re
url = 'http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php'
header = {'Cookie': 'PHPSESSID=$Your Cookie'}
# 获取算式
resp_content = requests.get(url, headers = header).content.decode('utf-8')
matches = re.search("(.*)=<input", resp_content)
# 发送结果
# 提交数据也是键值对形式, 根据源码中的<input type="text" name="v">可知下行中v的由来
data = {'v': str(eval(matches.group(1)))}
resp_content = requests.post(url, headers=header, data=data).content.decode('utf-8')
# 取得响应内容
matches = re.search("<body>(.*)</body>", resp_content)
print(matches.group(1))
python
学的不是很好
正则表达式
-
(.*)正则表达式(.*)涉及到贪婪模式。当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。 -
(.*?)正则表达式 懒惰匹配,也就是匹配尽可能少的字符。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。a.?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
matches.group()
group是针对 () 来说的,group(0)就是指的整个串,group(1) 指的是第一个括号里的东西,group(2)指的第二个括号里的东西。
eval()
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
三. 这个题目是空的
输入null就行了..
四. 怎么就是不弹出key呢?
图书馆的空调怕是想冻死我…
flag: slakfjteslkjsd
- 查看网页源代码发现点击链接会触发 JS 代码中的函数
a(), 但是 JS 代码中有三个return false;的函数导致函数a()失效. - 将代码完整复制到本地的html文件,然后把
<script>标签那3个干扰的函数删除, 最后在浏览器里打开就可以弹窗了.
五. 逗比验证码第一期
根据题目提示, 验证码不会过期. 输入密码和验证码, burp抓包爆破即可.
关于burp爆破
针对本题熟悉一下burp爆破的步骤: 参考
- 输入密码和验证码, 提交.
- burp抓包.
send to intruder. - burp会默认将所有可能需要爆破的量都用
$做标记, 所以我们需要先点击右边的clear清除所有的$, 然后选中我们想要爆破的量也就是pwd后面的值,点击add进行标记. payload sets设定字典类型, 这里选择numbers.- 根据题目提示, 设定
payload options的数字范围为从1000-9999,step为1. - 为了让速度更快, 设定线程数为
10.options->request engine->number of threads为10. - 选择左上角
instruder->start attack进行爆破. - 爆破结束后主要看页面中的
length, 不一样的就是成功登陆的,通过下面的response我们可以看到登陆成功后返回的信息,在这里也就得到了key.
六. 逗比验证码第二期
验证便失效的验证码
根据网上的思路就是既然验证码失效, 那就直接设置包里面的验证码值为空, 这里是vcode的值为空.
username=admin&pwd§=admin§&vcode=&submit=submit
步骤与第五题一样, 爆破得到key.
七. 逗比的验证码第三期(SESSION)
加入了 session 验证,把 cookies 的内容删掉就好.
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.
修改部分:
Cookie: PHPSESSID=
username=admin&pwd=§admin§&vcode=&submit=submit
剩下步骤和前两题一样, 用burp爆破.
八. 微笑一下就能过关了
(1) 源码
查看源码, 观察发现:
<form name="login" action="index.php" method="POST" accept-charset="utf-8">
<ul>
<li>
<label for="SMILE">请使用微笑过关<a href="?view-source">源代码</a></label>
<input type="text" name="T_T" placeholder="where is your smile" required>
</li>
<li><input type="submit" value="Show"> </li>
</ul>
</form>
地址栏访问:?view-source. 得到php源码.
<?php
header("Content-type: text/html; charset=utf-8");
if (isset($_GET['view-source'])) {
show_source(__FILE__);
exit();
}
include('flag.php');
$smile = 1;
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;
if ($smile) {
if (@file_exists ($_GET['^_^'])) $smile = 0;
}
if ($smile) {
$smile = @file_get_contents ($_GET['^_^']);
if ($smile === "(●'◡'●)") die($flag);
}
?>
(2) 需要满足条件
发现需要满足的条件有:
- 必须对
^_^赋值 ^_^的值不能有.%[0-9]httphttpsftptelnet这些东西$_SERVER['QUERY_STRING'],即^_^=(输入的值)这个字符串不能有_这个字符- 满足
$smile!=0 file_exists ($_GET['^_^'])必须为0.也就是$_GET['^_^']此文件不存在$smile必须等于(●'◡'●).也就是file_get_contents($_GET['^_^'])必须为(●'◡'●)
(3) 矛盾与解决
逻辑矛盾处:
QUREY_STRING过滤了_但是$_GET[‘^_^’]又含有_.file_exists需要寻找的文件必须不存在, 但`file_get_contents却能读取到文件内容.
分析
- 可以采用Url编码变为
%5f. 这样第3点就满足了. 所以我们输入就应该为^%5f^ file_get_contents可以获取远程数据, 但常用网络协议已经被正则过滤, 因此需要选取其他协议. 而在php支持的协议和包装中,RFC 2397的data协议可用. 并且,file_exists对于data指向内容判断为不存在.
最后构造: ^%5f^=data:,(●'◡'●), 即url输入?^%5f^=data:,(●'◡'●). 即可以得到flag.
九.逗比的手机验证码
跟着步骤来就行. 注意获得验证码并返回后, 不仅要填写验证码也要修改手机号.
十. 基情燃烧的岁月
- 先爆破验证码, 爆破成功后可以得到一个新的手机号
- 输入新的手机号, 随意填写一个验证码, 抓包, 再爆破验证码.(一开始我在这一步用上一步爆破成功的验证码, 结果这一步爆破失败了, 所以这里的验证码随便填就好)
- 得到的flag记得去掉大括号
{}.
十一. 验证码识别
谷歌了一下, 没有解决出来, 为不影响进度, 跳过.
- 可以用Python识别验证码
- 也可以用
pkavhttpfuzzer这款工具
有时间研究一下python识别验证码. mark一下, 防止忘记.
十二. XSS基础关
根据源码: 能alert(HackingLab)就能拿key. 同理后面几题可以发现都是这个意思.
没看懂源码…
没有过滤. 输入框中输入: <script>alert(HackingLab)</script>即可.
chrome有xss 过滤器功能. 要么关闭, 要么用firefox.
十三. XSS基础2:简单绕过
<img src="#" onerror=alert(HackingLab) />
或者<img src=1 onerror=alert(HackingLab)>都一样.
我怎么感觉现在才到了正常的xss
十四. XSS基础3:检测与构造
没怎么仔细研究xss
尝试可以发现:
- 过滤了
<, 没有过滤>. - 输入
<script></script>会提示检测到xss, 所以不能用. - 输入
hello'hello, 看似'被过滤了, 查看源码会发现并没有被过滤.
'去闭合input框value的单引号:
alert(hahaha)' onclick=alert(HackingLab)>
onclick是绑定事件,告诉浏览器在鼠标点击时候要做什么
十五. Principle很重要的XSS
两种方法:
- 打开
console,输入alert(HackingLab)即可. - 用
hackbar, 已经收费了…..跳过.
hackbar 另一个版本, 不收费! hackbar-for-firefox-57