fifth-day

 · 2019-8-3 · 次阅读


16.web4(http://123.206.87.240:8002/web4/)
  进入页面后,提示我们查看源代码?那好咱先查看源代码。
在script标签中发现如下所示的代码:

  首先这个%应该是一种编码方式,先看一下这个unescape的用法。这个是一种加解密的方式,那先把p1和p2解密一下。
function checkSubmit(){
var a=document.getElementById(“password”);
if(“undefined”!=typeof a){
if(“67d709b2baa648cf6e87a7114f1”==a.value)
return!0;
alert(“Error”);
a.focus();
return!1}
}
  document.getElementByI(“levelQuest”).onsubmit=checkSubmit;
可以看到p1和p2解码后得到了一个检查提交函数,这道题是一个代码审计类题目。先读一下其内容,变量a=对象document的一个getid方法的password的值。然后是如果undefined不等于a的值并且a的值为67d709b2baa648cf6e87a7114f1就返回零否则会让a调用focus方法,返回1.这儿这上面应该有个大括号不然又是返回0又是返回1的就很懵逼。先把这一长串的解码试试吧,这个好像解码不出来,去表单直接提交试试。提示是再好好看看,欸等一下啊我好像漏了一小串编码%35%34%61%61%32’ + p2后面这个解码函数前面还有一小串,我加上去解码再连接。67d709b2b54aa2aa648cf6e87a7114f1=a.value,再去表单提交一下,成功拿下flag.
  summary:这道题总体对我来说难度不是很大,只有这个Unescape这个不怎么认识,其他都能顺着代码解出来,因而这道题收获在更加熟练的审计代码吧,然后又了解了新的一种加密方式,这儿写完后再去多读哈这个unescape.
17.flag在index里(http://123.206.87.240:8005/post/)
  进入页面有一个小链接click me? no那我就点进去看看。链接上面可以看到打开了show.php,然后显示了一个test5先留在这里回去主页面查看下其他的F12。没有什么重要的信息,那目前唯一有用的是index了。这时候就涉及到一个php:filter,对于这个我一直不是很熟悉乘着这个机会我再去了解一下,至于我为什么知道该用这个呢,诶诶,难道是萌新的知觉。
  在CSDN上看到的一串理解:php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字,filter,可以很容易想到这个协议可以用来过滤一些东西;这儿还没有说明它的功能,我的理解是这样的,一些重要的敏感文件肯定是先用编码编码过一次的,并且可能用的是会引起PHP代码冲突的,这种情况下就会使用到php:filter这个协议。
  构造?file=php://filter/read=convert.base64-encode/recource=index.php这儿的过滤应该理解为筛选出来,而不是不要的部分过滤掉,刚好过滤出来是我们需要的,跟那个wireshark抓包那个过滤器类似。至于这个写法呢,是我在一个博文上看到的,现在到了理解时间。首先是构造的file=这个就不用说了要查看Index文件之后是写的php的filter协议这样之后都是以/文件路径名分隔,read过滤的是base64编码的,然后recource过滤最重要的index.php,就相当于过滤出来经过base64编码的index文件与之前理解的因为这些文件经过编码因而需要使用到过滤器是一样的。我试试交换顺序写会怎么样,果然没有任何显示了看来这个过滤有层次之分,先是说明其条件最后写入这个recource=文件名。在之前是用的read=convert.base64-encode方式过滤编码。好了对于这个学习先到这里,继续做这道题,输入构造语句后会得到下面这一串:
太长就不复制了,,直接拿到BPbase64里去解码得到以下代码:

Bugku-ctf click me? no';} $file=$_GET['file']; if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){ echo "Oh no!"; exit(); } include($file); //flag:flag{edulcni_elif_lacol_si_siht} ?>   无错误回显不说了,如果get方式没有提交了file的话,就链接到href后面那个地址去,file变量的值也为get提交, 百度了一下:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。 接着百度了一下:stristr() 函数搜索字符串在另一字符串中的第一次出现。 注释:该函数是二进制安全的。 注释:该函数是不区分大小写的。如需进行区分大小写的搜索,请使用 strstr() 函数。

  两个函数都是搜索第二个字符串在第一个字符串的首次出现的地址,那我们来看一下题目的代码部分:strstr($file,”../“)||stristr($file, “tp”)||stristr($file,”input”)||stristr($file,”data”)。欸我突然发现flag已经给我了呀,,对哈我做题是为了flag吗,那当然不是我是像给他的逻辑处理搞清楚一点,其实是莫名其妙解出题的- -mengbi 3 连。继续看代码,也就是说如果它出现了其中一种情况,就会输出oh no也就是解题失败,那么看下限制了些什么,首先是../,我寻思着这个是根目录的写法吗,之后是tp,还有input,data,也就是限制了它的input流,data流以及tp。还是百度一下这些东西吧。./表示当前目录,../表示父级目录,这个是相对路径中使用的,代表上一级目录。
php://filter的限制
要求将传进来的参数进入include();而源代码中便有include($file);因而这道题其实是一个文件包含漏洞,也就是说使用了文件包含的才能使用php://filter这个,我以为以后的题都能这样了哈哈。。不过这里也对这个更清楚的了解了,但关于这个include文件包含的问题。我得下去好好补补功课了。
  summary:这道题的不熟练说明自己的知识储备量还不够足,首先对于PHP协议流的不充分掌握以及对于什么情况可以使用PHP协议流就更不知道了,再者就是对于PHP函数,,老问题,学的不够彻底,每次都还需要查看手册才能记起函数的用法,这样会耽搁一定的时间,不过没关系学习是个积累和循序渐进的过程,以后会越来越顺利的,这也是今天一天的总结了,总计约1个半小时,共计2道CTF题目。