CSRF-SSRF-XML-XXE
- 目录:
CSRF
XML 基础知识
XML 外部实体注入(XXE)
SSRF
CSRF
从新人角度来区分:
- XSS: 利用用户对站点的新人
- CSRF: 利用站点对已经认证用户的信任
常见攻击 方式:
结合社工在身份认证会话过程中实现攻击 修改账号密码、个人信息、(email、收货地址)发送伪造的业务请求(网银,购物,投票) 关注他人社交帐号,推送博文 在用户非自愿,不知情的情况下提交请求
业务逻辑漏洞
对关键操作缺少确认机制 自动扫描程序无法发现此类漏洞
漏洞利用条件
被害用户已经完成身份认证
新请求的提交不需要重新身份认证或确认机制
攻击者必须了解web app请求的参数构造
诱使客户触发攻击的指令
Burp suite CSRF PoC generator
Post / Get 方法
自动扫描程序检测CSRF漏洞方法
在请求和响应过程中检查是否存在anti-CSRF token
检测服务器是否验证anti-CSRF token
检测referrer头是否可以伪造
CSRF 漏洞防御
- Captcha
- anti-CSRF token
- Referrer头
- 降低会话超时时间
XML 简介
XML 指可扩展标记语言 (extensible Markup Language) 。
XML被设 计用来传输和存储数据。(HTML被设计用来显示数据。)
XML是-种很像HTML的标记语言。
XML标签没有被预定义。需要自行定义标签。
XML被设计为具有自我描述性。
Xml是W3C的推荐标准。
XML作用
- XML 把数据从HTML分离
- XML简化数据共享
- XML简化数据传输
- XML简化平台变更
XML树结构
XML文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。
XML文档使用简单的具有自我描述性的语法:
<?xml version="1.0" encoding="UTF-8"\?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第一行是XML声明。它定义XML的版本(1.O)和所使用的编码下一行描述文档的根元素<note>
接下来4行描述根的4个子元素(to, from, heading 以及body)最后一行定义根元素的结尾: </note>
- XML文档必须包含根元素。该元素是所有其他元素的父元素。XML文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。
- 所有的元素都可以有子元素。
- 父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。
- 所有的元素都可以有文本内容和属性(类似HTML中) 。
XML语法规则
1.XML文档必须有根元素
2.XML声明文件的可选部分,如果存在需要放在文档的第一行
<?xml version="1.0" encoding="utf-8"?>
3.所有的XML元素都必须有一个关闭标签
</>
4.XML 标签对大小写敏感
5.XML必须正确嵌套
6.XML属性值必须加引号
7.用实体引用来代替
"<"
等特殊字符在XML中,有5个预定义的实体引用:  (空格)  ;
< < less than <
> > greater than >
& & ampersand &
' ' apostrophe '
" " quotation mark "8.在XML中编写注释的语法与HTML的语法很相似。
9.在XML中,文档中的空格不会被删减。
XML元素
XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
一个元素可以包含:
- 其他元素
- 文本
- 属性
- 或混合以上所有...
XML命名规则
XML元素必须遵循以下命名规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母xml(或者XML、Xml等等)开始
- 名称不能包含空格
- 可使用任何名称,没有保留的字词。
命名习惯:
1.使名称具有描述性。使用下划线的名称也很不错:<first_name> ,<last_name>
2.名称应简短 和 简单,比如 : <book_title> ,而不是∶<the_title_of_the_book>。
3.避免"-"字符。如果按照这样的方式进行命名: "first-name",一些软件会认为想要从first里边减去name。
4.避免"."字符。如果按照这样的方式进行命名: "first.name",一些软件会认为"name"是对象"first"的属性。
5.避免":"字符。冒号会被转换为命名空间来使用。
6.xml文档经常有一个对应的数据库,其中的字段会对应xml文档中的元素。有一个实用的经验,即使用数据库的命名规则来命名xml文档中的元素.
7.在xml中,éoa等非英语字母是完全合法的,不过需要留意,软件供应商如不支持这些字符时可能出现的问题.
XML元素是可扩展的
PS:可以在不间断应用程序的情况下进行扩展
比如下面的
<note>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>
扩展为:
<note>
<date>2008-01-10</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
XML 属性
- XML元素具有属性,类似HTML。
- 属性(Attribute)提供有关元素的额外信息。
- XML属性必须加引号
- 属性值必须被引号包围,不过单引号和双引号均可使用。
person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
在第一个实例中,sex是一个属性。在第二个实例中,sex是一个元素。这两个实例都提供相同的信息。
XML 元素vs属性
在HTML 中,属性用起来很便利,但是在XML中,应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用元素吧
因使用属性而引起的一些问题:
- 属性不能包含多个值(元素可以)
- 属性不能包含树结构(元素可以)
- 属性不容易扩展(为未来的变化)
属性难以阅读和维护。请尽量使用元素 来描述数据。而仅仅使用属性来提供与数据无关的信息。
良好的XML文档
形式良好的XML文档拥有正确的语法。
在前面的章节描述的语法规则:
- XML文档必须有一个根元素
- XML元素都必须有一个关闭标签
- XML标签对大小写敏感
- XML元素必须被正确的嵌套
- XML属性值必须加引号
可以通过DTD或XML Schema (DTD的替代者)验证XML是合法的XML
DTD
DTD(文档类型定义)的作用是定义XML文档的合法构建模块。
DTD可被成行地声明于XML文档中,也可作为一个外部引用。
内部的DOCTYPE声明
假如DTD被包含在XML源文件中,它应当通过下面的语法包装在一个DOCTYPE声明中:
<?xml version="1.0"\?>
<!DOCTYPE note [ <!-- 在这里添加 -->
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]
<note>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>
外部文档声明
假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:
<!DOCTYPE root-element sYSTEM "filename">
这个XML文档和上面的XML文档相同,但是拥有一个外部的DTD:
<?xml version="1.0"\?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
这是包含DTD的"note.dtd"文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
为什么使用DTD
通过DTD,每一个XML文件均可携带一个有关其自身格式的描述。
通过DTD,独立的团体可一致地使用 某个标准的DTD来交换数据。
应用程序也可使用某个标准的DTD来验证从外部接收到的数据。
还可以使用DTD来验证自身的数据。
PCDATA
了解一下就好
PCDATA的意思是被解析的字符数据(parsed character data) 。可把字符数据想象为XML元素的开始标签与结束标签之间的文本。 PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。 文本中的标签会被当作标记来处理,而实体会被展开。 不过,被解析的字符数据不应当包含任何&、
<
或者>
字符;需要使用&、<以及>实体来分别替换它们。
CDATA
CDATA的意思是字符数据(character data) 。
CDATA是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
实体
如果在XML文档中需要频繁使用某一条数据,我们可以预先给这个数据起一个别名。即一个ENTITY,然后再在文档中调用它。
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。