Notes Site.
post @ 2023-07-30

Mysql Injections

前置

Web

  • Spaces:如果未编码,可能表示请求数据的结束
  • &: 解释为参数分隔符
  • #: 解释为片段标识符

GET请求#-- ? (?可以为任意字符) 表示注释,可以使它们后面的语句不被执行,可以使用--%20,把空格转换为urlcode编码格式,同理把#变成%23,也可以注释

POST请求#--?都能注释后面的语句

schema结构:

  • information_schema.schemata:记录数据库信息的表
  • information_schema.tables:记录表名信息的表
  • information_schema.columns:记录列名信息的表
  • schema_name:数据库名
  • table_name:表名
  • column_name:列名
  • table_schema:表的数据库名

联合注入

可以使用 union 语句,且有回显位

Read More
post @ 2023-06-30

Php Unserialize

序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class S{
public $test="pikachu";
}
$s=new S(); # 创建一个对象
echo serialize($s); # 把这个对象进行序列化

序列化后得到的结果是这个样子的:
O:1:"S":1:{s:4:"test";s:7:"pikachu";}

O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值

privateprotected 详解

PHP序列化的时候 private 和 protected 变量会引入不可见字符%00,
%00类名%00属性名 为private,%00*%00属性名 为protected,注意这两个 %00就是 ascii 码为0 的字符。

这个字符显示和输出可能看不到,甚至导致截断,但是url编码后就可以看得清楚.我们可以将序列化的字符用urlencode编码之后,打印出来查看。

魔术方法

方法 触发条件 参数 返回值
__construct 实例化对象
__destruct 反序列化之后 销毁之后
__sleep 序列化之前 需要被序列化的成员属性
__wakeup 反序列化之前
__toString 把对象当成字符串使用
__invoke 把对象当成函数调用
__clone 当使用clone关键字拷贝完一个对象
__call 调用不存在的方法或者私有的属性 $arg1,$arg2 不存在的方法名称&参数
__callStatic 静态调用不存在的方法 $arg1,$arg2 不存在的方法名称&参数
__get 调用成员属性不存在 $arg1 不存在的成员属性名称
__set 给不存在的成员属性赋值 $arg1,$arg2 不存在的成员名称&值
__isset 对不可访问属性使用isset()或empty $arg1 不存在的成员属性名称
__unset 对不可访问属性使用unset() $arg1 不存在的成员属性名称

__wakeup()函数漏洞绕过原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就不会执行

反序列化逃逸

str_replace — 子字符串替换

str_replace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array

  • search

    查找的目标值,也就是 needle,一个数组可以指定多个目标。

  • replace

    search 的替换值,一个数组可以被用来指定多重替换

  • subject

    执行替换的数组或者字符串。也就是 haystack

    如果 subject 是一个数组,替换操作将遍历整个 subject,返回值也将是一个数组。

  • count

    如果被指定,它的值将被设置为替换发生的次数

返回值

该函数返回替换后的数组或者字符串。

Read More
⬆︎TOP