问题:XMLDecoder注入
针对
xml
解码器的注入攻击
反序列化用户控制的
XML
,程序没有进行验证, 会让攻击者有机会在服务器上执行恶意代
码。
例:下面代码片段中,
XMLDecoder
处理不可信的输入。
...
XMLDecoder decoder = new XMLDecoder(new InputSource(new
InputStreamReader(request.getInputStream(), "UTF-8")));
Object object = decoder.readObject();
decoder.close();
...
如果输入以下
XML
文档,会实例化
ProcessBuilder
对象,并调用其静态
start()
方法以运行
Windows
计算器。
<java>
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1" >
<void index="0">
<string>c:\\windows\\system32\\calc.exe</string>
</void>
</array>
<void method="start"/>
</object>
</java>
修复:XMLDecoder注入
尽量避免将
XMLDecoder
与由用户控制的数据一起使用。如程序中不能避免,需要验证输入的
XML
。
问题:LDAP 注入
LDAP
,轻量目录访问协议
|dn :
一条记录的位置
|
dc :
一条记录所属区域
|
|ou :
一条记录所属组织
|
|cn/uid:
一条记录的名字
/ID|
此处我更喜欢把
LDAP
和 数据库类比起来,我是直接把
LDAP
看成是一个主要用于查询的数据库。
数据库用
“
表
”
来存数据,
LDAP
用
“
树
”
来存数据。数据库主要是三个
DB,TABLE,ROW
来定位一条记录,而
LDAP
首先要说明是哪一棵树
dc
,然后是从树根到目的所经过的所有
“
分叉
”
,
ou
(
group
),最后就是目标的名
字,例如
UID
等等。
具体到如何定义如下:
dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=waibo,dc=com
其中树根是
dc=waibo,dc=com
,分叉
ou=bei,ou=xi,ou=dong
,目标
cn=honglv
注意要把
“cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org”
看成是一个整体,它只是属性
dn
的
值
具体的一条记录如下: