0%

XXE危害说明

XXE就是XML外部实体注入。

由于服务端未对提交的xml的数据中引入外部实体做必要的处理,而在外部实体中引入php伪协议从而造成的攻击。

当允许引用外部实体时,通过构造恶意内容,可导致

  • 读取任意文件
  • 探测内网端口
  • 攻击内网网站
  • 执行系统命令

漏洞环境说明

PHP环境低于5.5使用此代码测试

1
2
3
4
5
6
7
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);

# 不需要回显时 注释print($xml);
print($xml);
?>

PHP环境大于等于5.5使用此代码测试

1
2
3
4
5
6
7
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOENT);

# 不需要回显时 注释print($xml);
print($xml);
?>
阅读全文 »

漏洞特征:

  • redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
  • 没有设置密码认证(一般为空),可以免密码远程登录redis服务。 

漏洞危害:

  • 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
  • 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
  • 最严重的情况,如果Redisroot身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

影响版本:

Redis 2.x,3.x,4.x,5.x

漏洞复现:

环境搭建:

下载并安装测试用的Redis,本次采用的是Centos7镜像:

1
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
阅读全文 »

什么是UDF库

UDF即用户自定义函数。是通过添加新函数,对MYSQL的功能进行补充,就像使用本地MYSQL函数user()concat()等。

UDF提权步骤

查看secure_file_priv的值

secure_file_priv 是用来限制 load dumpfileinto  outfileload_file() 函数在哪个目录下拥有上传或者读取文件的权限:

使用命令show global variables like 'secure%'

1
2
3
4
5
6
7
8
mysql> show global variables like 'secure%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_auth | OFF |
| secure_file_priv | NULL |
+------------------+-------+
2 rows in set (0.00 sec)
  • secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
  • secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在/tmp/ 目录下,此时也无法提权
  • secure_file_priv的值没有具体值时,表示不对 mysqld的导入|导出做限制,此时可提权

secure_file_priv的值在MySQL数据库的安装目录的 my.ini 文件中配置:
tp2020111501.png

查看系统架构以及plugin目录

阅读全文 »

PHP中的正则表达式

在php中,有两套正则表达式函数库,两者功能相似、知识执行效率略有差异:

  • PCRE库提供,使用preg_为前缀命名的函数
  • POSIX扩展提供的。使用以ereg_为前缀命名的函数

PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。

PCRE语法支持更多特性,比POSIX语法更强大。

与Perl语言兼容的正则表达式处理函数

函数名 功能描述
preg_match() 进行正则表达式匹配
preg_match_all() 进行全局正则表达式匹配
preg_replace() 执行正则表达式的搜索和替换
preg_split() 用正则表达式分割字符串
preg_grep() 返回与模式匹配的数组单元
preg_replace_callback 用回调函数执行正则表达式的搜索和替换

正则表达式语法规则

正则表达式作为一个匹配的模板,是由原子(普通字符,例如字符a到z)、特殊字符(元字符,例如*、+和?等)、以及模式修正符三部分组成的匹配模板。

定界符

阅读全文 »

什么是字符串

在C语言中字符串是作为字节数组处理的。在Java语言中字符串是作为对象处理的。而php则把字符串作为基本数据类型来处理。通常对字符串的处理涉及字符串的格式化。字符串的分割和连接、字符串的比较、以及字符串的查找、匹配和替换。

常用的字符串输出函数

常规输出字符串

  • echo():输出字符串
  • print():输出一个字符串
    1
    2
    3
    4
    5
    6
    $array = [1,2,3];
    $string = "123";
    //echo $array;
    echo $string;
    //print($array);
    print($string);
    echo()print()都只能输出字符串,而不能输出数组

    输出字符串并退出程序

    die()和exit():输出一个字符串后退出程序
    1
    2
    3
    4
    $string = "123";
    //die($string);
    exit($string);
    echo "我不会运行";
    die()exit()同样都只能输出字符串,而不能输出数组

    格式化输出字符串

    字符串转换格式:
格式 作用
%% 返回百分比符号
%b 二进制数
%c 依照ASCII值的字符
%d 带符号十进制数
%e 可续计数法(如1.5e3)
%u 无符号十进制数
%f或%F 浮点数
%o 八进制数
%s 字符串
%x或%X 十六进制数
  • printf():输出格式化字符串
  • sprintf():把格式化的字符串写入一个变量中

printf()sprintf()都是格式化输出字符串,区别在于sprintf()可以把格式化的字符串写入到一个变量中

1
2
3
printf("我是%s","test");    //输出我是test
$aa = sprintf("我是%s","test");
echo $aa; //输出我是test

常用的字符串格式化函数

阅读全文 »

数组的概述

PHP中的数组实际上是一个有序图。图是一种把 values 映射到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组来使用,或列表(矢量),散列表(是图的一种实现),字典,集合,队列以及更多可能性。因为可以用另一个 PHP 数组作为值,也可以很容易地模拟树。

  • 数组下标:可以视为资料内容在此数组中的识别名称,通常被称为数组下标。
  • 索引值为数值时,也代表此资料内容在数组中的储存位置。
  • 数组中有几个索引值就被称为几维数组。
  • 数据分类:在PHP中有两种数组,索引数组关联数组
    • 索引(indexed)数组的索引值是整数,以0开始。当通过位置来标识东西时用索引数组。
    • 关联(associative)数组以字符串做为索引值,关联数组更像操作表。索引值为列名,用于访问列的数据。

数组的定义

由于 PHP 是属于弱类型数据,因此源代码中的数组并不需要经过特别的声明操作,直接将一组数值指定给某一数组元素即可。一般情况下数组的赋值有三种方式:

  • 直接赋值方式如:
    1
    2
    $a[0]='spam@126.com';  
    $a[1]='abuse@sohu.com';
  • 使用array函数如:
    1
    $a=array("spam@126.com","abuse@sohu.com");
  • 使用[]如:
    1
    $a=["spam@126.com","abuse@sohu.com"];

    直接赋值的方式声明数组

    基本格式:$数组变量名[索引值]=资料内容

其中索引值(下标)可以是一个字符串或一个整数。等价于整数(不以0开头)的字符串值被当作整数对待。因此,数组$array[3]$array['3']是引用相同的元素。但是$array['03']引用的另外不同的元素。

示例1:

分别定义两个数组$a$b,看看区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$a[0]=1;
$a[1]=2;
$a[2]=3;

$b[]=1; //不定义下标默认从0开始
$b[]=2;
$b[]=3;
$b[6]=4; //定义下标为6的值
$b[]=5; //后面的顺延下标为7

var_dump($a);
echo "<br>---------------<br>";
var_dump($b);
?>
阅读全文 »

当有一个很大的集团目标时,一般的信息搜集流程如下:

集团结构:

主要提取出历史网站备案,域名、子公司域名、备案号、注册邮箱(邮箱@后的也可能是域名)、手机号。

备案号查同备案的网站

主域名中的跳转链接、JS中的链接搜集

集团结构信息搜集后一般会得到主域名,也就是官网信息,可能有很多跳转链接,也属于他的资产,包括JS中的链接。推荐使用这个工具进行提取:

深挖更多IP资产:

阅读全文 »

函数的定义

函数function是一段完成指定任务的已命名代码块。函数可以遵照给它的一组值或参数完成特定的任务,并且可能返回一个值。在PHP中有两种函数:自定义函数与系统函数

函数的优点:

  • 控制程序设计的复杂性
  • 提高软件的可靠性
  • 提高软件的开发效率
  • 提高软件的可维护性
  • 提高程序的重用性

自定义函数

自定义函数语法格式:

1
2
3
4
function  函数名称([参数1 [,参数2 [,…]]]){
程序内容叙述(也叫函数体);
[return 返回值;] //如需函数有返回值时使用
}

函数的使用:

1
函数名称([参数1 [,参数2 [,…]]]);

自定义函数的名称:

阅读全文 »

流程控制概述

  • 任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,甚至一个什么也不做的(空语句)条件语句。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。
  • 在任何一门程序设计语言中,都需要支持满足程序结构化所需要的三种基本结构:
    • 顺序结构
    • 分支结构(选择结构)
    • 循环结构

分支结构

单一条件分支结构(if)

当条件表达式的值为真true时,PHP将执行语句组,相反条件表达式的值为假false时,PHP将不执行语句组,忽略语句组执行下面的语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$a=5;
$b=3;
if ($a > $b)
echo "a > b"; //如果变量a的值大于b的值则会输出:a大于b

$x=10;
$y=20;
if($x<$y){ //判断是否x小于y。多条语句需要使用{ }括起来。
$t=$x;
$x=$y;
$y=$t;
}
var_dump($x>$y); //输出:bool(true)
?>

双向条件分支结构(else从句)

if-else 条件判断与 if 条件判断类似,所不同的是,if-else
句的条件表达式值为真true时,会执行 if 的本体语句语句组1
而条件表达式值为假false时,则执行 else 的本体语句语句组2

image

1
2
3
4
5
if(false){  // 真区间
echo 1;
} else { // 假区间
echo 2;
}
阅读全文 »

PHP语言标记

  • <?php开始?>结束标记是标准风格,这是PHP推荐使用的标记风格。
  • <script language="php">开始和</script>结束是长风格标记,这种标记最长,总是可用的,但我们并不常用。
  • <?开始和以?>结束标记是简短风格的标记,是最简单的,但是系统管理员偶尔会禁用掉它,因为它会干扰XML文档的声明。只用通过php.ini配置文件中的指令short_open_tag打开后就可以使用。
  • <%开始和以%>结束标记是ASP风格的标记,可以在php.ini配置文件设定中启用了asp_tags选项就可以使用它(默认是禁用的),习惯了ASP风格的可以使用它。

PHP程序注释

PHP支持C、C++和Shell脚本风格的注释,如下:

1
2
3
//... ...	单行注释
/* ... ... */ 多行注释 (注意:不能嵌套)
# ... ... 脚本注释

PHP中的运算符

运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。所以可以认为函数或任何会返回一个值(例如 print)的结构是运算符,而那些没有返回值的(例如 echo)是别的东西。

有三种类型的运算符:

  • 一元运算符:只运算一个值,例如 !(取反运算符)或 ++(加一运算符)。
  • 二元运算符:有两个操作数,PHP支持的大多数运算符都是这种。
  • 三元运算符? :。它应该被用来根据一个表达式在另两个表达式中选择一个,而不是用来在两个语句或者程序路线中选择。把整个三元表达式放在扩号里是个很好的主意。

算术运算符

阅读全文 »