LFI-labs靶场通关教程
目录
CMD01-06
pass01
pass02
pass03
pass04
pass05
pass06
HDR-1
hdr-1
LFI-01-14
pass01
pass02
pass03
pass04
pass05
pass06
pass07
pass08
pass09
pass10
pass11
pass12
pass13
pass14
CMD01-06
pass01
看看源码,
这里显示的是一个get参数cmd,并且会进行执行于是就可以输入查看目录,whoami等一系列命令:
ls /``cat /flag
即可得到flag:
pass02
看看源码:
这里是和上一题类似,只是方法该用了post方法,于是解题还是就可以使用上一题的方法
pass03
看看界面吧:
看起来还是一个输入界面,这里可以看看源码:
这里可以看出是将domain参数的值就直接拼接到了system函数里面,于是这里就可以执行多条命令,使用分号或者逻辑运算符号进行执行:;ls /
;cat /flag
;whoami
pass04
这一关是上一关的post版本, 解法和上一关类似
pass05
<?php if (preg_match('/^[-a-z0-9]+\.a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|t[cdfghjklmnoprtvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]|biz|cat|com|edu|gov|int|mil|net|org|pro|tel|aero|arpa|asia|coop|info|jobs|mobi|name|museum|travel|arpa|xn--[a-z0-9]+$/', strtolower($_GET["domain"]))){ system("whois -h " . $_GET["server"] . " " . $_GET["domain"]); }else{echo "malformed domain name";}?>
这里对于domain的内容进行了很多匹配,要求将这里的domain:
满足一下条件: 以- 或字母数字为域名主体,点号后要有域名后缀,例如: a[cdefgilmnoqrstuwxz]:匹配.ac、.ad、.ae等(以 a 开头的国家域名) b[abdefghijmnorstvwyz]:匹配.ba、.bb、.bd等(以 b 开头的国家域名) c[acdfghiklmnoruvxyz]:匹配.ca、.cc、.cd等(以 c 开头的国家域名) 最后将大写转换为小写
按理说这里的特殊符号应该是要被过滤的,但是这里竟然直接就可以绕过,应该是有些问题. 感觉应该将server中拼接命令,实现命令注入,但是这里可以直接通过domain参数进行注入,得到flag:;ls /
;cat /flag
;whoami
pass06
和pass05一样,改为post
HDR-1
hdr-1
源码是这样的
通过分析源码我们发现这里应该是获取cookie中的template的值,然后将其拼接到dirname函数里面,这个函数的意思是:以字符串的方式返回当前目录:不过这里的话使用dirname(__FILE__)
获取目录应该更合适,还有array_key_exists函数的使用应该是:array_key_exists('TEMPLATE', $_COOKIE)
,否则会一直使用默认的模板,blue.php这道题有点问题
LFI-01-14
pass01
这里是个文件包含,看看源码有没有进行什么过滤的操作:
对源码进行一个分析,,可以看出这里是直接对一个page参数代入函数include,看来没有什么限制,于是就可将文件路径直接代入函数:
目录穿越:page=../../../../etc/passwd
得到flag:page=../../../../flag
pass02
看看源码:
这里是一个get方法将得到的参数进行一个后缀的添加php,也就是只能执行php文件了
想法是仍然采用目录穿越,使用../../的方式,不知道有没有这里我们提前在本地建好一个test.php文件,可以试试
../../../../test
这样呢就包含好了test,php文件,执行了test文件的内容
pass03
看看源码吧
可以看到这里是将输入参数的最后四位进行一个检验,是否是.php文件,如果不是的话就可以成功包含,这里可以是一句话木马,也可以是是图片马等,都会被解析为php文件,这里我们和上一关一样,包含test文件:使用大小写进行绕过:
这里的解法一般有以下几种思路:
-
使用大小写绕过 Php pHp等
-
空格绕过:php->php<空格>,这个得抓包后在hex中修改
-
加点饶工:php->php.
-
特殊字符绕过:php->php::$DATA
-
使用'.ph<'进使用'.ph<'进行
.php
拓展过滤渗出行.php
拓展过滤渗出 -
使用%00进行截断绕过
pass04
看看源码:
这里是对get到的参数进行一个转义的操作,将特殊符号(预定义的单双引号,空值以及反斜杠)前面加一个反斜杠,最后处理完之后添加.php,当成php文件进行解析
但是这里仍然可以使用目录穿越,../../../../../test
pass05
看看源码:
这里的源码给了提示说这里将../进行了一个处理,被删除并且/
不会被当做路径符号,而是会被加密为%2f,这里实际上可以使用双写进行绕过从而绕过str_replace函数的检验,并且这里直接包含文件名,不对文件内容进行一个检验,因此可以使用双写进行校验绕过:
....//....//....//test.php
pass06
第六关是一个post类型的传参,同样是无过滤
pass07
这里将路径末尾进行一个字符串拼接,直接拼接php,并且无过滤
pass08
看看源码
这里是对文件后缀进行了一个检验,要求不能是.php文件,于是这里可以使用php.来进行一个绕过FILE=../../../test.php.
pass09
与前面第四关相同
pass10
与第五关相似,使用双写绕过
pass11
这里看看源码是将真正的输入框隐藏起来,以此来达到混淆
这里就将另一个框输入路径:
这里将真正的参数进行了一个隐藏,给stylepath赋值好就可以了
pass12
上一题类似,方法为get方法
pass13
源码
这里是将文件名进行../替换,仍然是使用双写进行绕过
....//....//....//test.php
pass14
13关的post版本