《Web安全基础》05. XSS · CSRF · SSRF · RCE · XXE
@
本系列侧重方法论,各工具只是实现目标的载体。
命令与工具只做简单介绍,其使用另见《安全工具录》。
靶场参考:XSS-Labs,pikachu,DVWS,XXE-Lab,WebGoat。
1:XSS
1.1:简介
XSS(Cross-Site Scripting),跨站脚本攻击。它允许攻击者向网页注入恶意脚本代码,然后在用户的浏览器上执行这些恶意脚本。
危害:
- 钓鱼欺骗
- 网站挂马
- 身份盗用
- 盗取网站用户信息
- 垃圾信息发送
- 劫持用户 Web 行为
- XSS 蠕虫
分类:
- 反射型(非持久型)
一般把可以执行的 js 代码放到 URL 里,可通过邮件诱导用户点击。
攻击过程:发包 h=123 -> x.php -> 返回浏览器执行。 - 存储型(持久型)
恶意代码被后台存储之后,用户打开相应页面的时候就会执行脚本。
攻击过程:发包 h=123 -> x.php -> 写到数据库 -> x.php -> 返回浏览器执行。 - DOM 型
攻击过程:发包 h=123 -> 本地浏览器静态前端代码 -> x.php -> 返回浏览器执行。
Webshell 后门中的后门:
通过在 webshell 程序中植入后门,形成 “ 黑吃黑 ”,用有后门的木马入侵的网站也可以被木马制造者利用。webshell 的后门就可以利用 XSS 实现。
1.2:防护与绕过
1.2.1:HttpOnly
HttpOnly:如果 HTTP 响应头中包含 HttpOnly 标志,只要浏览器支持,客户端脚本就无法访问 cookie。因此,即使存在 XSS 缺陷,且用户意外访问利用此漏洞的链接,浏览器也不会向第三方透露 cookie。
如果浏览器不支持 HttpOnly,浏览器会忽略 HttpOnly 标志,从而创建一个传统的,脚本可访问的 cookie。
HttpOnly 属性只能防止 cookie 被盗取,不能防止 xss 漏洞。
绕过 httponly:
- 若浏览器保存帐号密码:从浏览器读取帐号密码。
- 若浏览器未保存帐号密码:需要使用 xss 跳转登录地址,再利用表单劫持。
1.2.2:WAF 绕过
常规 WAF 绕过思路:
- 标签语法替换
- 特殊符号干扰
- 提交方式更改
- 垃圾数据溢出
- 加密解密算法
- 结合其他漏洞绕过
1.3:相关资源
XSS 平台:
https://xss.yt
webshell 收集:
https://github.com/tennc/webshell
工具 XSStrike:
https://github.com/s0md3v/XSStrike
工具 Xwaf:
https://github.com/3xp10it/xwaf
《关于 XSS 漏洞修复》:
https://www.cnblogs.com/baixiansheng/p/9001522.html
《绕过 XSS 检测机制》:
https://bbs.kanxue.com/thread-250852.htm
Fuzz 字典:
https://github.com/TheKingOfDuck/fuzzDicts
2:CSRF
CSRF,或 XSRF(Cross-Site Request Forgery),跨站请求伪造。利用用户已经通过身份验证的会话来执行未经用户许可的操作,通过欺骗用户在不知情的情况下执行恶意请求。
也被称为 “One Click Attack” 或 “Session Riding”。
XSS:利用用户对指定网站的信任。
CSRF:利用网站对用户网页浏览器的信任。
漏洞攻击两个条件:
- 用户登录受信任网站 A,并在本地生成 Cookie。
- 在不注销 A 的情况下,访问危险网站 B。
如果遇到 POST 型,则需要构造一个表单提交按钮欺骗用户点击。
防御方案:
- 当用户发送重要的请求时需要输入原始密码
- 设置随机 Token
- 检验 referer 来源
- 设置验证码
3:SSRF
SSRF(Server-Side Request Forgery),服务器端请求伪造。攻击者通过受害者服务器发起网络请求,从而操纵和滥用服务器的资源,甚至访问服务器相关的内网。
SSRF 攻击的目标一般是从外网无法访问的内部系统。
SSRF 形成的原因大都是服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
SSRF 利用手段:
- 可以对外网、内网、本地进行端口扫描
- 攻击运行在内网或本地的有漏洞程序(比如溢出)
- 可以对内网 Web 应用进行指纹识别(通过请求默认的文件得到特定的指纹)
- 使用 file:/// 协议或其他协议读取本地文件
参考资料:
《SSRF漏洞(原理&绕过姿势)》:
https://www.t00ls.com/articles-41070.html
4:RCE
RCE(Remote Command/Code Execution),远程命令/代码执行。指攻击者能够成功地在远程目标计算机上执行自己的恶意代码或命令。
出现这种漏洞,一般是因为应用从设计上需要给用户提供远程命令操作的接口。
危害:
- 可能导致系统被完全控制
- 窃取敏感数据
- 修改文件
- 操纵系统配置
参考资料:
《PHP远程代码执行漏洞复现(CVE-2019-11043)》:
http://blog.leanote.com/post/snowming/9da184ef24bd
5:XXE
5.1:基本概念
5.1.1:XML
XML(Extensible Markup Language,可拓展标记语言),是用于存储和传输数据的标记语言。
- 标记:可用一系列的标签来对数据进行描述。
- 拓展:用户可以自己定义标签。
HTML 也是标记语言。
XML 与 HTML 的区别:
- HTML 被设计用来显示数据。
- XML 被设计用来传输和存储数据。
XML 作用:
- 作为数据传输的标准。
可读性强,易于维护,易于扩展,与代码无关。 - 作为配置文件。
可以方便快捷的修改软件或框架的功能。 - 持久化数据。
可作为临时的小型数据库。
XML 文档结构:
- XML 声明
- DTD 文档类型定义(可选)
- 文档元素
- 数据内容
示例,表示书籍的信息:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book>
<title>XML Basics</title>
<author>John Doe</author>
<price>29.99</price>
</book>
<book>
<title>Web Development with XML</title>
<author>Jane Smith</author>
<price>39.95</price>
</book>
</bookstore>
5.1.2:DTD
DTD(Document Type Definition,文档类型定义),用于定义 XML 文档结构和验证 XML 文档合法性的规范。
DTD 指定了 XML 文档中可以包含哪些元素、元素的顺序、元素的数据类型以及其他结构相关的信息。
DTD 可声明于 XML 文档中,也可作为一个外部引用。
示例:
<!--XML 声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档时 note 类型的文档-->
<!ELEMENT note (to, from, heading, body)> <!--定义 note 元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义 to 元素为 "#PCDATA" 类型-->
<!ELEMENT from (#PCDATA)> <!--定义 from 元素为 "#PCDATA" 类型-->
<!ELEMENT heading (#PCDATA)> <!--定义 heading 元素为 "#PCDATA" 类型-->
<!ELEMENT body (#PCDATA)> <!--定义 body 元素为 "#PCDATA" 类型-->
]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<heading>Reminder</heading>
<body>You are a good man</body>
</note>
5.1.3:实体
Entity(实体)是 XML 文档中的一种结构元素,用于定义和引用可重用的文本片段或数据块。
实体可以理解为变量,必须在 DTD 中定义申明,可以在文档中的其他位置引用该变量的值。
按类型分类:
- 内置实体(Built-in entities)
- 字符实体(Character entities)
- 通用实体(General entities)
- 参数实体(Parameter entities)
按引用方式分类:
- 内部实体(Internal Entity):
在 XML 文档内部定义。 - 外部实体(External Entity):
在 XML 文档外部定义的,可以通过系统标识符引用外部资源(如文件路径或URL)。
示例:
- 内部实体
内部实体的定义使用 <!ENTITY>
声明,如下所示:
<!--entityName 是实体名称,entityValue 是实体的值。-->
<!ENTITY entityName "entityValue">
引用内部实体时,使用 &entityName;
的语法。
- 外部实体:
外部实体通常用于引用包含大量数据或配置信息的外部文件。
外部实体的定义如下所示:
<!--entityName 是实体名称,systemIdentifier 是指向外部资源的标识符(文件路径或 URL)-->
<!ENTITY entityName SYSTEM "systemIdentifier">
- XML文档示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
<!ELEMENT example ANY>
<!ENTITY internalEntity "This is an internal entity.">
<!ENTITY externalEntity SYSTEM "https://www.example.com/data.txt">
]>
<example>
<data>
Internal Entity: &internalEntity;
</data>
<external-data>
External Entity: &externalEntity;
</external-data>
</example>
5.2:XXE
XXE(XML External Entity Injection,XML 外部实体注入),应用程序解析用户返回的 XML 数据时,没有禁止外部实体的加载,导致攻击者可以在 XML 文档中引入恶意的外部实体进行攻击。
漏洞发现:
- 扫描工具。
- 检测所有 XML 输入点。
- BurpSuite 抓取数据包查询关键字。
Content-Type:text/xml 或 application/xml。
如果没有也可以手动修改,并将数据更改为 XXE 语句看回显。
因为数据包中虽然没有写接收信息类型,但是不一定不存在。
基本检测:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY words "Hello XXE!">
]>
<root>&words;</root>
若数据包或页面中存在 “ Hello XXE ” 字样,则表明实体被解析。
检测是否支持 DTD 引用外部实体:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY % name SYSTEM "http://localhost/test.xml">
%name;
]>
通过查看自己服务器上的日志判断,看目标服务器是否向自己的服务器发了一条请求。如果发送了请求说明很可能存在 XXE。
通用利用方法之读取文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<name>&xxe;</name>
</root>
过滤绕过:
- 对于 ENTITY、SYSTEM、file 等关键字过滤,可以采用 UTF-16BE 编码格式绕过。
- 若 Http 协议被过滤可采用其他协议绕过。
- 综合利用工具。
- Fuzz 测试。
漏洞修复与防御方案:
- 方案一:禁用外部实体。
- 方案二:过滤用户提交的 XML 数据,过滤关键词。
5.3:相关资源
《XML基础(只管能看懂XML文件)》:
https://blog.csdn.net/lalala_dxf/article/details/121034427
《XML教程(一文彻底搞懂XML)》:
https://blog.csdn.net/m0_58859743/article/details/125113744
《DTD语法(元素、属性、实体声明)》:
https://blog.csdn.net/treblez/article/details/102069499
《CTF-XXE》:
https://www.cnblogs.com/20175211lyz/p/11413335.html
《XXE知识总结,有这篇就够了》:
https://blog.csdn.net/weixin_44420143/article/details/118721145
《XXEinjector:一款功能强大的自动化XXE注射工具》:
https://www.cnblogs.com/bmjoker/p/9614990.html
XXEinjector:
https://github.com/enjoiz/XXEinjector
明月直入,无心可猜。
——《独漉篇》(唐)李白