2017网络空间安全实验班选拔赛wp

渣渣只能膜fish大佬和宋神了,顺便吐槽一下自己的选择题做的是真的垃圾

Web01

第一题先看源码,得到发现可以用常规思路万能密码绕过
构造
username=’ or ‘1’=’1’#
Password随便即可绕过
即可构造出select * from users where name = ‘’ or ‘1’=’1’#andxxxxx
因为#是注释所以注释掉了后面语句

得到flag
flag{justForTestL0g1n}

WEB7

第二题可以构造后台语句
Username=0 union select 1,2,md5(1)#
Password=1
绕过,得到flag
这里可以先猜测数据库有3列,id,username,password,然后通过联合查询使password字段为1的md5值
这样通过输入password=1可以实现经过后台逻辑判断可以绕过。
flag{Second2@16L0g1n}

WEB05

上御剑

访问robots.txt

访问flag.txt

Web04

这题一开始没啥思路,上御剑扫目录
结果发现一个.index.php.swp源码泄露
先贴一下源码

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
<?php 
if ("POST" == $_SERVER['REQUEST_METHOD'])
{
$password = $_POST['password'];
if (0 >= preg_match('/^[[:graph:]]{16,}$/', $password))
{
echo '鐪熺殑鍚楋紒锛 '; exit;
}

while (TRUE)
{
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';

if (6 > preg_match_all($reg, $password, $arr))
break;
$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower');

foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}

if ($c < 3) break; if ("2017" == $password)
{
include_once("flag.php");
echo $flag;
}
else echo 'Duang锛侊紒锛 '; exit; } }
?>

审计源码,这里我不知道graph是啥意思(后来知道了是除(空格键与[TAB]键)之外的所有按键) )。只好fuzz,fuzz了半天发现原来是要输入超过16位,而且必须结果等于2017,这里我当时想到了俩个思路一个是0x7E1另外一个是2017.0000000000000000001
后面有说必须要有标点,大小写,数字一大堆的,了解了原理,本地搭建一个环境进行fuzz一下


结果发现本地fuzz出一个,结果弄进去不给我过ORZ

1
0x7E1&111111111111

继续fuzz半天发现了一个发现2017.0000000000是等于2017然而缺少字母,想到了eN等于10的N次方
所以最后的payload

1
20170.000000000000000000000e-1

web02 抽奖

这题没毛病,以前打陕西省网络空间安全的时候做的题,这次再做的时候莫名其妙找不到JSFuck了,晕,幸好本地正好直接有当时的wp,随手试了试了一下当时的flag发现直接可以过,(吐槽一下出题人真是懒,flag都没改)这里贴一个链接,感兴趣的小伙伴可以去看一下http://blog.csdn.net/qq_35078631/article/details/70256502

Web03

这题没撸了好长没弄出来,就先说一下思路吧,首先御剑扫到了一个flag.php,所以我们尝试读取flag.php,但是好像做了黑名单检测,就是读不了,这里我尝试了一下../发现貌似会被替换为空,然而放在tes../t.txt文件就不存在了,ORZ。然后00截断啥的尝试了一下也没啥用就放弃了。。

cipher0x

第一题提示放射密码,直接用上学期老胡布置的作业的完整版本程序跑一下就好了,源码如下

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
void sttub(int t,int s);
void sttuben();
void sttuban();
char p[1000],str[1000]={0},q[1000]={0};
int count[26]={0},k1[12]={1,3,5,7,9,11,15,17,19,21,23,25};
int k2,k3,c,i,n,t,s,ch;
int main()
{
printf("选择一种模式:1—>加密,2—>解密,3—>暴力破解,4—>字频破解\n");
scanf("%d",&c);
switch(c)
{
case 1:
{
system("color E");
printf("请输入明文\n");
fflush(stdin);
gets(p);
ch=strlen(p);
printf("请输入密钥\n");
scanf("%d,%d",&t,&s);
for(n=0;n<ch;n++)
{
if((p[n]>='A')&&(p[n]<='Z'))
str[n]=(t*(p[n]-'A'+s))%26+'A';
else if((p[n]>='a')&&(p[n]<='z'))
str[n]=(t*(p[n]-'a'+s))%26+'a';
else
str[n]=p[n];
}
printf("密文:%s\n",str);
}break;
case 2:
{
system("color A");
printf("请输入密文\n");
fflush(stdin);
gets(p);
ch=strlen(p);
printf("请输入密钥\n");
scanf("%d,%d",&t,&s);
sttub(t,s);
printf("%s\n",str);
}break;
case 3:
{
system("color C");
fflush(stdin);
printf("请输入需要破解的密文\n");
gets(p);
ch=strlen(p);
sttuben();
}break;
case 4:
{
system("color E");
printf("请输入需要破解的密文\n");
fflush(stdin);
sttuban();
}
}
}
void sttub(int t,int s)
{
for(k3=0;k3<1000;k3++)
if((t*k3)%26==1)
break;
for(n=0;n<ch;n++)
{
if((p[n]>='A')&&(p[n]<='Z'))
str[n]=(k3*(p[n]-'A'-s)+2600000)%26+'A';
else if((p[n]>='a')&&(p[n]<='z'))
str[n]=(k3*(p[n]-'a'-s)+2600000)%26+'a';
else
str[n]=p[n];
}
}
void sttuben()
{
for(i=0;i<12;i++)
for(k2=0;k2<26;k2++)
{
sttub(k1[i],k2);
if(strstr(str,"FLAG")||strstr(str,"flag"))
printf("该句含FLAG: { %s }\n",str);
else
printf("%s ",str);
}
}
void sttuban()
{
int x,y;
int max=0,min=100000;
gets(p);
ch=strlen(p);
for(i=0;i<ch;i++)
q[i]=toupper(p[i]);
for(i=0;i<ch;i++)
if((q[i]>='A')&&(q[i]<='Z'))
count[q[i]-'A']++;
for(i=0;i<26;i++)
{
if(count[i]>max)
{
max=count[i];x=i;
}
if(count[i]<min)
{
min=count[i];y=i;
}
}
for(i=0;i<12;i++)
for(k2=0;k2<26;k2++)
if((x==((k1[i]*('E'-'A')+k2)%26))&&((y==((k1[i]*('Z'-'A')+k2)%26))))
{
t=k1[i];s=k2;
printf("%d %d\n",t,s);
break;
}
sttub(t,s);
printf("%s\n",str);
for(i=0;i<26;i++)
printf("%c-->%d\n",i+'A',count[i]);
}

网信 007

这题用wireshark追踪一下tcp流,在发现传输了一个hello.txt和secret.png的图片,在20流左右发现了png的16进制右键以原始数据流的形式提取出来,打开发现flag

真有这么难?

这题真的不记得了,下载下来发现有个zip,好像flag.txt藏在其中一个文件夹里面

编程小练习

只能说这题太恶心了,最后一次机会才试出来,差点给跪,原来要加flag{Akye}

1
2
3
str = 'balabalabalabala'

print str[98]+str[300]+str[1200]+str[1332]