前面的代码将用于演示目的和解释我们的攻击原理。我们将前面的代码分成三个部分:
出于演示目的,我们将使用前面的带漏洞的代码。此外,我们将提交下列值作为发送邮件的参数:
表单发送的HTTP数据包:
从攻击者的角度来看,有许多额外的字段,可以被注入在邮件标题。更多信息见RFC 822。例如,CC(抄送)或者BCC(密送)允许攻击者插入更多的消息。
但要注意的是,我们在添加一个新的参数之前,我们必须增加一个换行符分隔每个字段。换行符的16进制值为"0x0A"。下面是一个demo code。
这里提示一下,直接配置php.ini原生的email功能可能不太好用,配置起来也麻烦,建议采用一些第三方的Email(WP就挺不错的)进行发送,这个模块已经把相关的交互和HTTP数据包的构造封装好了。
发送邮件后,增加了抄送的功能:
我们在from的参数加添加subject字段:
可以看到,原本的subject被注入语句覆盖了一部分内容,但是具体是覆盖还是附加和具体的PHP代码编写逻辑有关,因为现在CMS对Email发送的普通做法就是利用PHP进行HTTP/HTTPS数据包的构造,先在本地构造好数据包后,再想服务器发送。
所以不同的系统对email注入的效果会有所不同。
这里要注意的的,SMTP区分消息头部和消息主题是依据%0A%0A双换行符决定的。
发送邮件后,我们发现消息的消息体已经被修改了。
以上就是我在本地的PHP环境中模拟实验的结果,因为环境和程序代码处理逻辑的差异,可能在不同的环境下实验会有差异,我的经验是根据不同的PHP CMS系统的Email源代码进行分析,理清发送Email数据包的代码逻辑,有针对性的进行email 注入。
1. 永远不要信任用户的输入字段。所有用户输入应该被认为是不可信的和潜在的恶意。应用程序不受信任的输入过程可能会变得容易受到诸如缓冲区溢出攻击、SQL注入,OS指令注入、拒绝服务和电子邮件注入。
2. 使用正则表达式来过滤用用户提交的数据。例如,我们可以在输入字符串中搜索(r 或 n)。
4. ModSecurity可以阻止服务器级别的电子邮件注入。利用ModSecurity,我们可以检测通过POST或GET提交的CC, BCC或目的地址,并且拒绝任何包含这些字母请求。
由于初学java,就去图书馆借了两本书,然后就照着书上流程一步步开始写java代码。我在D盘目录下AppletTest文件夹下建立了一个RollingMessage.txt文件,编辑代码如下
想在浏览器上实现它,但是尝试了很久都没有成功,也按照网上的介绍一步步的去设置了还是不成功。
然后发现发现还是不能正确显示,出现弹框
然后去设置安全性,控制面板→Java→安全。发现安全级别只有高和很高,没有中(从jdk 8版本开始安全级别就不设置中级别了)。
要想去实现它,就需要编辑例外站点了。
保存然后再用浏览器打开即得
写的有点啰嗦了,初学者请体谅。写在这里备忘。