# 黑名单绕过
```php
assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号)
```
以上函数可以执行命令,尝试黑名单绕过
# LD_PRELOAD
> 在 UNIX 的动态链接库的世界中,LD_PRELOAD 是一个有趣的环境变量,它可以影响程序运行时的链接,它允许你定义在程序运行前优先加
# 命名空间概述
参照PHP手册
https://www.php.net/manual/zh/language.namespaces.rationale.php
>(PHP 5 >= 5.3.0, PHP 7)
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。
命令注入/代码注入绕过是CTF中相当有趣的一个话题,学习了几位师傅的博客,总结一下
# 问题开始
借鉴p神的问题--->`构造不使用数字和字母的webshell`
源码:
```php
echo"!"^"@";
a
php > echo"a"^"@";
!
php > echo"!"^"a";
@
```
可见,`a`这个字符可由`!`和`@`异或获取到
这里需要补充一个定律
> 若存在
php中存在弱类型,本质是当把不同类型的数据做处理的时候会发生强制类型转换,
我们可以利用这个特性,构造一些奇妙的用法
# 数字
```php
('>'>'<')+('>'>'<')==2
```
`>`在和`<`比较的时候会进行强制类型转换,`('>'>'<')`结果成为
`True`,在两个`True`相加的时候会强制类型转换为1,就成了1+1,
所以结果为2
# 字符
字符串还可以用!操作符来进行布尔类型的转换,以下为例
```php
php > var_dump(!@a);
bool(false)
php > var_dump(!!@a);
bool(true)
```
这样我们又获得了0,1两个数字,可以通过`chr()`和`trim`转换为字符
我
# 危险函数
## 代码执行:
- eval
- preg_replace+/e
- assert
- call_user_func
- call_user_func_array
- create_function
##文件读取:
- file_get_contents
- highlight_file
- fopen
- read file
- fread
- fget
# 变长参数
5.6新引入的特性
**类似于Python中的**kwargs**
[PHP官方文档](http://php.net/manual/zh/migration56.new-features.php)
> 在之前的 PHP 版本中, 必须使用静态值来定义常量,声明属性以及指定函数参数默认值。 现在你可以使用包括数值、字符串字面量以及其他常量在内的数值表达式来 定义常量、声明属性以及设置