99常识网

四,网络安全实验吧CTF实战之WEB渗透和隐写术解密

admin 383
一.WEB之这是什么

题目描述:

打开链接如下图所示,确实是什么鬼东西。

题目解析:

1.它们其实是Jother编码,它是一种运用于Javascript语言中利用少量字符构造精简的匿名函数方法对于字符串进行的编码方式,其中少量字符包括"[","]","{","}","(",")","!","+"。这些字符就能完成对任意字符串的编码,本质上是一种Javascript的编码,其优点是代码字符就那么几个,比较好记,缺点是编码极其冗长和复杂。

这种编码一般现在只会出现在CTF比赛中,实际开发中用的到就很少了。

2.打开Chrome浏览器,按F12键选择控制台Console,将代码复制过去回车即可得到flag值。

3.得到该题的密码:Ihatejs。

正确答案:Ihatejs

二.隐写术之水果

打开网页如下图所示,显示一张水果的图片,flag就隐藏在图片中。作者第一反应是查看源代码,哈哈~原谅我这个小白第一次学习。

题目解析:

1.将图片另存为本地。

2.从CSDN下载Stegsolve工具,它是用于图像解析的工具,然后导入本地图片,按方向键右键不断切换,直到出现下图的二维码。

如下图所示:

3.使用手机扫描二维码,得到一串数字,我们根据数值可以分析,这是十进制的ASCII码。

4.将数字转换为ASCII,45对应“-”、46对应“.”、32对应空格。

4546454632-.-.4532-4646454632..-.4645464632.-..464646324546464632-46464545464532..--.-4546464632-464646324645464632.-..

5.它们就是传说中的摩斯密码。根据下面的对照表,其结果为:CTFLSB_BSL

正确答案:CTF{lsb_bsl}

三.隐写术之小苹果

题目原理和上一题一样。

题目描述:

题目打开也是一张图片,中国结。

题目解析:

1.下载图片至本地并打开,得到如下二维码:

2.二维码包含如下数字。

\u7f8a\u7531\u5927\u4e95\u592b\u5927\u4eba\u738b\u4e2d\u5de5

这是unicode编码的方式,让我们在相关网站(搜索“unicode解码即可”)中进行解码,得到中文“羊由大井夫大人王中工”,这是一种从未见过的加密方式。

3.通过百度了解到该加密为当铺密码,曾在CTF题目中出现过,我们按照编码规则进行解码,得到数字:9158753624。

4.再回头分析图片可知,里面包含了一个压缩文件,我们通过修改扩展名为.ZIP并解压,得到了的音频文件。

5.使用mp3隐写术工具MP3Stego的对其进行解码,密码就是我们刚刚得到的那串数字9158753624。解码后得到字串Q1RGe3hpYW9fcGluZ19ndW99。

6.通过尝试,在base64解码中得到了正确的结果:CTF{xiao_ping_guo}。

正确答案:CTF{xiao_ping_guo}

四.WEB之天网管理系统

题目描述:

题目显示如下图所示,需要输入正确的用户名和密码获取flag。

考点:PHP弱类型

题目解析:

四,网络安全实验吧CTF实战之WEB渗透和隐写术解密

1.查看网页源代码如下所示,注意注释的提示。

!--$test=$_GET['username'];$test=md5($test);if($test=='0')--

2.需要用户名传入一个字符串,并且它经过md5加密后要等于0。

注意,PHP某些情况会把类数值数据(如含有数字的字符串等)转换成数值处理。在使用“==”运算符对两个字符串进行比较时,PHP会把类数值的字符串转换为数值进行比较,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。比如:‘3’=='3ascasd’结果为true。

因此只要找到一个字串加密后第一个字符为0即可,这里提供几个:240610708、aabg7XSs

3.用户名输入“aabg7XSs”,此时返回的提示信息如下图所示。

4.访问该页面显示内容如下图所示:
函数serialize()是对输入的数据进行序列化转换,把变量和它们的值编码成文本形式。
函数unserialize()是还原已经序列化的对象,对单一的已序列化的变量进行操作,将其转换回反序列化PHP的值。

$unserialize_str=$_POST['password'];$data_unserialize=unserialize($unserialize_str);if($data_unserialize['user']=='???'$data_unserialize['pass']=='???'){print_r($flag);}

这段代码是将Post提交的密码值经过unserialize()函数反序列化处理,得到一个数组,要求数组里的user和pass都等于值“???”,此时输出flag。那么,这个“???”又是什么内容呢?

5.此时“成也布尔,败也布尔”提醒我们。

bool类型的true跟任意字符串可以弱类型相等。因此我们可以构造bool类型的序列化数据,无论比较的值是什么,结果都为true。(a代表array,s代表string,b代表bool,而数字代表个数/长度)

?phperror_reporting(0);$test='';$test=array("user"=1,"pass"=1);echovar_dump($test);echovar_dump(serialize($test));$test1='';$test1=array("user"=true,"pass"=true);echovar_dump($test1);echovar_dump(serialize($test1));?

找个在线PHP网站进行测试,输出如下图所示:string(36)“a:2:{s:4:“user”;i:1;s:4:“pass”;i:1;}”

6.构造password值为:a:2:{s:4:“user”;b:1;s:4:“pass”;b:1;},输出最后的flag。

正确结果:ctf{dwduwkhduw5465}

五.WEB之忘记密码

题目描述:

题目显示如下图所示,需要输入正确的邮箱找回密码。

考点:vim备份文件泄露

题目解析:

1.首先我们随便输入一个密码,如“123456”看返回结果。

返回如下图所示,注意“”页面。

2.查看源代码,发现提醒用户名为admin,输入邮箱为“admin@”。

输入该邮箱发现Scripts提醒变成了“邮箱已送到管理员邮箱了,你看不到”,真是逗~

3.这里有个细节,页面跳转了一下,然后又跳转回step1,说明step2里面有猫腻!页面跳转这么快,那我们该怎么去看这个页面呢?这时候要用到一个名叫BurpSuite的神器,抓包拦截。

显示立刻跳转:

方法一:在Target查看目录树发现有个“”文件。

方法二:使用Repeater,查看响应Response。

将GET方法的网址修改为,然后响应表单提交为“”。

4.赶紧查看该网页,结果提醒“youarenotanadmin”,有权限访问该页面,但不是管理员不透露信息。有意思~

5.再回到最初的源代码,这里有个非常重要的提示信息——编辑器采用的是VIM。

这个题目叫备份文件泄露,我们知道这个VIM编辑器可以存放临时文件,而临时文件会存放信息,咱们可以尝试一下访问临时文件,格式如下:

/10/upload/.

PS:因为vim备份文件是隐藏文件,所以需要加上一个点“.”。

6.尝试打开.文件。

重点是后面的if判断语句,这个条件必须要满足token的长度必须等于10,并且token的值为0,咱们可以构造十个0试试。

..这一行是省略的代码..if(!empty($token)!empty($emailAddress)){if(strlen($token)!=10)die('fail');if($token!='0')die('fail');$sql="SELECTcount(*)asnumfrom`user`wheretoken='$token'ANDemail='$emailAddress'";$r=mysql_query($sql)ordie('dberror');$r=mysql_fetch_assoc($r);$r=$r['num'];if($r0){echo$flag;}else{echo"失败了呀";}}

7.最终构造的结果如下:

;token=0000000000

然后访问得到如下结果:

正确答案:flagisSimCTF{huachuan_TdsWX}

六.WEB之false

题目描述:

题目显示如下图所示。

考点:PHP代码审计(PHPCodeAudit)

题目解析:

;password=2

?phpif(isset($_GET['name'])andisset($_GET['password'])){if($_GET['name']==$_GET['password'])echo'pYourpasswordcannotbeyourname!/p';elseif(sha1($_GET['name'])===sha1($_GET['password']))die('Flag:'.$flag);elseecho'pInvalidpassword./p';}else{echo'pLoginfirst!/p';?

它的含义是GET获取name和password,然后进行判断。
(1)if($_GET[‘name’]==$_GET[‘password’]),用户名和密码相等,提示如下。

(2)elseif(sha1($_GET[‘name’])===sha1($_GET[‘password’])),用户名名和密码的sha1加密散列值相等,执行die函数。

(3)以上都不是返回“Invalidpassword”。

(4)未输入用户名和密码,提示“Loginfirst”。

3.函数说明:

die()函数:停止程序运行,输出内容

sha1()函数:计算字符串“Hello”的SHA-1散列。默认的传入参数类型是字符串型

isset()函数:检测变量是否已设置并且非NULL。

若变量不存在则返回FALSE,若变量存在且其值为NULL,也返回FALSE,若变量存在且值不为NULL,则返回TURE。同时检查多个变量时,每个单项都符合上一条要求时才返回TRUE,否则结果为FALSE。

参考官网:
?php$a=array('test'=1,'hello'=NULL,'pie'=array('a'='apple'));var_dump(isset($a['test']));//TRUEvar_dump(isset($a['foo']));//FALSEvar_dump(isset($a['hello']));//FALSE//键'hello'的值等于NULL,所以被认为是未置值的。//如果想检测NULL键值,可以试试下边的方法。var_dump(array_key_exists('hello',$a));//TRUE//Checkingdeeperarrayvaluesvar_dump(isset($a['pie']['a']));//TRUEvar_dump(isset($a['pie']['b']));//FALSEvar_dump(isset($a['cake']['a']['b']));//FALSE?

4.这里需要执行“if(sha1($_GET[‘name’])===sha1($_GET[‘password’]))”语句。

重点:sha1()函数默认的传入参数类型是字符串型,也可以传入其他类型,使其返回值为false,如数组类型。再加上题目标题false,可以想到构造FALSE===FALSE拿到flag。

构造网址:

[]=1password[]=2

正确结果:Flag:CTF{t3st_th3_Sha1}

七.WEB之天下武功唯快不破

题目描述:

题目显示如下图所示,提醒“Youmustdoitasfastasyoucan!”。

考点:Python脚本

题目解析:

1.尝试SQL注入都无反应,接着查看源代码,发现一个提示信息:

!--pleasepostwhatyoufindwithparameter:key--

2.根据题目内容,试图将网页链接速度放慢,这里可以采BurpSuite抓包,Proxy的intercept载入网页,并将抓到的信息发到repeater中Go一下,会发现一个FLAG值。另一种方法,Chrome浏览器审查网络状态。

3.在响应头中发现了FLAG,看起来像是一个Base64编码,尝试在线解码。

但是该值每次生成的值是随机的。

FLAG:UDBTVF9USElTX1QwX0NINE5HRV9GTDRHOnZhbmRmQXp1Zg==

解码:P0ST_THIS_T0_CH4NGE_FL4G:vandfAzuf

FLAG:UDBTVF9USElTX1QwX0NINE5HRV9GTDRHOktsSVBLWmVkOQ==

解码:P0ST_THIS_T0_CH4NGE_FL4G:KlIPKZed9

4.回想之前的注释(pleasepostwhatyoufindwithparameter:key)以及解密后的FLAG值,需要快速提交POST,故采用Python脚本实现。哈哈,又回到熟悉的语言。

获取FLAG值设置POST请求pdata={'key':flag}result=(url=url,data=pdata)print()#响应

5.运行得到如下结果。

正确答案:CTF{Y0U_4R3_1NCR3D1BL3_F4ST!}