近日对某网站进行了一次简单渗透,让我想起了不久之前发生的一次”小事件”;
" s8 |3 F# J" Z% W1 ]6 `$ }
* Q. A, q F3 N1 B 拿出来和大家分享希望能对提高大家的安全开发意识有所帮助" k2 s9 r% F: w8 v. m+ K: q
3 g( |" O) R1 e) I3 l/ o2 \ 事件回放:一个页面提供下载功能
3 H4 l" V; L3 E
7 ?, f2 r6 M3 Q5 @1 y5 Q! k 结果是:程序bug导致下载服务器上的任意文件。% X; H1 O, o7 [) W$ f: i! x. ^
, Q3 k7 k8 C- i/ Q2 J) F& d 可能你会觉得下载了也没有用,因为我只开放了80端口,甚至还有负载均衡挡在外面,下载一个密码文件也没什么,但实际这是一个相当危险的问题。
5 q7 \) b- R' _ ) e. v5 Q' W4 _4 f# W- r! q$ a2 Y4 |
以下是一些原理性的假设,其中一些细节是基于实际渗透的。仅供学习和交流,和给大家提个醒。
, ]' n' X2 h% v* O 8 s9 o" T [: T9 U' k) h4 P
记得当时是这样的,有一个页面提供了活动相关mp3下载功能,结果被一些“细心”的朋友发现了其中的问题,并及时予以通知,这才进行了修补% Q" g8 N' c; H$ S% P
0 b! i& _4 C9 F4 S" @& E
其实原理很简单也很常见,和当年iis上出的那个目录遍历漏洞是一样的,就是提供下载功能的jsp文件将文件名作为参数传入,类似于:down.jsp?FileName=song.mp3,在浏览器地址栏提交后就能得到song.mp3这个文件了。
6 _/ n: @% |" |
+ U+ f! r' u" a7 Y* b5 ]& m/ v 接下来,做一下简单的修改,将地址栏的参数改为如下样子:down.jsp?FileName=../../../../../song.mp3
8 w1 ]5 {( X; y3 b- R& C / p2 i8 J8 m: }: \
由于这个目录下的文件根本不存在,如果程序处理的够好,包住了异常,那么就会返回一个0字节文件,这样看来不会出现问题,但是我们继续修改参数:down.jsp?FileName=../../../../../etc/hosts; n( Q" F, w; c+ N
' \$ H& w- k( b& y 猜猜看会怎么样?有两种可能9 y8 i2 x2 J' h$ O& M$ o$ G
3 @! L& p5 k, ]
1.返回的仍然是空0 P7 S1 s$ F& L
: n) M% h# h7 X0 y/ ?1 W/ n
原因:8 [+ O& g; }% y/ O$ _! ~8 p
6 \3 `/ y4 ]% u
a.文件不存在,也就是目录不对,那么需要再次尝试:down.jsp?FileName=../../../../../../etc/hosts;在增加一个“../”,直到找到文件: f/ d6 `; h& J2 w3 m5 d6 J
' h1 a' x7 b" J# z6 G" f. U
b.找到了文件,但是没有权限读取,但是很不幸,我见到过的类似问题都是能顺利读取的,而且能读取的远远不止这个文件
1 ~7 M1 r( b2 K6 C/ O ) D. s- s' W# Y U; N( P
2.返回了hosts文件( T; y2 G: N7 {1 q+ @2 g
# M) h* @5 a0 `2 a8 b/ g1 W bingo,如果顺利返回hosts文件,那么就可以更近一步渗透了。: {: e4 Z$ { m0 X) j0 {! G$ z% }! [
5 k, _' Z# n( q# B2 S
可能你会想,就是个hosts么,没什么。
q9 H( _4 V, i& H3 M6 `
4 j4 `2 X0 D6 y" ]- Z9 G 好了,下一步,我把地址改为如下内容:down.jsp?FileName=../../../../../etc/gshadow( _! l8 _+ t7 t! P, p* U
/ N! i& k& V7 e: r0 K
于是获得文件,类似如下内容) ]$ L* r3 F v
; T$ s' m" O% q- F: a1 l
bin:x:1:root,bin,daemon7 ?( ?! {( s5 ]
& O _6 ~4 V0 c+ @( u3 }3 p
daemon:x:2:root,bin,daemon
1 I0 v* z9 @: L1 v0 n3 T7 o 4 `7 v6 m0 }+ j+ T/ { r& V. `
sys:x:3:root,bin,adm7 h( p- }5 \4 t4 X7 r
2 w8 `% p8 k* D4 I
…….; W" J2 `) a& d3 K" P/ {7 A, q' S, T* v
8 ~; k0 J/ k1 x- S( Y$ W
***:***:/home/dmtsai:/bin/bash. U( a ]# I. w7 F) }
( H! E8 W# H8 s6 Z* S* F 好了,这样我就获得了该系统中所有的用户名,也就是例子中/home/dmtsai:/bin/bash的dmtsai+ U# D c2 G3 X) I; s$ A
/ |( b: I+ j! ^* A) [6 H% x& o- [0 P; ? 当然一个系统中可能会有很多用户,当然也会全部列出来,! t- D) b, _6 e) ^9 G% r N) r
- _4 b. a& K$ S8 _( ?) p/ i8 `; [
好了接下来做一件比较恐怖的事情/ O% p8 S0 ]( N8 g1 U" V- {
7 D8 q. P5 J, |# ?2 O4 ~4 l5 p
也是最核心的,将地址栏改为如下内容:down.jsp?FileName=../../../../../home/dmtsai/.bash_history. C6 H/ l1 x% i
* a4 Q4 m; r; U* U/ e+ f, X
这下我就等于拿到了这台机器上的命令行历史记录! ?! A" [6 W& _) s, D
# y: y: I. N/ }, h/ x
类 似于vi,ftp,cd /***,rm ***,等等,甚至是mysql的数据库连接命令,还有一些Python脚本,这些记录全部拿到,因为是web服务器,也就很容易可以拿到你的web目录,以及其中的关键东西,如果用的struts,那么定位到你的web目录,那么好了,struts-config文件有了,web.xml有了,然后数据库配置文件也有了,log配置文件也有了。那么这意味着什么呢,你的整套网站的jsp源文件会被下载,或许这并不能拿到服务器的权限,但是很大程度为黑客提供了一次深度接触我们的机会,这是十分危险的!3 `$ A7 c" }. D0 J- h
; J/ U1 }" H; \
接下来就可以分析从服务器上获得的资料,准备进一步渗透了。可能通过对jsp文件的分析,你可以拿到上传的权限,这样会使问题更加恶化。
3 w# n8 F6 H/ b3 [, z g' r$ h1 m' T4 ^$ G" E6 D0 n
所以在日常开发中,这种文件下载的功能要慎之又慎,有可能一个疏忽就导致你的服务器遭到渗透
+ I" H, [; b# x+ D' P: u
2 ?$ T E9 I8 Y/ N9 @3 Y# t 以下是一些总结:, p( w8 T9 n x5 L. g5 Q! O
3 C( B& [- P7 @3 [: k' q6 q
1. 在做开发中,如果有下载功能,请不要将客户端提交的文件名直接用来去取文件,这是很大意很危险的行为。建议定义好type类型,然后通过传递type,来取得相应的文件,如:aa对应song1.mp3;bb对应song2.mp3。而且文件所在的根目录最好能固化在程序中,或者写在配置文件中
6 y8 e. j1 p* j0 R( p! o
9 o/ @: R) Y4 u9 \; `* n/ ?6 W 2.用户提交的数据都是不可信的,需要我们层层筛选,这其中合法性验证很必要,不是简单的数字判断,文件名判断之类的就行了的,至少要考虑两方面,
) M/ t5 K- y( u- C: ]
1 r- t+ p5 B$ p2 ~2 x a.是否是未经处理就返回给用户(此处问题最近就发生过,还好已经及时修复)
+ m4 o# d+ Y7 d+ ^6 [ / v0 Y4 ^* p" O4 K9 U5 r
b.是否未经处理就将参数传入到逻辑模块去执行了+ g) Z6 H$ `8 {; }8 [7 p
" P& `/ D% s3 w. A$ m2 x) ]1 D
a点的危害是我们常见的xss,用户提交恶意的代码,结果未做判断就扔回去。
2 n$ b0 P) N! @) x8 t - W9 V$ D* o5 N, m( |
b 点的危害就无法估量了,这取决于你的代码逻辑,如果它功能够强大,那么黑客获得东西也就越大,损失也就越大。所以对于用户提交的数据要十分谨慎,因为我们的程序不只是要能够运行,还必须要健康的运行。其实完全可以把用户的提交数据看作是定时炸弹,不要犯懒,嫌麻烦,存在侥幸心理,觉得用户可能不会发现,要知道面对几千万的用户,哪怕概率只有千万分之1,那也是恐怖的。. o( h' r- e$ @9 L$ ^/ L
+ R1 C$ c o" B" I% P
3.即使是只开放80端口,一样可以进行渗透,这时不管有没有防火墙什么的都没有用,因为这是通过正常的访问获得的,也就是说只要程序有bug,那么再强的防御也无济于事,这其实是一种简单的穿透手段,利用程序bug来穿透,获得敏感数据。& A% b* ]/ A7 K5 M4 _3 {
6 R9 C v# B2 H5 K6 C, ~ x
5.web服务器启动者的权限问题,如果web服务器的权限很低,那么我什么也拿不到,或者拿到很少的东西。同样如果启动者的权限过高,拿到的文件也就越多,万一从对jsp文件的分析中发现了上传方面的bug,那就真的是不堪设想) P# G/ S% t: d& s% @ L o9 C2 e, g. u
2 H6 G3 Q- c$ r: Z. D 6.要下载的文件最好单独存放,并且以静态方式下载,这样可以将风险降到最低,甚至是0风险
6 M# E/ r2 F) V* s1 G) C
' M7 `+ Z% R! }, \ 7.还有很多,大家自己根据需要自己理解吧 |